Commit 902c970f by Jacqueline Lee

backgammon project

parent 347b50f7
#lang racket/base
(provide big-bang*)
(require (for-syntax racket/base
racket/list
racket/function
unstable/list
racket/syntax
syntax/parse)
2htdp/universe)
;; big-bang changes behavior based on whether or not clauses are present, which is inconvenient when
;; attempting to create a function wrapper. This automatically generates a cond form to handle all
;; possible cases.
(define-syntax (big-bang-cross-product stx)
(syntax-parse stx
[(_ world
(constant-clause ...)
(clause-condition clause-true (~optional clause-false #:defaults ([clause-false #f])))
...)
; wrap each condition with its true case and false case
(define clause-dict
(for/list ([condition (in-list (attribute clause-condition))]
[clause-t (in-list (attribute clause-true))]
[clause-f (in-list (attribute clause-false))])
(list condition (list clause-t clause-f))))
; all the possible cases (each clause-condition can be #t or #f)
(define case-pairs (map (curryr list #f) (attribute clause-condition)))
(define all-cases (apply cartesian-product case-pairs))
; convert the set of cases into cond clauses
(define/with-syntax (cond-case ...)
(for/list ([case (in-list all-cases)])
; all the non-#f conditions need to be considered for the cond condition
(define conditions (filter identity case))
(define/with-syntax cond-condition
(if (empty? conditions)
#'else
(with-syntax ([(c ...) conditions])
#'(and c ...))))
(define big-bang-clauses
(for/list ([condition (in-list case)]
[clause-t (in-list (attribute clause-true))]
[clause-f (in-list (attribute clause-false))])
(if condition clause-t clause-f)))
(define/with-syntax (case-clause ...) (filter identity big-bang-clauses))
#'[cond-condition
(big-bang
world
constant-clause ...
case-clause ...)]))
#'(cond cond-case ...)]))
(define (big-bang* world
#:to-draw renderer
#:on-tick [tick (λ (w) w)]
#:tick-rate [tick-rate 1/30]
#:tick-limit [tick-limit #f]
#:on-key [key (λ (w k) w)]
#:on-release [release (λ (w k) w)]
#:on-pad [pad #f]
#:on-mouse [mouse (λ (w x y e) w)]
#:stop-when [stop (λ (w) #f)]
#:last-picture [last-picture #f]
#:record? [record #f]
#:name [n "World"])
(big-bang-cross-product
world
([to-draw renderer]
[on-key key]
[on-release release]
[on-mouse mouse]
[record? record]
[name n])
(pad
[on-pad pad])
(tick-limit
[on-tick tick tick-rate tick-limit]
[on-tick tick tick-rate])
(last-picture
[stop-when stop last-picture]
[stop-when stop])))
#lang typed/racket
(: cs151-core-version : String)
(define cs151-core-version "A6.0")
(provide cs151-core-version)
(: cs151-core-date : String)
(define cs151-core-date "September 30, 2019")
(provide cs151-core-date)
(define-syntax cs151-core-define-struct
(syntax-rules ()
[(cs151-core-define-struct (name A ...) (fields ...))
(define-struct (A ...) name (fields ...) #:transparent)]
[(cs151-core-define-struct (name A ...) (fields ...) #:mutable)
(define-struct (A ...) name (fields ...) #:transparent #:mutable)]
[(cs151-core-define-struct name (fields ...) #:mutable)
(define-struct name (fields ...) #:transparent #:mutable)]
[(cs151-core-define-struct name (fields ...))
(define-struct name (fields ...) #:transparent)]))
(provide (rename-out [cs151-core-define-struct define-struct]))
;; NOTE Make sure the CS tutors know about this change to define-struct
;; error reporting
;;
(: cs151-core-error : String -> Nothing)
(define (cs151-core-error msg) (error msg))
(provide (rename-out [cs151-core-error error]))
(: cs151-core-cons : (All (A) (-> A (Listof A) (Listof A))))
(define (cs151-core-cons hd tl) (cons hd tl))
(provide (rename-out [cs151-core-cons cons]))
(: cs151-core-first : (All (A) (Listof A) -> A))
(define (cs151-core-first xs) (first xs))
(provide (rename-out [cs151-core-first first]))
(: cs151-core-map : (All (A B) (-> (-> A B) (Listof A) (Listof B))))
(define (cs151-core-map f xs) (map f xs))
(provide (rename-out [cs151-core-map map]))
(: cs151-core-filter : (All (A) (-> (-> A Boolean) (Listof A) (Listof A))))
(define (cs151-core-filter f xs) (filter f xs))
(provide (rename-out [cs151-core-filter filter]))
(: cs151-core-foldl : (All (A B) (-> (-> A B B) B (Listof A) B)))
(define (cs151-core-foldl f acc xs) (foldl f acc xs))
(provide (rename-out [cs151-core-foldl foldl]))
(: cs151-core-foldr : (All (A B) (-> (-> A B B) B (Listof A) B)))
(define (cs151-core-foldr f acc xs) (foldr f acc xs))
(provide (rename-out [cs151-core-foldr foldr]))
(: cs151-core-partition :
(All (A) (-> (-> A Boolean) (Listof A) (values (Listof A) (Listof A)))))
(define (cs151-core-partition f xs) (partition f xs))
(provide (rename-out [cs151-core-partition partition]))
(: cs151-core-andmap : (All (A) (-> (-> A Boolean) (Listof A) Boolean)))
(define (cs151-core-andmap f xs) (andmap f xs))
(provide (rename-out [cs151-core-andmap andmap]))
(: cs151-core-ormap : (All (A) (-> (-> A Boolean) (Listof A) Boolean)))
(define (cs151-core-ormap f xs) (ormap f xs))
(provide (rename-out [cs151-core-ormap ormap]))
(: cs151-core-vector-map : (All (A B) (A -> B) (Vectorof A) -> (Vectorof B)))
(define (cs151-core-vector-map f v) (vector-map f v))
(provide (rename-out [cs151-core-vector-map vector-map]))
(: cs151-core-vector-filter : (All (A) (A -> Boolean) (Vectorof A) -> (Vectorof A)))
(define (cs151-core-vector-filter f v) (vector-filter f v))
(provide (rename-out [cs151-core-vector-filter vector-filter]))
(: cs151-core-vector-count : (All (A) (A -> Boolean) (Vectorof A) -> Integer))
(define (cs151-core-vector-count pred v) (vector-count pred v))
(provide (rename-out [cs151-core-vector-count vector-count]))
(: cs151-core-sqrt : Real -> Real)
(define (cs151-core-sqrt x)
(if (not (negative? x))
(sqrt x)
(error
(string-append "sqrt expects a nonnegative real; given "
(number->string x)))))
(provide (rename-out [cs151-core-sqrt sqrt]))
(provide (rename-out [sqrt full-sqrt]))
;; forbidden builtin functions
;;
(: forbidden-function : String -> String)
(define (forbidden-function f)
(string-append "cs151-core: " f
": You may not use the built-in function " f
" in this course; you must write your own such function."))
(: cs151-core-argmax : (All (A) (A -> Real) (Listof A) -> A))
(define (cs151-core-argmax f xs)
(error (forbidden-function "argmax")))
(provide (rename-out [cs151-core-argmax argmax]))
(: cs151-core-argmin : (All (A) (A -> Real) (Listof A) -> A))
(define (cs151-core-argmin f xs)
(error (forbidden-function "argmin")))
(provide (rename-out [cs151-core-argmin argmin]))
(: cs151-core-apply : (All (a b) (a * -> b) (Listof a) -> b))
(define (cs151-core-apply f xs)
(error (forbidden-function "apply")))
(provide (rename-out [cs151-core-apply apply]))
(: cs151-core-vector-argmin : (All (X) (X -> Real) (Vectorof X) -> X))
(define (cs151-core-vector-argmin f xs)
(error (forbidden-function "vector-argmin")))
(provide (rename-out [cs151-core-vector-argmin vector-argmin]))
(: cs151-core-vector-argmax : (All (X) (X -> Real) (Vectorof X) -> X))
(define (cs151-core-vector-argmax f xs)
(error (forbidden-function "vector-argmax")))
(provide (rename-out [cs151-core-vector-argmax vector-argmax]))
(: cs151-core-object-name : Any -> Any)
(define (cs151-core-object-name x)
(error (string-append "cs151-core: object-name: "
"You may not use the built-in function object-name in this course; "
"you must adopt an approach that does not require it.")))
(provide (rename-out [cs151-core-object-name object-name]))
(: cs151-core-list-set : (All (A) (Listof A) Integer A -> (Listof A)))
(define (cs151-core-list-set xs i y)
(error (forbidden-function "list-set")))
(provide (rename-out [cs151-core-list-set list-set]))
(: cs151-core-list-update : (All (A) (Listof A) Integer (-> A A) ->
(Listof A)))
(define (cs151-core-list-update xs i fn)
(error (forbidden-function "list-update")))
(provide (rename-out [cs151-core-list-update list-update]))
(: cs151-core-append* : (All (a) (-> (Listof (Listof a)) (Listof a))))
(define (cs151-core-append* lst)
(error (forbidden-function "append*")))
(provide (rename-out [cs151-core-append* append*]))
(: cs151-core-remove : (All (a) (-> Any (Listof a) (Listof a))))
(define (cs151-core-remove a lst)
(error (forbidden-function "remove")))
(provide (rename-out [cs151-core-remove remove]))
(: cs151-core-remove* : (All (a b) (->* ((Listof a) (Listof b)) ((-> a b Boolean)) (Listof b))))
(define (cs151-core-remove* lst1 lst2 [f equal?])
(error (forbidden-function "remove*")))
(provide (rename-out [cs151-core-remove* remove*]))
(: cs151-core-remove-duplicates : (All (a b)
(case->
(->* ((Listof a)) ((-> a a Any) #:key (U (-> a a) False)) (Listof a))
(->* ((Listof a)) ((-> b b Any) #:key (U (-> a b) False)) (Listof a)))))
(define (cs151-core-remove-duplicates l [=? equal?] #:key [key #f])
(error (forbidden-function "remove-duplicates")))
(provide (rename-out [cs151-core-remove-duplicates remove-duplicates]))
(: cs151-core-take : (All (a) (-> (Listof a) Integer (Listof a))))
(define (cs151-core-take lst i)
(error (forbidden-function "take")))
(provide (rename-out [cs151-core-take take]))
(: cs151-core-drop : (All (a) (-> (Listof a) Integer (Listof a))))
(define (cs151-core-drop lst i)
(error (forbidden-function "drop")))
(provide (rename-out [cs151-core-drop drop]))
(: cs151-core-member : (All (a b)
(case->
(-> Any (Listof a) (U (Pairof a (Listof a)) False))
(-> b (Listof a) (-> b a Any) (U (Pairof a (Listof a)) False)))))
(define cs151-core-member
(case-lambda
[(a lst) (error (forbidden-function "member"))]
[(a lst b) (error (forbidden-function "member"))]))
(provide (rename-out [cs151-core-member member]))
(: cs151-core-list-tail : (All (a) (-> (Listof a) Integer (Listof a))))
(define (cs151-core-list-tail lst i)
(error (forbidden-function "list-tail")))
(provide (rename-out [cs151-core-list-tail list-tail]))
(: cs151-core-vector-append : (All (a) (-> (Vectorof a) * (Vectorof a))))
(define (cs151-core-vector-append . lst)
(error (string-append "cs151-core: vector-append: "
"You may not use the built-in function vector-append in this course; "
"efficiency dictates that you create a single vector of the "
"needed length from the start and fill it in, rather than "
"concatenating smaller vectors.")))
(provide (rename-out [cs151-core-vector-append vector-append]))
(: forbidden-equality : (-> String String))
(define (forbidden-equality f)
(string-append "cs151-core: " f
": You may not use the built-in function " f
" in this course; you must use a type-specific "
"comparison function, such as = for numeric types, "
"string=? for Strings, etc."))
(: cs151-core-equal? : (-> Any Any Boolean))
(define (cs151-core-equal? a b)
(error (forbidden-equality "equal?")))
(provide (rename-out [cs151-core-equal? equal?]))
(: cs151-core-eqv? : (-> Any Any Boolean))
(define (cs151-core-eqv? a b)
(error (forbidden-equality "eqv?")))
(provide (rename-out [cs151-core-eqv? eqv?]))
(: cs151-core-eq? : (-> Any Any Boolean))
(define (cs151-core-eq? a b)
(error (forbidden-equality "eq?")))
(provide (rename-out [cs151-core-eq? eq?]))
(define-syntax cs151-core-set!
(syntax-rules ()
[(cs151-core-set! var val)
(error
"you may not mutate the value of a variable binding in this course")]))
(provide (rename-out [cs151-core-set! set!]))
#lang typed/racket/base
(require (for-syntax racket/base
racket/function
racket/syntax
syntax/parse)
"cs151-image.rkt"
(only-in 2htdp/universe
to-draw
on-tick
on-key
on-release
on-pad
on-mouse
stop-when
record?
name))
;; simple exports
;; ---------------------------------------------------------------------------------------------------
(require/typed/provide
2htdp/universe
; 2.4.2 Simple Simulations
[animate ((Natural -> Image) -> Natural)]
[run-simulation ((Natural -> Image) -> #t)]
[run-movie (Positive-Real (Listof Image) -> #t)]
; 2.4.3 Interactions
[key-event? (Any -> Boolean)]
[key=? (String String -> Boolean)]
[pad-event? (Any -> Boolean)]
[pad=? (String String -> Boolean)]
[mouse-event? (Any -> Boolean)]
[mouse=? (Mouse-Event Mouse-Event -> Boolean)])
;; derived/reimplemented exports
;; ---------------------------------------------------------------------------------------------------
(provide
Mouse-Event Mouse-Event?)
;; derived types
;; ---------------------------------------------------------------------------------------------------
; these would be nice, but due to how TR prints type aliases, they need to be ignored
; (define-type Scene Image)
; (define-type Key-Event String)
; (define-type Pad-Event Key-Event)
(define-type Mouse-Event (U "button-down" "button-up" "drag" "move" "enter" "leave"))
(define-predicate Mouse-Event? Mouse-Event)
;; typed big-bang
;; ---------------------------------------------------------------------------------------------------
(provide big-bang
to-draw
on-tick
on-key
on-release
on-pad
on-mouse
stop-when
record?
name)
(require/typed
"cs151-big-bang.rkt"
[big-bang*
(All [World]
(->* [World
#:to-draw (World -> Image)]
[#:on-tick (World -> World)
#:tick-rate Positive-Real
#:tick-limit (Option Positive-Integer)
#:on-key (World String -> World)
#:on-release (World String -> World)
#:on-pad (Option (World String -> World))
#:on-mouse (World Integer Integer Mouse-Event -> World)
#:stop-when (World -> Boolean)
#:last-picture (Option (World -> Image))
#:record? Any
#:name (U String Symbol)]
World))])
(define-syntax (big-bang stx)
(syntax-parse stx
#:literals (: to-draw on-tick on-key on-release on-pad on-mouse stop-when record? name)
[(_
(~describe "initial-world-state : world-state-type"
(~seq initial-state:expr : world-type:expr))
(~or (~once [to-draw draw:expr] #:name "to-draw clause")
(~optional (~or [on-tick tick:expr]
[on-tick tick:expr tick-rate:expr]
[on-tick tick:expr tick-rate:expr tick-limit:expr])
#:name "on-tick clause"
#:defaults ([tick #f] [tick-rate #f] [tick-limit #f]))
(~optional [on-key key:expr] #:name "on-key clause" #:defaults ([key #f]))
(~optional [on-release release:expr] #:name "on-release clause" #:defaults ([release #f]))
(~optional [on-pad pad:expr] #:name "on-pad clause" #:defaults ([pad #f]))
(~optional [on-mouse mouse:expr] #:name "on-mouse clause" #:defaults ([mouse #f]))
(~optional (~or [stop-when stop:expr]
[stop-when stop:expr last-picture:expr])
#:name "stop-when clause"
#:defaults ([stop #f] [last-picture #f]))
(~optional [record? record:expr] #:name "record? clause" #:defaults ([record #f]))
(~optional [name nm:expr] #:name "name clause" #:defaults ([nm #f])))
...)
(define clauses
(list #'[#:to-draw draw]
(and (attribute tick) #'[#:on-tick tick])
(and (attribute tick-rate) #'[#:tick-rate tick-rate])
(and (attribute tick-limit) #'[#:tick-limit tick-limit])
(and (attribute key) #'[#:on-key key])
(and (attribute release) #'[#:on-release release])
(and (attribute pad) #'[#:on-pad pad])
(and (attribute mouse) #'[#:on-mouse mouse])
(and (attribute stop) #'[#:stop-when stop])
(and (attribute last-picture) #'[#:last-picture last-picture])
(and (attribute record) #'[#:record? record])
(and (attribute nm) #'[#:name nm])))
(define/with-syntax (clause ...)
(apply append (map syntax->list (filter identity clauses))))
(quasisyntax/loc stx
((inst big-bang* world-type)
#,(syntax/loc stx (ann initial-state world-type))
clause ...))]))
W1 W1 W1 _ _ W7 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|0|0|15|5@B@2!W1 W1 W1 _ _ W7 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1|0|0|14|5@B@3 2!W1 W1 W1 _ _ W7 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1|0|0|14|5@W@!W1 _ W1 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1|0|0|14|5@W@4!W1 _ W2 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1|0|0|14|4@W@3 4!W1 _ W2 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1|0|0|14|4@B@!W1 _ W2 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1|0|0|13|4@B@2!W1 _ W2 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 B1|0|0|12|4@B@2 5!W1 _ W2 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 B1|0|0|12|4@W@!W1 _ W3 _ _ W8 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 B1|0|0|12|3@W@3!W1 _ W3 _ _ W9 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 B1|0|0|12|2@W@6 3!W1 _ W3 _ _ W9 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 B1|0|0|12|2@B@!W1 _ W3 _ _ W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 _ _ _ B1 B1|0|0|12|2@B@3!W1 _ W3 _ _ W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 _ _ B1 B1|0|0|11|2@B@3 5!W1 _ W3 _ _ W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 _ _ B1 B1|0|0|11|2@W@!W1 _ W3 W1 _ W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 _ _ B1 B1|0|0|11|1@W@4!W1 _ W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 _ _ B1 B1|0|0|11|0@W@5 4!W1 _ W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B1 _ _ B1 B1|0|0|11|0@B@!W1 _ W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B1 B2 _ _ _ B1|0|0|11|0@B@3!W1 _ W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ _ B1|0|0|10|0@B@6 3!W1 _ W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ _ B1|0|0|10|0@W@!_ W1 W3 W1 W1 W9 _ _ _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ _ B1|0|0|10|0@W@1!_ W1 W2 W1 W1 W9 _ W1 _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ _ B1|0|0|10|0@W@5 1!_ W1 W2 W1 W1 W9 _ W1 _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ _ B1|0|0|10|0@B@!_ W1 W2 W1 W1 W9 _ W1 _ _ _ _ _ _ _ _ _ _ B2 B2 _ _ B1 B1|0|0|9|0@B@2!_ W1 W2 W1 W1 W9 _ W1 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B1 B1|0|0|8|0@B@5 2!_ W1 W2 W1 W1 W9 _ W1 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B1 B1|0|0|8|0@W@!_ W1 W2 _ W1 W9 _ W2 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B1 B1|0|0|8|0@W@4!_ _ W2 _ W1 W9 _ W3 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B1 B1|0|0|8|0@W@4 6!_ _ W2 _ W1 W9 _ W3 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B1 B1|0|0|8|0@B@!_ _ W2 _ W1 W9 _ W3 _ _ _ _ _ _ _ _ _ _ B2 B3 _ _ B2 B1|0|0|7|0@B@2!_ _ W2 _ W1 W9 _ W3 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B2 B1|0|0|6|0@B@2 6!_ _ W2 _ W1 W9 _ W3 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B2 B1|0|0|6|0@W@!_ _ W2 _ W1 W8 W1 W3 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B2 B1|0|0|6|0@W@1!_ _ W1 _ W1 W8 W1 W4 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B2 B1|0|0|6|0@W@1 5!_ _ W1 _ W1 W8 W1 W4 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B2 B1|0|0|6|0@B@!_ _ W1 _ W1 W8 W1 W4 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B1|0|0|5|0@B@2!_ _ W1 _ W1 W8 W1 W4 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B2|0|0|4|0@B@1 2!_ _ W1 _ W1 W8 W1 W4 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B2|0|0|4|0@W@!_ _ _ _ W1 W8 W1 W5 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B2|0|0|4|0@W@5!_ _ _ _ W1 W7 W2 W5 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B2|0|0|4|0@W@1 5!_ _ _ _ W1 W7 W2 W5 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B3 B2|0|0|4|0@B@!_ _ _ _ W1 W7 W2 W5 _ _ _ _ _ _ _ _ _ _ B3 B3 _ _ B4 B2|0|0|3|0@B@2!_ _ _ _ W1 W7 W2 W5 _ _ _ _ _ _ _ _ _ _ B4 B3 _ _ B4 B2|0|0|2|0@B@2 6!_ _ _ _ W1 W7 W2 W5 _ _ _ _ _ _ _ _ _ _ B4 B3 _ _ B4 B2|0|0|2|0@W@!_ _ _ _ W1 W7 W2 W4 _ _ _ _ W1 _ _ _ _ _ B4 B3 _ _ B4 B2|0|0|2|0@W@5!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B3 _ _ B4 B2|0|0|2|0@W@6 5!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B3 _ _ B4 B2|0|0|2|0@B@!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B4 _ _ B4 B1|0|0|2|0@B@4!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B5 _ _ B4 _|0|0|2|0@B@4 4!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B5 B1 _ B4 _|0|0|1|0@B@4 4 4!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B5 B2 _ B4 _|0|0|0|0@B@4 4 4 4!_ _ _ _ W1 W7 W1 W4 _ _ _ _ W2 _ _ _ _ _ B4 B5 B2 _ B4 _|0|0|0|0@W@!_ _ _ _ W1 W7 _ W4 _ _ _ _ W3 _ _ _ _ _ B4 B5 B2 _ B4 _|0|0|0|0@W@6!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ _ _ _ B4 B5 B2 _ B4 _|0|0|0|0@W@4 6!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ _ _ _ B4 B5 B2 _ B4 _|0|0|0|0@B@!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ _ _ _ B5 B5 B1 _ B4 _|0|0|0|0@B@2!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ _ _ B1 B5 B4 B1 _ B4 _|0|0|0|0@B@2 2!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ B1 _ _ B5 B4 B1 _ B4 _|0|0|0|0@B@2 2 2!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ B1 _ B1 B5 B3 B1 _ B4 _|0|0|0|0@B@2 2 2 2!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W3 _ _ B1 _ B1 B5 B3 B1 _ B4 _|0|0|0|0@W@!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W2 _ _ B1 W1 B1 B5 B3 B1 _ B4 _|0|0|0|0@W@4!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W2 _ _ B1 _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@W@5 4!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W2 _ _ B1 _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@B@!_ _ _ _ W1 W7 _ W3 _ _ _ W1 W2 _ B1 _ _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@B@1!_ _ _ _ W1 W7 _ W3 _ B1 _ W1 W2 _ _ _ _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@B@1 5!_ _ _ _ W1 W7 _ W3 _ B1 _ W1 W2 _ _ _ _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@W@!_ _ _ _ W1 W7 _ W3 _ B1 _ _ W2 W1 _ _ _ B1 B5 B3 B1 W1 B4 _|0|0|0|0@W@2!_ _ _ _ W1 W7 _ W3 _ B1 _ _ W2 W1 _ _ _ B1 B5 B3 B1 _ B4 _|0|1|0|0@W@2 3!_ _ _ _ W1 W7 _ W3 _ B1 _ _ W2 W1 _ _ _ B1 B5 B3 B1 _ B4 _|0|1|0|0@B@!_ _ _ _ W1 W7 _ W3 _ B1 _ _ W2 W1 _ _ _ B2 B5 B3 _ _ B4 _|0|1|0|0@B@3!_ _ _ B1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B2 B5 B3 _ _ B4 _|0|1|0|0@B@6 3!_ _ _ B1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B2 B5 B3 _ _ B4 _|0|1|0|0@W@5 2!_ _ _ B1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B2 B5 B3 _ _ B4 _|0|1|0|0@B@!_ _ _ B1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B3 B5 B2 _ _ B4 _|0|1|0|0@B@2!_ _ _ B1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B4 B5 B1 _ _ B4 _|0|1|0|0@B@2 2!_ B1 _ W1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B4 B5 B1 _ _ B4 _|0|0|0|0@B@2 2 2!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B4 B5 B1 _ _ B4 _|1|0|0|0@B@2 2 2 2!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 W1 _ _ _ B4 B5 B1 _ _ B4 _|1|0|0|0@W@!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 _ _ W1 _ B4 B5 B1 _ _ B4 _|1|0|0|0@W@2!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 _ _ B1 _ B4 B5 B1 _ W1 B4 _|0|0|0|0@W@6 2!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 _ _ B1 _ B4 B5 B1 _ W1 B4 _|0|0|0|0@B@!_ _ _ W1 W1 W7 _ W3 _ _ _ _ W2 _ B1 B1 _ B4 B5 _ _ W1 B4 _|0|0|0|0@B@5!_ _ _ W1 W1 W7 _ W3 B1 _ _ _ W2 _ _ B1 _ B4 B5 _ _ W1 B4 _|0|0|0|0@B@6 5!_ _ _ W1 W1 W7 _ W3 B1 _ _ _ W2 _ _ B1 _ B4 B5 _ _ W1 B4 _|0|0|0|0@W@!_ _ _ W1 W1 W7 _ W3 B1 _ _ _ W2 _ _ B1 _ B4 B5 _ _ _ B4 W1|0|0|0|0@W@2!_ _ _ W1 W1 W7 _ W2 B1 _ _ _ W2 W1 _ B1 _ B4 B5 _ _ _ B4 W1|0|0|0|0@W@2 6!_ _ _ W1 W1 W7 _ W2 B1 _ _ _ W2 W1 _ B1 _ B4 B5 _ _ _ B4 W1|0|0|0|0@B@!_ _ _ W1 W1 W7 _ W2 B1 B1 _ _ W2 W1 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@B@6!_ _ _ W1 W1 W7 B1 W2 _ B1 _ _ W2 W1 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@B@6 2!_ _ _ W1 W1 W7 B1 W2 _ B1 _ _ W2 W1 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@W@!_ _ _ W1 W1 W7 B1 W1 _ B1 _ _ W3 W1 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@W@5!_ _ _ W1 W1 W7 B1 _ _ B1 _ _ W3 W2 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@W@5 6!_ _ _ W1 W1 W7 B1 _ _ B1 _ _ W3 W2 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@B@!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W2 _ _ _ B4 B5 _ _ _ B4 W1|0|0|0|0@B@3!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W2 _ _ _ B4 B5 _ B1 _ B3 W1|0|0|0|0@B@3 2!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W2 _ _ _ B4 B5 _ B1 _ B3 W1|0|0|0|0@W@!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W1 W1 _ _ B4 B5 _ B1 _ B3 W1|0|0|0|0@W@1!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W1 _ _ _ B4 B5 W1 B1 _ B3 W1|0|0|0|0@W@5 1!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 W1 _ _ _ B4 B5 W1 B1 _ B3 W1|0|0|0|0@B@!B1 _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 W1 B1 _ B3 W1|0|0|0|0@B@6!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 W1 B1 _ B3 W1|1|0|0|0@B@1 6!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 W1 B1 _ B3 W1|1|0|0|0@W@!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 B1 B1 W1 B3 W1|0|0|0|0@W@2!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 B1 B1 _ B3 W1|0|1|0|0@W@2 3!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B4 B5 B1 B1 _ B3 W1|0|1|0|0@B@!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 _ _ _ B5 B5 _ B1 _ B3 W1|0|1|0|0@B@2!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 B1 _ _ B5 B5 _ W1 _ B3 W1|0|0|0|0@B@2 6!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 W1 B1 _ _ B5 B5 _ W1 _ B3 W1|0|0|0|0@W@!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 _ B1 W1 _ B5 B5 _ W1 _ B3 W1|0|0|0|0@W@2!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 _ B1 W1 _ B5 B5 _ _ _ B3 W2|0|0|0|0@W@3 2!_ _ _ W1 W1 W7 B1 _ _ _ _ _ W3 _ B1 W1 _ B5 B5 _ _ _ B3 W2|0|0|0|0@B@!_ _ _ W1 W1 W7 B1 _ B1 _ _ _ W3 _ _ W1 _ B5 B5 _ _ _ B3 W2|0|0|0|0@B@6!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ W1 _ B5 B5 _ _ _ B3 W2|0|0|0|0@B@6 2!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ W1 _ B5 B5 _ _ _ B3 W2|0|0|0|0@W@!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ _ _ B5 B5 _ W1 _ B3 W2|0|0|0|0@W@5!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ _ _ B5 B5 _ _ _ B3 W3|0|0|0|0@W@3 5!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ _ _ B5 B5 _ _ _ B3 W3|0|0|0|0@B@6 6 6!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ _ B1 B5 B5 _ _ _ B2 W3|0|0|0|0@B@6 6 6 6!_ _ _ W1 W1 W7 B2 _ _ _ _ _ W3 _ _ _ B1 B5 B5 _ _ _ B2 W3|0|0|0|0@W@!_ _ _ W1 W1 W6 B2 _ _ _ _ W1 W3 _ _ _ B1 B5 B5 _ _ _ B2 W3|0|0|0|0@W@6!_ _ _ W1 W1 W6 B2 _ _ _ _ _ W4 _ _ _ B1 B5 B5 _ _ _ B2 W3|0|0|0|0@W@6 1!_ _ _ W1 W1 W6 B2 _ _ _ _ _ W4 _ _ _ B1 B5 B5 _ _ _ B2 W3|0|0|0|0@B@!_ _ _ W1 W1 W6 B2 _ _ _ _ _ W4 _ _ _ B2 B5 B5 _ _ _ B1 W3|0|0|0|0@B@6!_ _ _ W1 W1 W6 B2 _ _ _ _ _ W4 _ _ _ B3 B5 B5 _ _ _ _ W3|0|0|0|0@B@6 6!_ _ _ W1 W1 W6 B2 _ _ _ _ B1 W4 _ _ _ B3 B4 B5 _ _ _ _ W3|0|0|0|0@B@6 6 6!_ _ _ W1 W1 W6 B2 _ _ _ _ B2 W4 _ _ _ B3 B3 B5 _ _ _ _ W3|0|0|0|0@B@6 6 6 6!_ _ _ W1 W1 W6 B2 _ _ _ _ B2 W4 _ _ _ B3 B3 B5 _ _ _ _ W3|0|0|0|0@W@!_ _ _ _ W1 W6 B2 _ _ W1 _ B2 W4 _ _ _ B3 B3 B5 _ _ _ _ W3|0|0|0|0@W@6!_ _ _ _ W1 W6 B2 _ _ _ _ B2 W5 _ _ _ B3 B3 B5 _ _ _ _ W3|0|0|0|0@W@3 6!_ _ _ _ W1 W6 B2 _ _ _ _ B2 W5 _ _ _ B3 B3 B5 _ _ _ _ W3|0|0|0|0@B@!_ _ _ _ W1 W6 B2 _ _ _ _ B3 W5 _ _ _ B3 B2 B5 _ _ _ _ W3|0|0|0|0@B@6!_ _ _ _ W1 W6 B2 _ _ _ _ B4 W5 _ _ _ B3 B1 B5 _ _ _ _ W3|0|0|0|0@B@6 6!_ _ _ _ W1 W6 B2 _ _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W3|0|0|0|0@B@6 6 6!B1 _ _ _ W1 W6 B1 _ _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W3|0|0|0|0@B@6 6 6 6!B1 _ _ _ W1 W6 B1 _ _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W3|0|0|0|0@W@!B1 _ _ _ _ W6 B1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W3|0|0|0|0@W@3!B1 _ _ _ _ W6 B1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|1|0|0@W@1 3!B1 _ _ _ _ W6 B1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|1|0|0@B@!B1 _ B1 _ _ W6 W1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|0|0|0@B@4!B2 _ _ _ _ W6 W1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|0|0|0@B@2 4!B2 _ _ _ _ W6 W1 W1 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|0|0|0@W@!B2 _ _ _ _ W5 W1 W2 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|0|0|0@W@2!B2 _ _ _ _ W5 _ W3 _ _ _ B5 W5 _ _ _ B3 _ B5 _ _ _ _ W2|0|0|0|0@W@2 1
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment