Old 04-18-2012, 09:15 AM   #121
vocalid
Human being with feelings
 
vocalid's Avatar
 
Join Date: Sep 2009
Location: Middle of nowhere (where the cheese comes from)
Posts: 483
Default

Quote:
Originally Posted by Justin View Post
Haha, err, I guess we should probably just stick to what it is already?

Also I should note, you can use stack_peek(x) to both read or write the stack at arbitrary offsets, i.e:

Code:
x = stack_peek(2);
stack_peek(2) = y;
If you pass a constant to stack_peek(), it optimizes more, and it is faster.
wouldn't, shouldn't that be stack_poke(2) = y; ?

runs away, fast......
vocalid is offline   Reply With Quote
Old 04-18-2012, 09:47 AM   #122
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
I will try out some other changes and run them on all of the stock JS -- if anybody has scripts that they want me to test parser changes against, you can PM me them..
still something wrong with midi_logger. with new jsfx.dylib:



without:



and fwiw, arp!0 is broke bad w/ new js: bogus midi output and scrambled preset loads. am busy now, but will look into that asap.

enjoy! /dan

Last edited by bang; 05-11-2012 at 09:54 PM.
bang is offline   Reply With Quote
Old 04-18-2012, 10:36 AM   #123
EvilDragon
Human being with feelings
 
EvilDragon's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 14,424
Default

Quote:
Originally Posted by EvilDragon View Post
BTW, how about allowing the users to rename the JS effects from Reaper's FX browser, without messing with the actual filename? I'd really love to do this.

Also, how about displaying JS subfolders in the FX browser as actually subfolders in the tree...

And, how about adding an extension for JS scripts? Something like .jsfx (so it doesn't clash with JavaScripts)?

So no takers on these?
EvilDragon is online now   Reply With Quote
Old 04-18-2012, 12:39 PM   #124
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

OK, build updated once again. I fixed midi_logger, hopefully it will fix arp0 too (the optimizer was correctly optimizing out some functions that I had forgotten to mark as "non-const", oops)! Also the watch display is improved (variables now disappear on recompile if they are no longer used, and it shows you a reference count -- note that a reference count of 1 usually means a variable is either mistyped or unused).

Last edited by Justin; 04-18-2012 at 01:18 PM.
Justin is offline   Reply With Quote
Old 04-18-2012, 12:49 PM   #125
Banned
Human being with feelings
 
Banned's Avatar
 
Join Date: Mar 2008
Location: Unwired (probably in the proximity of Amsterdam)
Posts: 3,729
Default

Quote:
Originally Posted by EvilDragon View Post
So no takers on these?
[probably going a bit OT, sorry! ] ... and showing their folder name *after* their name, in parentheses or otherwise consistent with other plugin types (it's similar enough to plugin developer/publisher/manufacturer/whatever it means for VST(i), isn't it?). The AU plugin name formatting should also still be cleaned up as nicely has has been done for VST already recently (i.e. also not developer name first, but plugin name first). We now have slashes for JS, parentheses for VST, and colons for AU. Almost as complicated as JS syntax.
__________________
˙lɐd 'ʎɐʍ ƃuoɹʍ ǝɥʇ ǝɔıʌǝp ʇɐɥʇ ƃuıploɥ ǝɹ,noʎ
Banned is offline   Reply With Quote
Old 04-18-2012, 01:17 PM   #126
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by EvilDragon View Post
So no takers on these?
Maybe someday along with JS2 for those
Justin is offline   Reply With Quote
Old 04-18-2012, 01:27 PM   #127
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
Maybe someday along with JS2 for those
"JS2". i *really* like the sound of that. :^)

arp!0 better (presets load ok) but not right (midi output still garbled). data in the ouput queue looks ok, so that narrows it down to the midi_send logic? will look into that rsn. enjoy! /dan
bang is offline   Reply With Quote
Old 04-18-2012, 01:54 PM   #128
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by bang View Post
arp!0 better (presets load ok) but not right (midi output still garbled). data in the ouput queue looks ok, so that narrows it down to the midi_send logic? will look into that rsn. enjoy! /dan

I ran my script to see if the precedence fixes affected anything in arp!0, there was one spot:
Code:
!vntcnt || !vntmap[0] ?(
In 4.22, that would be
Code:
(!vntcnt) || (!vntmap)[0] ? (
but it is now:
Code:
(!vntcnt) || !(vntmap[0]) ? (
Could that change cause it? If not, there still could be something amiss in the optimizer stage.. I can give a build with some of the optimizations off, if that helps.
Justin is offline   Reply With Quote
Old 04-18-2012, 02:00 PM   #129
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
I ran my script to see if the precedence fixes affected anything in arp!0, there was one spot:
Code:
!vntcnt || !vntmap[0] ?(
that's a dormant bug :^P. but it would only affect initilizing variants, which are usually loaded from a preset anyway.

i can look at the midi_send code tonight to see if i can narrow it down. up to you if you'd like me to just try it with some optimizations off first.

thanks! /dan
bang is offline   Reply With Quote
Old 04-18-2012, 02:05 PM   #130
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by bang View Post
that's a dormant bug :^P. but it would only affect initilizing variants, which are usually loaded from a preset anyway.

i can look at the midi_send code tonight to see if i can narrow it down. up to you if you'd like me to just try it with some optimizations off first.

thanks! /dan
http://1014.org/shiz/jsfx.dylib has everything up to date, but optimization off.
Justin is offline   Reply With Quote
Old 04-18-2012, 02:09 PM   #131
EvilDragon
Human being with feelings
 
EvilDragon's Avatar
 
Join Date: Jun 2009
Location: Croatia
Posts: 14,424
Default

Quote:
Originally Posted by Justin View Post
Maybe someday along with JS2 for those
Is getting the JS plugins listed in the folder tree with subfolders instead of heaps of forward slashes really that hard? Also, renaming from FX browser? This way on each and ever Reaper update I need to check if there were any changes in all of JS effects, then substitute the filenames according to the names that I changed for those plugins, then replace. Or, alternatively, just delete the "Effects" folder altogether and use the current folder that I have (which forefeits any possible fixes to JS plugins for me in that case). It's a chore, and it would all be easier if the original file was left with the original filename, and we could simply alias it, like we can with VST plugins...

Simple convenience goes a long way, Justin...
EvilDragon is online now   Reply With Quote
Old 04-18-2012, 02:18 PM   #132
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
http://1014.org/shiz/jsfx.dylib has everything up to date, but optimization off.
no luck. still has bogus midi out.

fwiw, i *think* everything is ok up to this code that sends queued midi, just in case anything pops out as suspicious Justin:
Code:
//   send due noteons first to avoid stuck notes
//     also do reset current notes first so new current notes appear
midi_bus= chanbus;
ii= 0; loop ( evcnt,
  evtimes[ii] < samplesblock ?( //event due this @block
    evmsgs[ii] >= 0 && (evmsgs[ii]&$xf0) == $x90 ?(
      midisend(evtimes[ii],evmsgs[ii],evmsg23s[ii]);
    ): evmsgs[ii] == -notes && evmsg23s[ii] < 0 ?( //reset current note hilites
      lastcnt= 0;
    );
  );
  evmsgs[ii] >= 0 && (evmsgs[ii]&$xf0) == $x90 ? foo2+= 1;
  ii+= 1; 
);
ii= 0; loop ( evcnt,
  evtimes[ii] < samplesblock ?( //event due this @block
    evmsgs[ii] < 0 ?( // hilite event
      evmsgs[ii] == -notes ?( //notes hilite
        evmsg23s[ii] >= 0 ?( //add note to hilite lists
          lastnotes[lastcnt]= evmsg23s[ii]; 
          lastcnt+= 1; //remember played notes to hilite
        );
      ): (-evmsgs[ii])[maxmaxsteps]= evmsg23s[ii];
      gdirtx= 1;
    ):( // "real" midi event
      (evmsgs[ii]&$xf0) != $x90 ?(
        midisend(evtimes[ii],evmsgs[ii],evmsg23s[ii]);
      );
    );
    evcnt-= 1; //delete completed event
    evcnt != ii ?(
      evtimes[ii]= evtimes[evcnt];
      evmsgs[ii]= evmsgs[evcnt];
      evmsg23s[ii]= evmsg23s[evcnt];
    );
    evmsgs[evcnt]= 0;
    evmsg23s[evcnt]= 0;
  ):( //not this @block: dec event countdown
    evtimes[ii]-= samplesblock;
    ii+= 1;
  );
);
interesting that the note highlighting logic sems to work. only midi output is garbled. no worries if this is too cryptic. i will look into it tonight.

thanks! /dan
bang is offline   Reply With Quote
Old 04-18-2012, 02:25 PM   #133
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by bang View Post
no luck. still has bogus midi out.
ok. more fwiw: looking a bit closer, noteoffs are ok, and noteons have correct msg23 data. only "evmsgs[ii]" is garbled in "midisend(evtimes[ii],evmsgs[ii],evmsg23s[ii]);" here:
Code:
//   send due noteons first to avoid stuck notes
//     also do reset current notes first so new current notes appear
midi_bus= chanbus;
ii= 0; loop ( evcnt,
  evtimes[ii] < samplesblock ?( //event due this @block
    evmsgs[ii] >= 0 && (evmsgs[ii]&$xf0) == $x90 ?(
      midisend(evtimes[ii],evmsgs[ii],evmsg23s[ii]);
    ): evmsgs[ii] == -notes && evmsg23s[ii] < 0 ?( //reset current note hilites
      lastcnt= 0;
    );
  );
  evmsgs[ii] >= 0 && (evmsgs[ii]&$xf0) == $x90 ? foo2+= 1;
  ii+= 1; 
);
thanks again! /dan
bang is offline   Reply With Quote
Old 04-18-2012, 03:02 PM   #134
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

I think I'm on to the arp!0 problem, thanks for spotting it, it's a bigger deal than just arp!0's.

Edit: builds updated -- should fix. There was actually a big problem in the C-function call methods, which was making midisend() sometimes reorder parameters, ugh! Should be fixed now. Thanks, !.

Last edited by Justin; 04-18-2012 at 03:23 PM.
Justin is offline   Reply With Quote
Old 04-18-2012, 04:04 PM   #135
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
Edit: builds updated -- should fix.
hmmm. not yet!? jsfx.dylib mod time 3 hours < jsfx.dll?
bang is offline   Reply With Quote
Old 04-18-2012, 05:57 PM   #136
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by bang View Post
hmmm. not yet!? jsfx.dylib mod time 3 hours < jsfx.dll?
Oops, it is updated now.
Justin is offline   Reply With Quote
Old 04-18-2012, 06:53 PM   #137
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
Oops, it is updated now.
arp!0 sounding good now! thanks!

another nit i thought of that would be nice to have fixed if it's easy to do now: on macos Js doesn't seem to respect the dimensions specified in "@gfx width height". mac Js fx don't resize up or down, and always open in some smallish default size when floated. iirc, winfolk report that this works ok.

also fwiw, $'(' and $')' generate syntax errors.

enjoy! /dan

Last edited by bang; 04-18-2012 at 06:56 PM. Reason: $'(' nit
bang is offline   Reply With Quote
Old 04-18-2012, 07:09 PM   #138
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by bang View Post
arp!0 sounding good now! thanks!

another nit i thought of that would be nice to have fixed if it's easy to do now: on macos Js doesn't seem to respect the dimensions specified in "@gfx width height". mac Js fx don't resize up or down, and always open in some smallish default size when floated. iirc, winfolk report that this works ok.
Even with the options in Prefs/Plugins (allow resize down/up) set?

Quote:

also fwiw, $'(' and $')' generate syntax errors.

enjoy! /dan
Ah, yeah, doh. Same for $'[' and $']' too.
Justin is offline   Reply With Quote
Old 04-18-2012, 07:13 PM   #139
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
Even with the options in Prefs/Plugins (allow resize down/up) set?
yes. /dan
bang is offline   Reply With Quote
Old 04-18-2012, 08:12 PM   #140
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Fixes for $'(' etc, and the OSX resize issue, coming in 4.23pre3 =)
Justin is offline   Reply With Quote
Old 04-18-2012, 08:56 PM   #141
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
Fixes[...]
<happy dance!>
bang is offline   Reply With Quote
Old 04-19-2012, 09:58 AM   #142
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

following up on a few bits:

Quote:
Originally Posted by Justin View Post
Some things I'm going to do soon:
  • optional support for explicit variable declarations
  • include/import support for functions (probably with .inc files in the same path as the js, and make REAPER ignore *.inc when scanning).
any rough eta on these Justin? and any chance for that precedence list? and... ReaJS? i am committed to keeping arp!0 ReaJS compatable, at least for 1.0. so all the lovely Js fixes and enhancements aren't an option unless ReaJS gets an update to include them. without them arp!0 development is pretty much at a standstill. arp!0 is close enough to 1.0 that this is only a little sad right now.

tia! and enjoy! /dan
bang is offline   Reply With Quote
Old 04-19-2012, 10:52 AM   #143
IXix
Human being with feelings
 
Join Date: Jan 2007
Location: mcr:uk
Posts: 2,503
Default

Would it be possible to have something like function pointers? :

Code:
@init
function f1() ( /* do something */ );
function f2() ( /* do something else */ );

obj.func = f1;

@slider
obj.func = (slider1 == 1) ? f1 : f2;

@block
obj.func();
Okay, I know I'm dreaming but sometimes dreams come true.
IXix is offline   Reply With Quote
Old 04-19-2012, 01:27 PM   #144
vocalid
Human being with feelings
 
vocalid's Avatar
 
Join Date: Sep 2009
Location: Middle of nowhere (where the cheese comes from)
Posts: 483
Default

Mr. Justin Sir, are you planning on combining the possiblities of
WALTER (I wrote Herman first) with JS in the nearer future?
vocalid is offline   Reply With Quote
Old 04-19-2012, 02:35 PM   #145
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

one more thing... :^) this just came up in the arp!0 thread: because automation and presets share the same @slider input code, it is not possible to have specialized automation login. from Js you can't tell the difference between loading a preset and receiving automation. this has blocked a couple of nice automation features for arp!0. not sure what a good solution for this is though. maybe it's a JS2 thing. :^) enjoy! /dan
bang is offline   Reply With Quote
Old 04-19-2012, 02:58 PM   #146
dub3000
Human being with feelings
 
dub3000's Avatar
 
Join Date: Mar 2008
Location: Sydney, Australia
Posts: 3,775
Default

Quote:
Originally Posted by IXix View Post
Would it be possible to have something like function pointers? :

Code:
@init
function f1() ( /* do something */ );
function f2() ( /* do something else */ );

obj.func = f1;

@slider
obj.func = (slider1 == 1) ? f1 : f2;

@block
obj.func();
Okay, I know I'm dreaming but sometimes dreams come true.
I think the problem with that is that it makes everything inherently unsafe.
dub3000 is offline   Reply With Quote
Old 04-19-2012, 09:06 PM   #147
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Quote:
Originally Posted by bang View Post
following up on a few bits:



any rough eta on these Justin? and any chance for that precedence list? and... ReaJS? i am committed to keeping arp!0 ReaJS compatable, at least for 1.0. so all the lovely Js fixes and enhancements aren't an option unless ReaJS gets an update to include them. without them arp!0 development is pretty much at a standstill. arp!0 is close enough to 1.0 that this is only a little sad right now.

tia! and enjoy! /dan
import is in 4.23pre4. ReaJS will be updated after 4.23 is released.
Justin is offline   Reply With Quote
Old 04-19-2012, 09:48 PM   #148
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
import is in 4.23pre4. ReaJS will be updated after 4.23 is released.
super groovy excellent! thanks so much. enjoy! /dan
bang is offline   Reply With Quote
Old 04-20-2012, 02:11 AM   #149
IXix
Human being with feelings
 
Join Date: Jan 2007
Location: mcr:uk
Posts: 2,503
Default

Quote:
Originally Posted by dub3000 View Post
I think the problem with that is that it makes everything inherently unsafe.
I would have thought the most likely problem would be the dynamic nature of deciding which function to call. I wouldn't have thought it was necessarily unsafe as long as the code parser is smart enough to call foul if you try to assign a function to a variable or vice versa.

Anyway, it would be a useful feature if it's feasible but I don't really know what I'm asking for in real terms. I won't be upset if it doesn't happen. Just wishing out loud.
IXix is offline   Reply With Quote
Old 04-22-2012, 11:55 AM   #150
beyond
Human being with feelings
 
Join Date: Jun 2007
Location: Palm Beach FL
Posts: 238
Default

The new Instance() variables in functions for simulating class members is a rather ingenious idea! However, there is no current way to pass in a second object and its members to a function.

This would be possible (alongside many, many other goodies) if there was a simple macro text substitution feature to function parameters. To illustrate my earlier idea more specifically:

Code:
function Copy(#From#) instance(Child1, Child2)
(
  Child1 = #From#.Child1;
  Child2 = #From#.Child2;
);


Object1.Child1 = 123;

Object2.Copy(Object1);

//Object2.Child1 == 123 is true
beyond is offline   Reply With Quote
Old 04-24-2012, 08:11 PM   #151
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

OK, more bleeding edge updates are now available (different from what's in 4.23preX):
  • New parser, which mostly tries to duplicate the ancient JS parser. Hopefully no FX will be broken, but this needs to be tested extensively (hence it might not get into 4.23, but the feedback we get here will help determine that).
  • EEL user functions can now take more than 3 parameters (up to 40 for now, we can increase if necessary but that's probably overkill).
  • Some silly old, and probably rarely encountered precedence strangenesses have been corrected: for example, with 4.23pre6, "a=(1+5;8);" sets a to 9. The new parser evaluates it as 8.
  • You can now specify hex constants using 0x12345 etc, or the old $x12345.
  • We now can update the parser to add more new advanced features more easily.

Hopefully everything works.
Justin is offline   Reply With Quote
Old 04-25-2012, 12:12 AM   #152
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

arp!0 sounding good so far w/ bleeding edge js! enjoy! /dan
bang is offline   Reply With Quote
Old 04-25-2012, 12:44 AM   #153
IXix
Human being with feelings
 
Join Date: Jan 2007
Location: mcr:uk
Posts: 2,503
Default

Quote:
Originally Posted by Justin View Post
We now can update the parser to add more new advanced features more easily.
What is he building in there?
IXix is offline   Reply With Quote
Old 04-25-2012, 02:34 AM   #154
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: Holland
Posts: 1,689
Default

Yay, more JS updates! I was thinking that this is all great fun, why stop already.

I have only briefly tested things here at work, but thusfar everything seems fine (on WinXP Pro SP3).

Quote:
Originally Posted by Justin View Post
New parser, which mostly tries to duplicate the ancient JS parser. Hopefully no FX will be broken, but this needs to be tested extensively (hence it might not get into 4.23, but the feedback we get here will help determine that).
Just out of curiosity: Is the new parser proprietary code? If not, what are you using?

Quote:
Originally Posted by IXix View Post
What is he building in there?
God knows, assuming He has a hex editor or disassembler...
Tale is offline   Reply With Quote
Old 04-25-2012, 06:48 AM   #155
IXix
Human being with feelings
 
Join Date: Jan 2007
Location: mcr:uk
Posts: 2,503
Default

Quote:
Originally Posted by Tale View Post
God knows, assuming He has a hex editor or disassembler...
I doubt He needs one.

Been playing with assorted JS fx for the past half hour and haven't noticed any broken behaviour. Looking good.
IXix is offline   Reply With Quote
Old 04-25-2012, 08:35 AM   #156
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

The parser is made using flex/bison. We'll be posting the updates in WDL eventually.

The current (old) eel2 in WDL has two main parts: a hand written preprocessor, which handles much of the eel2 syntax (a[b], &&, ||, ?:, ; etc), and a lex/yacc based parser (for whichwhich processes basic arithmetic operations (*/+-&|), and function calls (symbol(parm)) into code. The reason for the preprocessor is that at a certain point we had the lex/yacc parser but not the source for it, and it had been modified extensively by hand.

The eel2 in this build has a new parser ([f]lex/[yacc|bison]), which re-implements the old parser, fixing a few little things in the process. All of the previous updates were much larger work, separating the parser's code generation calls from the actual machine code generation.. anyway...
Justin is offline   Reply With Quote
Old 04-25-2012, 10:44 AM   #157
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: Holland
Posts: 1,689
Default

Thanks for the info.
Tale is offline   Reply With Quote
Old 04-25-2012, 10:49 AM   #158
bang
Human being with feelings
 
bang's Avatar
 
Join Date: Jul 2006
Posts: 547
Default

Quote:
Originally Posted by Justin View Post
[...]The eel2 in this build has a new parser ([f]lex/[yacc|bison]), which re-implements the old parser, fixing a few little things in the process.[...]
quite interesting. sounds like things are much cleaner now. vgood! thanks for the effort. /dan
bang is offline   Reply With Quote
Old 04-25-2012, 01:43 PM   #159
Justin
Administrator
 
Justin's Avatar
 
Join Date: Jan 2005
Location: NYC
Posts: 7,863
Default

Did some size optimization, updated the build in the OP.
Justin is offline   Reply With Quote
Old 04-25-2012, 01:53 PM   #160
Tale
Human being with feelings
 
Tale's Avatar
 
Join Date: Jul 2008
Location: Holland
Posts: 1,689
Default

Meanwhile I have been testing the previous build (without the size optimization) with a bunch of scripts, and everything seems fine.
Tale is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 02:22 AM.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.