SlideShare a Scribd company logo
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
1. Два клЕвых пацана на сцене 
2. Прикольные загадки 
3. Вы голосуете за правильный 
ответ 
4. Мы швыряемся вещами 
5. Официальный хэш! 
groovypuzzlers
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
-3.abs()
Groovy puzzlers по русски с Joker 2014
int value = -3 
value.abs() 
(-3).abs()
Groovy puzzlers по русски с Joker 2014
println (-3).abs()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
println (-3).abs() 
-3 
Caught: java.lang.NullPointerException: Cannot invoke method abs() on null 
object 
java.lang.NullPointerException: Cannot invoke method abs() on null object 
at AbsolutelyGroovy.run(AbsolutelyGroovy.groovy:7) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
“Все проблемы в программировании 
можно решить добавив пару скобок” 
John McCarthy, изобретатель LISP
println ((-3).abs()) 
int value = -3 
println value.abs()
Groovy puzzlers по русски с Joker 2014
boolean isPrime(def x) { 
if (x == 2) return true 
int limit = Math.sqrt(x) + 1 
(2..limit).each { 
if (x % it == 0) { 
return false 
} 
} 
true 
} 
println isPrime("4" as Double)
Groovy puzzlers по русски с Joker 2014
boolean isPrime(def x) { 
if (x == 2) return true 
int limit = Math.sqrt(x) + 1 
(2..limit).each { 
if (x % it == 0) { 
return false 
} 
} 
true 
} 
println isPrime("4" as Double)
boolean isPrime(def x) { 
if (x == 2) return true 
int limit = Math.sqrt(x) + 1 
(2..limit).each { 
if (x % it == 0) { 
return false 
} 
} 
true 
} 
println isPrime("4" as Double)
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
http://kousenit.wordpress.com/2014/04/18/responses-to-the-closure-of-no-return/
Groovy puzzlers по русски с Joker 2014
class Conference {def name; def year} 
def gr = new Conference(name: 'Greach', year: 2014) 
gr.each {println it}
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
List<Integer> list = [56, '9', 74] 
def max = list.max { item -> 
(item < 50) ? item : null 
} 
println max
List<Integer> list = [56, '9', 74] 
def max = list.max { item -> 
(item < 50) ? item : null 
} 
println max
>groovysh (('9' as Character) as Integer) 
===> 57
List<Integer> list = [56, 57, 74] 
def max = list.max { item -> 
(item < 50) ? item : null 
} 
println max
Groovy puzzlers по русски с Joker 2014
List<Integer> list = [56, '9', 74] 
def max = list.max { item -> 
(item < 50) ? item : null 
} 
println max
Groovy puzzlers по русски с Joker 2014
def random = new Random() 
def randomList = [] 
0..10.each {randomList << random.nextInt()} 
assert randomList.max{ null } == randomList[0]
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Closure ктоУбийца() { 
{ 
'Мориарти.' 
} 
} 
println ктоУбийца()
Groovy puzzlers по русски с Joker 2014
Closure ктоУбийца() { 
Closure ктоУбийца() { 
{ -> 
'Мориарти.' 
} 
} 
return { 
'Мориарти.' 
} 
}
Groovy puzzlers по русски с Joker 2014
class CountDown { int counter = 10 } 
CountDown finalCountDown() { 
def countDown = new CountDown() 
try { 
countDown.counter = --countDown.counter 
} catch (ignored) { 
println "That will never happen." 
countDown.counter = Integer.MIN_VALUE 
} finally { 
return countDown 
} 
} 
println finalCountDown().counter
class CountDown { int counter = 10 } 
CountDown finalCountDown() { 
def countDown = new CountDown() 
try { 
countDown.counter = --countDown.counter 
} catch (ignored) { 
println "That will never happen." 
countDown.counter = Integer.MIN_VALUE 
} finally { 
return countDown 
} 
} 
println finalCountDown().counter
Groovy puzzlers по русски с Joker 2014
class CountDown { int counter = 10 } 
CountDown finalCountDown() { 
def countDown = new CountDown() 
try { 
countDown.counter = --countDown.counter 
} catch (ignored) { 
ignored.printStackTrace() 
countDown.counter = Integer.MIN_VALUE 
} finally { 
return countDown 
} 
} 
println finalCountDown().counter 
org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object '9' with class 'java.lang.Integer' to class 'CountDown’ 
-2147483648
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
class CountDown { int counter = 10 } 
CountDown finalCountDown() { 
def countDown = new CountDown() 
try { 
countDown.counter = --countDown.counter 
} catch (ignored) { 
println "That will never happen." 
countDown.counter = Integer.MIN_VALUE 
} finally { 
return countDown 
} 
42 
} 
println finalCountDown().counter
class CountDown { int counter = 10 } 
CountDown finalCountDown() { 
def countDown = new CountDown() 
try { 
countDown.counter = --countDown.counter 
} catch (ignored) { 
println "That will never happen." 
countDown.counter = Integer.MIN_VALUE 
} finally { 
return countDown 
} 
42 
} 
println finalCountDown().counter
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
PUBLIC - 
PROPERTY!
trait Public { 
public String property = "I am all public!" 
} 
class Property implements Public {} 
Property publicProperty = new Property()
trait Public { 
public String property = "I am all public!" 
} 
class Property implements Public {} 
Property publicProperty = new Property()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
А ты документацию 
читать не пробовал??? 
http://beta.groovy-lang.org/docs/groovy-2.3.0/html/documentation/core-traits.html
Groovy puzzlers по русски с Joker 2014
def key = 'x' 
def map = [key: 'treasure'] 
def value = map.get(key) 
println value
def key = 'x' 
def map = [key: 'treasure'] 
def value = map.get(key) 
println value
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
1.def map = [(key): 'treasure'] 
2.map.put(key, 'treasure') 
3.map[key] = 'treasure' 
4.map." " = 'treasure'
Groovy puzzlers по русски с Joker 2014
def map = [2: 'treasure'] 
def key = 2 
def value = map."$key" 
println value
def map = [2: 'treasure'] 
def key = 2 
def value = map."$key" 
println value
Groovy puzzlers по русски с Joker 2014
def map = [2: 'treasure'] 
println map.keySet().first().class.name 
java.lang.Integer
Groovy puzzlers по русски с Joker 2014
def key = 'x' 
def map = ["${key}": 'treasure'] 
def value = map['x'] 
println value
def key = 'x' 
def map = ["${key}": 'treasure'] 
def value = map['x'] 
println value
Groovy puzzlers по русски с Joker 2014
def map = ["${key}": 'treasure'] 
println map.keySet().first().class.name 
org.codehaus.groovy.runtime.GStringImpl
Groovy puzzlers по русски с Joker 2014
def range = 1.0..10.0 
assert range.contains(5.0) 
println range.contains(5.6)
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Iterator iterator = (1.0..10.0).iterator() 
while (iterator.hasNext()) { 
print "${iterator.next()} " 
} 
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
[0..9].each { println(it - 1) }
Groovy puzzlers по русски с Joker 2014
[0..9].each { println(it - 1) } 
Это неправильные 
скобки!
(0..9).each { println(it - 1) } 
Другое дело!
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
[0, 2, 3, 4, 5, 6, 7, 8, 9]
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
List<Long> list = [1,2,3] 
def now = new Date() 
list << now 
println list
List<Long> list = [1,2,3] 
def now = new Date() 
list << now 
println list
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
List<Long> list = [1,2,3] 
def now = new Date() 
list << now 
list << 'foo' 
println list*.class.name 
[java.lang.Long, java.lang.Long, 
java.lang.Long, java.util.Date, 
java.lang.String]
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
double value = 3 
println "$value.14".isDouble()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
double value = 3 
println "$value.14".isDouble()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
class Invite { 
int attending = 1 
} 
def invite = new Invite() 
def attendees = (invite.attending) +1 
println attendees
class Invite { 
int attending = 1 
} 
def invite = new Invite() 
def attendees = (invite.attending) +1 
println attendees
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
def attendees = (new Invite().attending) + 1 
println attendees
def invite = new Invite() 
def attendees = invite.attending +1 
Как убрать скобки?!
Groovy puzzlers по русски с Joker 2014
class MrHyde { 
def me() { 
return this 
} 
} 
class DrJekyll { 
} 
DrJekyll.mixin MrHyde 
def drJekyll = new DrJekyll().me() as DrJekyll 
def mrHide = new DrJekyll().me() 
println "$drJekyll and $mrHide, are they the 
same? ${(drJekyll.class).equals(mrHide.class)}"
class MrHyde { 
def me() { 
return this 
} 
} 
class DrJekyll { 
} 
DrJekyll.mixin MrHyde 
def drJekyll = new DrJekyll().me() as DrJekyll 
def mrHide = new DrJekyll().me() 
println "$drJekyll and $mrHide, are they the same? 
${(drJekyll.class).equals(mrHide.class)}"
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
def x = int 
println x 
if ((x = long)) { 
println x 
} 
if (x = boolean ) { 
println x 
}
def x = int 
println x 
if ((x = long)) { 
println x 
} 
if (x = boolean ) { 
println x 
}
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
class VanHalen { 
public static jump() { 
"Here are the ${lyrics()}" 
} 
def methodMissing(String name, def args) { 
'lyrics' 
} 
} 
println VanHalen.jump()
class VanHalen { 
public static jump() { 
"Here are the ${lyrics()}" 
} 
def methodMissing(String name, def args) { 
'lyrics' 
} 
} 
println VanHalen.jump()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
class VanHalen { 
public static jump() { 
"Here are the ${lyrics()}" 
} 
static $static_methodMissing(String name, def args) { 
'lyrics' 
} 
} 
println VanHalen.jump()
class VanHalen { 
public jump() { 
"Here are the ${lyrics()}" 
} 
def methodMissing(String name, def args) { 
'lyrics' 
} 
} 
println new VanHalen().jump()
Groovy puzzlers по русски с Joker 2014
def map = [metaClass: ‘frequency'] 
println "What's the $map.metaClass, Барух?"
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
map.metaClass 
map.get('metaClass') 
map.getMetaClass()
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
1. Пишите читабельный код 
2. Комментируйте все трюки 
3. Иногда это баг 
4. Пользуйте static code analysis - intellij 
IDEA! 
5. Rtfm 
6. Don’t code like my brother
Мы только начали! (надо еще 
форму придумать) 
Засылайте Ваши паззлеры, поделки 
и рисунки 
- puzzlers jfrog.com 
- Groovypuzzlers
Groovy puzzlers по русски с Joker 2014
Вам понравилось? 
Хвалите нас в твиттере 
groovypuzzlers 
- Groovypuzzlers 
- jekaborisov 
- jbaruch 
Вам не поравилось? 
/dev/null
Groovy puzzlers по русски с Joker 2014

More Related Content

Groovy puzzlers по русски с Joker 2014

  • 3. 1. Два клЕвых пацана на сцене 2. Прикольные загадки 3. Вы голосуете за правильный ответ 4. Мы швыряемся вещами 5. Официальный хэш! groovypuzzlers
  • 10. int value = -3 value.abs() (-3).abs()
  • 15. println (-3).abs() -3 Caught: java.lang.NullPointerException: Cannot invoke method abs() on null object java.lang.NullPointerException: Cannot invoke method abs() on null object at AbsolutelyGroovy.run(AbsolutelyGroovy.groovy:7) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
  • 16. “Все проблемы в программировании можно решить добавив пару скобок” John McCarthy, изобретатель LISP
  • 17. println ((-3).abs()) int value = -3 println value.abs()
  • 19. boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)
  • 21. boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)
  • 22. boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)
  • 31. class Conference {def name; def year} def gr = new Conference(name: 'Greach', year: 2014) gr.each {println it}
  • 35. List<Integer> list = [56, '9', 74] def max = list.max { item -> (item < 50) ? item : null } println max
  • 36. List<Integer> list = [56, '9', 74] def max = list.max { item -> (item < 50) ? item : null } println max
  • 37. >groovysh (('9' as Character) as Integer) ===> 57
  • 38. List<Integer> list = [56, 57, 74] def max = list.max { item -> (item < 50) ? item : null } println max
  • 40. List<Integer> list = [56, '9', 74] def max = list.max { item -> (item < 50) ? item : null } println max
  • 42. def random = new Random() def randomList = [] 0..10.each {randomList << random.nextInt()} assert randomList.max{ null } == randomList[0]
  • 45. Closure ктоУбийца() { { 'Мориарти.' } } println ктоУбийца()
  • 47. Closure ктоУбийца() { Closure ктоУбийца() { { -> 'Мориарти.' } } return { 'Мориарти.' } }
  • 49. class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { println "That will never happen." countDown.counter = Integer.MIN_VALUE } finally { return countDown } } println finalCountDown().counter
  • 50. class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { println "That will never happen." countDown.counter = Integer.MIN_VALUE } finally { return countDown } } println finalCountDown().counter
  • 52. class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { ignored.printStackTrace() countDown.counter = Integer.MIN_VALUE } finally { return countDown } } println finalCountDown().counter org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '9' with class 'java.lang.Integer' to class 'CountDown’ -2147483648
  • 55. class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { println "That will never happen." countDown.counter = Integer.MIN_VALUE } finally { return countDown } 42 } println finalCountDown().counter
  • 56. class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { println "That will never happen." countDown.counter = Integer.MIN_VALUE } finally { return countDown } 42 } println finalCountDown().counter
  • 61. trait Public { public String property = "I am all public!" } class Property implements Public {} Property publicProperty = new Property()
  • 62. trait Public { public String property = "I am all public!" } class Property implements Public {} Property publicProperty = new Property()
  • 65. А ты документацию читать не пробовал??? http://beta.groovy-lang.org/docs/groovy-2.3.0/html/documentation/core-traits.html
  • 67. def key = 'x' def map = [key: 'treasure'] def value = map.get(key) println value
  • 68. def key = 'x' def map = [key: 'treasure'] def value = map.get(key) println value
  • 71. 1.def map = [(key): 'treasure'] 2.map.put(key, 'treasure') 3.map[key] = 'treasure' 4.map." " = 'treasure'
  • 73. def map = [2: 'treasure'] def key = 2 def value = map."$key" println value
  • 74. def map = [2: 'treasure'] def key = 2 def value = map."$key" println value
  • 76. def map = [2: 'treasure'] println map.keySet().first().class.name java.lang.Integer
  • 78. def key = 'x' def map = ["${key}": 'treasure'] def value = map['x'] println value
  • 79. def key = 'x' def map = ["${key}": 'treasure'] def value = map['x'] println value
  • 81. def map = ["${key}": 'treasure'] println map.keySet().first().class.name org.codehaus.groovy.runtime.GStringImpl
  • 83. def range = 1.0..10.0 assert range.contains(5.0) println range.contains(5.6)
  • 88. Iterator iterator = (1.0..10.0).iterator() while (iterator.hasNext()) { print "${iterator.next()} " } 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
  • 95. [0..9].each { println(it - 1) } Это неправильные скобки!
  • 96. (0..9).each { println(it - 1) } Другое дело!
  • 102. [0, 2, 3, 4, 5, 6, 7, 8, 9]
  • 105. List<Long> list = [1,2,3] def now = new Date() list << now println list
  • 106. List<Long> list = [1,2,3] def now = new Date() list << now println list
  • 111. List<Long> list = [1,2,3] def now = new Date() list << now list << 'foo' println list*.class.name [java.lang.Long, java.lang.Long, java.lang.Long, java.util.Date, java.lang.String]
  • 114. double value = 3 println "$value.14".isDouble()
  • 118. double value = 3 println "$value.14".isDouble()
  • 123. class Invite { int attending = 1 } def invite = new Invite() def attendees = (invite.attending) +1 println attendees
  • 124. class Invite { int attending = 1 } def invite = new Invite() def attendees = (invite.attending) +1 println attendees
  • 130. def attendees = (new Invite().attending) + 1 println attendees
  • 131. def invite = new Invite() def attendees = invite.attending +1 Как убрать скобки?!
  • 133. class MrHyde { def me() { return this } } class DrJekyll { } DrJekyll.mixin MrHyde def drJekyll = new DrJekyll().me() as DrJekyll def mrHide = new DrJekyll().me() println "$drJekyll and $mrHide, are they the same? ${(drJekyll.class).equals(mrHide.class)}"
  • 134. class MrHyde { def me() { return this } } class DrJekyll { } DrJekyll.mixin MrHyde def drJekyll = new DrJekyll().me() as DrJekyll def mrHide = new DrJekyll().me() println "$drJekyll and $mrHide, are they the same? ${(drJekyll.class).equals(mrHide.class)}"
  • 140. def x = int println x if ((x = long)) { println x } if (x = boolean ) { println x }
  • 141. def x = int println x if ((x = long)) { println x } if (x = boolean ) { println x }
  • 146. class VanHalen { public static jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()
  • 147. class VanHalen { public static jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()
  • 152. class VanHalen { public static jump() { "Here are the ${lyrics()}" } static $static_methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()
  • 153. class VanHalen { public jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println new VanHalen().jump()
  • 155. def map = [metaClass: ‘frequency'] println "What's the $map.metaClass, Барух?"
  • 161. 1. Пишите читабельный код 2. Комментируйте все трюки 3. Иногда это баг 4. Пользуйте static code analysis - intellij IDEA! 5. Rtfm 6. Don’t code like my brother
  • 162. Мы только начали! (надо еще форму придумать) Засылайте Ваши паззлеры, поделки и рисунки - puzzlers jfrog.com - Groovypuzzlers
  • 164. Вам понравилось? Хвалите нас в твиттере groovypuzzlers - Groovypuzzlers - jekaborisov - jbaruch Вам не поравилось? /dev/null

Editor's Notes

  1. CURRENT – JB NEXT 2001 OracleWorld: Joshua Bloch, Neal Gafter
  2. CURRENT – JB NEXT - FRED
  3. CURRENT – JB NEXT - FRED
  4. CURRENT – JB NEXT - FRED
  5. CURRENT – JB NEXT - FRED
  6. CURRENT – FRED NEXT - JB
  7. CURRENT – FRED NEXT - JB
  8. CURRENT – FRED NEXT - JB
  9. CURRENT – FRED NEXT - JB
  10. CURRENT – FRED NEXT - JB
  11. CURRENT – FRED NEXT - JB
  12. CURRENT – FRED NEXT - JB
  13. CURRENT – FRED NEXT - JB
  14. CURRENT – FRED NEXT - JB
  15. CURRENT – FRED NEXT - JB
  16. CURRENT – FRED NEXT - JB
  17. CURRENT – JB NEXT - FRED
  18. CURRENT – JB NEXT - FRED
  19. CURRENT – JB NEXT - FRED
  20. CURRENT – JB NEXT - FRED
  21. CURRENT – JB NEXT - FRED
  22. CURRENT – JB NEXT - FRED
  23. CURRENT – JB NEXT - FRED
  24. CURRENT – JB NEXT - FRED
  25. CURRENT – JB NEXT - FRED
  26. CURRENT – JB NEXT - FRED
  27. CURRENT – JB NEXT - FRED
  28. CURRENT – JB NEXT - FRED
  29. CURRENT – FRED NEXT - FRED
  30. CURRENT – FRED NEXT - FRED
  31. CURRENT – FRED NEXT - FRED
  32. CURRENT – FRED NEXT - FRED
  33. CURRENT – JB NEXT - FRED
  34. CURRENT – JB NEXT - FRED
  35. CURRENT – JB NEXT - FRED
  36. CURRENT – JB NEXT - FRED
  37. CURRENT – JB NEXT - FRED
  38. CURRENT – JB NEXT - FRED
  39. CURRENT – JB NEXT - FRED
  40. CURRENT – JB NEXT - FRED
  41. CURRENT – JB NEXT - FRED
  42. CURRENT – JB NEXT - FRED
  43. CURRENT – FRED NEXT - JB
  44. CURRENT – FRED NEXT - JB
  45. CURRENT – FRED NEXT - JB
  46. CURRENT – FRED NEXT - JB
  47. 1985 CURRENT – FRED NEXT - JB
  48. CURRENT – FRED NEXT - JB
  49. CURRENT – FRED NEXT - JB
  50. CURRENT – FRED NEXT - JB
  51. CURRENT – FRED NEXT - JB
  52. CURRENT – FRED NEXT - JB
  53. CURRENT – FRED NEXT - JB
  54. CURRENT – FRED NEXT - JB
  55. CURRENT – FRED NEXT - JB
  56. CURRENT – FRED NEXT - JB
  57. CURRENT – FRED NEXT - JB
  58. CURRENT – FRED NEXT - JB
  59. CURRENT – JB NEXT - JB
  60. CURRENT – JB NEXT - JB
  61. CURRENT – JB NEXT - JB
  62. CURRENT – JB NEXT - JB
  63. CURRENT – JB NEXT - JB
  64. CURRENT – FRED NEXT - JB
  65. CURRENT – FRED NEXT - JB
  66. CURRENT – FRED NEXT - JB
  67. CURRENT – FRED NEXT - JB
  68. CURRENT – FRED NEXT - JB
  69. CURRENT – FRED NEXT - JB
  70. CURRENT – JB NEXT - FRED
  71. CURRENT – JB NEXT - FRED
  72. CURRENT – JB NEXT - FRED
  73. CURRENT – JB NEXT - FRED
  74. CURRENT – JB NEXT - FRED
  75. CURRENT – JB NEXT - FRED
  76. CURRENT – JB NEXT - FRED
  77. CURRENT – JB NEXT - FRED
  78. CURRENT – JB NEXT - FRED
  79. CURRENT – JB NEXT - FRED
  80. CURRENT – JB NEXT - FRED
  81. CURRENT – JB NEXT - FRED
  82. CURRENT – JB NEXT - FRED
  83. CURRENT – JB NEXT - FRED
  84. CURRENT – JB NEXT - FRED
  85. CURRENT – JB NEXT - FRED
  86. CURRENT – JB NEXT - FRED
  87. CURRENT – JB NEXT - FRED
  88. CURRENT – FRED NEXT - JB
  89. CURRENT – FRED NEXT - JB
  90. CURRENT – FRED NEXT - JB
  91. CURRENT – FRED NEXT - JB
  92. CURRENT – FRED NEXT - JB
  93. CURRENT – FRED NEXT - JB
  94. CURRENT – FRED NEXT - JB
  95. CURRENT – FRED NEXT - JB
  96. CURRENT – FRED NEXT - JB
  97. CURRENT – FRED NEXT - JB
  98. CURRENT – FRED NEXT - JB
  99. CURRENT – FRED NEXT - JB
  100. CURRENT – FRED NEXT - JB
  101. CURRENT – FRED NEXT - JB
  102. CURRENT – FRED NEXT - JB
  103. CURRENT – FRED NEXT - JB
  104. CURRENT – FRED NEXT - JB
  105. CURRENT – FRED NEXT - JB
  106. CURRENT – FRED NEXT - JB
  107. CURRENT – JB NEXT - FRED
  108. CURRENT – JB NEXT - FRED
  109. CURRENT – JB NEXT - FRED
  110. CURRENT – JB NEXT - FRED
  111. CURRENT – JB NEXT - FRED
  112. CURRENT – JB NEXT - FRED
  113. CURRENT – JB NEXT - FRED
  114. CURRENT – JB NEXT - FRED
  115. CURRENT – JB NEXT - FRED
  116. CURRENT – FRED
  117. CURRENT – FRED
  118. CURRENT – FRED
  119. CURRENT – FRED
  120. CURRENT – FRED
  121. CURRENT – FRED
  122. CURRENT – FRED
  123. CURRENT – FRED
  124. CURRENT – FRED
  125. CURRENT – FRED
  126. CURRENT – JB NEXT - FRED
  127. CURRENT – JB NEXT - FRED
  128. CURRENT – JB NEXT - FRED
  129. CURRENT – JB NEXT - FRED
  130. CURRENT – JB NEXT - FRED
  131. CURRENT – JB NEXT - FRED
  132. CURRENT – FRED NEXT - JB
  133. CURRENT – FRED NEXT - JB
  134. CURRENT – FRED NEXT - JB
  135. CURRENT – FRED NEXT - JB
  136. CURRENT – FRED NEXT - JB
  137. CURRENT – FRED NEXT - JB
  138. CURRENT – FRED NEXT - JB (1983)
  139. CURRENT – FRED NEXT - JB
  140. CURRENT – FRED NEXT - JB
  141. CURRENT – FRED NEXT - JB
  142. CURRENT – FRED NEXT - JB
  143. CURRENT – FRED NEXT - JB
  144. CURRENT – FRED NEXT - JB
  145. CURRENT – FRED NEXT - JB
  146. CURRENT – FRED NEXT - JB
  147. CURRENT – JB NEXT - FRED 1993
  148. CURRENT – JB NEXT - FRED
  149. CURRENT – JB NEXT - FRED
  150. CURRENT – JB NEXT - FRED
  151. CURRENT – JB NEXT - FRED
  152. CURRENT – JB NEXT - FRED