View in color | License | Download script | History | Other scripts by: janeks |
30-Apr 11:17 UTC
[0.186] 49.629k
[0.186] 49.629k
cl4mapserv.rREBOL [
Title: "Mapserver client: Demo map"
Version: 0.2.3
Author: "Janeks Kamerovskis"
Purpose: { Simple Mapserver (http://mapserver.gis.umn.edu) client.}
File: %cl4mapserv.r
Date: 13-Mar-2006
library: [
level: 'intermediate
platform: [ all plugin ]
type: [ demo ]
domain: [ vid ]
plugin: [size: 240x100]
tested-under: [ View 1.2.1.3.1 "WinXP" ]
support: none
license: none
see-also: none
]
]
mapserver-exe-base: "http://terrasip.gis.umn.edu/cgi-bin/mapserv40"
mapserver-cgivars: [
"map=/data/projects/tutorial/example2-2.map"
"mode=map"
]
mapserver-layers: [
"states"
"hydro"
"roads"
]
if not value? 'mapsize [
mapsize: 400x300
]
if not value? 'imgType [
imgType: "GIF"
]
mapFileName: to-file rejoin [ "mapImg." imgType ]
base-mapext: [ 201621.496941 -355683.111522 1425518.020722 559449.337703 ]
mouse-map-xy: [ 0 0 ]
rubber-box: [
pen red
box none none
]
mapext: base-mapext
extents-history: []
repend extents-history [ mapext ]
extents-history: tail extents-history
rejoin: func [
"Reduces and joins a block of values."
block [block!] "Values to reduce and join"
/with string [ string! ]
][
if empty? block: reduce block [return block]
if with [ block: next block forskip block 2 [ insert block string ] ]
block: head block
append either series? first block [copy first block] [
form first block] next block
]
mapserver-cgivar-mapsize: rejoin [ "mapsize=" first mapsize "+" second mapsize ]
mapserver-cgivar-mapext: rejoin [ "mapext=" rejoin/with mapext "+" ]
Round: func [
"Rounds a Number At any given Place."
[catch]
Number [number!] "Number to round."
/At Place [integer!] "Optional Places."
][
throw-on-error [
Place: either none? Place [1] [10 ** Place]
Number: Place * Number
Number: Number + either positive?
Number [0.5][-0.5]
Number: Number - (Number // 1)
Number / Place
]
]
pad-decimal: func [value [number!] len [integer!] /local s] [
s: form value
either value = to-integer value [
head insert tail s #"."
head insert/dup tail s #"0" len
][
head insert/dup tail s #"0" len - ((length? s) - index? find s #".")
]
]
imgxy-to-mapxy: func [ imgxy ][
return reduce [
mapext/1 + ((((mapext/3) - (mapext/1)) / mapsize/1) * imgxy/1)
mapext/2 + ((((mapext/4) - (mapext/2)) / mapsize/2) * ( mapsize/2 - imgxy/2 ))
]
]
rbox-to-mapext: func [
startxy
endxy
/local startp endp
][
startp: 0x0
endp: 0x0
startp/x: min startxy/x endxy/x
startp/y: min startxy/y endxy/y
endp/x: max startxy/x endxy/x
endp/y: max startxy/y endxy/y
startxy: startp
endxy: endp
either ((endxy/x - startxy/x) / (endxy/y - startxy/y)) > (mapsize/x / mapsize/y) [
rubber-box/4/x: startxy/x
rubber-box/4/y: startxy/y - ( 0.5 * ( ((endxy/x - startxy/x) / (mapsize/x / mapsize/y)) - (endxy/y - startxy/y) ) )
rubber-box/5/x: endxy/x
rubber-box/5/y: endxy/y + ( 0.5 * ( ((endxy/x - startxy/x) / (mapsize/x / mapsize/y)) - (endxy/y - startxy/y) ) )
][
rubber-box/4/x: startxy/x - ( 0.5 * ( ((endxy/y - startxy/y) * (mapsize/x / mapsize/y)) - (endxy/x - startxy/x) ) )
rubber-box/4/y: startxy/y
rubber-box/5/x: endxy/x + ( 0.5 * ( ((endxy/y - startxy/y) * (mapsize/x / mapsize/y)) - (endxy/x - startxy/x) ) )
rubber-box/5/y: endxy/y
]
return reduce [
first imgxy-to-mapxy reduce [ rubber-box/4/x rubber-box/5/y ]
second imgxy-to-mapxy reduce [ rubber-box/4/x rubber-box/5/y ]
first imgxy-to-mapxy reduce [ rubber-box/5/x rubber-box/4/y ]
second imgxy-to-mapxy reduce [ rubber-box/5/x rubber-box/4/y ]
]
]
zoomout-ext: func [ cur-ext zoom-ext ][
return reduce [
2 * cur-ext/1 - zoom-ext/1
2 * cur-ext/2 - zoom-ext/2
2 * cur-ext/3 - zoom-ext/3
2 * cur-ext/4 - zoom-ext/4
]
]
create-mapserver-url: func [ mapext ][
myUrl: to-url rejoin [
mapserver-exe-base "?"
rejoin/with [
rejoin/with mapserver-cgivars "&"
rejoin [ "layers=" rejoin/with mapserver-layers "+" ]
rejoin [ "mapext=" rejoin/with mapext "+" ]
rejoin [ "map_size=" mapsize/x "+" mapsize/y ]
rejoin [ "map_imagetype=" imgType ]
]
"&"
]
]
create-mapserver-url mapext
tools-switch: func [ on-tool ][
if all [ tgBtn-zoomin/state on-tool <> 1 ] [ tgBtn-zoomin/state: false]
if on-tool = 1 [ tgBtn-zoomin/state: true ]
if all [ tgBtn-zoomout/state on-tool <> 2 ] [ tgBtn-zoomout/state: false ]
if on-tool = 2 [ tgBtn-zoomout/state: true ]
if all [ tgBtn-pan/state on-tool <> 3 ] [ tgBtn-pan/state: false ]
if on-tool = 3 [ tgBtn-pan/state: true ]
; if all [ tgBtn-info/state on-tool <> 4 ] [ tgBtn-info/state: false ]
; if on-tool = 4 [ tgBtn-info/state: true ]
show tgBtn-zoomin
show tgBtn-zoomout
show tgBtn-pan
; show tgBtn-info
]
backb-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
A1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000
000000626E6FA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
A1B6B6626E6F000000000000B4CCCC000000626E6F626E6F626E6F626E6F
626E6F626E6F626E6F626E6F626E6F626E6F626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCC
000000000000000000000000000000000000000000000000000000000000
000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
000000000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCC
A1B6B6626E6F000000000000000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
000000000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCC
000000000000000000000000000000000000000000000000000000000000
000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
A1B6B6626E6F000000000000B4CCCC000000626E6F626E6F626E6F626E6F
626E6F626E6F626E6F626E6F626E6F626E6F626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000
000000626E6FA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6000000626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
A1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
forwb-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6A1B6B6A1B6B6626E6F000000000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F626E6F
626E6F626E6F626E6F626E6F626E6F626E6F626E6F626E6F626E6F000000
B4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCA1B6B6626E6F000000000000000000000000000000000000000000
000000000000000000000000000000B4CCCCB4CCCC000000000000626E6F
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
000000000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC000000
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCA1B6B6626E6F000000000000000000000000000000000000000000
000000000000000000000000000000B4CCCCB4CCCC000000000000626E6F
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F626E6F
626E6F626E6F626E6F626E6F626E6F626E6F626E6F626E6F626E6F000000
B4CCCC000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6A1B6B6A1B6B6626E6F000000000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
infobt-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
A1B6B6000000000000000000000000A1B6B6A1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6000000000000000000000000000000
000000A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
000000000000000000000000000000000000A1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6000000000000000000000000000000
000000A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
A1B6B6000000000000000000000000A1B6B6A1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6A1B6B6A1B6B6A1B6B6A1B6B6
A1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
626E6F626E6F626E6F626E6F626E6F626E6F626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000000000000000000000000000
000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000000000000000000000000000000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6626E6F626E6F000000000000000000000000
626E6F626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
626E6F000000000000000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000000000000000000000
626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F
626E6F000000000000000000000000626E6F626E6FA1B6B6B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA1B6B6626E6F000000000000000000000000000000000000
000000000000626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6626E6F000000
000000000000000000000000000000000000000000626E6FA1B6B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCA1B6B6626E6F626E6F626E6F626E6F626E6F626E6F
626E6F626E6FA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA1B6B6
A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6A1B6B6B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
zoominbt-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCACC2C382939569777A
6573757585879CB1B2B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
AAC1C15965681C1F24171A1F171A1F171A1F171A1F171A1F373F438B9E9F
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC9CB1B22C3236171A1F272B306671747E8D8F
859596738183434B4F171A1F191C216C7A7CB3CBCBB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA7BEBE2A2F34
171A1F576164C5DBDCD6EEEE535D60171A1FC2D8D8D6EEEE8C9C9D21252A
171A1F6F7F81B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB2CACA515C5F171A1F596366D6EEEED6EEEED6EEEE535D60
171A1FC2D8D8D6EEEED6EEEEA4B7B8171A1F1F24289AAFB1B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC9DB2B31B1E23272B30
C6DCDDD6EEEED6EEEED6EEEE535D60171A1FC2D8D8D6EEEED6EEEED6EEEE
667174171A1F556063AEC5C5B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC6A797B171A1F667174D6EEEED6EEEED6EEEED6EEEE535D60
171A1FC2D8D8D6EEEED6EEEED6EEEEB4C8C9171A1F2F363AA1B7B7B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC4F5A5C171A1F7F8E90
525C5F525C5F525C5F525C5F292E33171A1F4C5558525C5F525C5F525C5F
8B9A9C1E222621262A92A6A7B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC485255171A1F869697171A1F171A1F171A1F171A1F171A1F
171A1F171A1F171A1F171A1F171A1F6C797B282D321E23278A9C9DB0C8C8
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC525D60171A1F738082
C3D9D9C3D9D9C3D9D9C3D9D94D5659171A1FB1C5C6C3D9D9C3D9D9C3D9D9
BACFCF171A1F262B308A9D9EB0C8C8B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC707F81171A1F434B4FD4ECECD6EEEED6EEEED6EEEE535D60
171A1FC2D8D8D6EEEED6EEEED6EEEE92A2A4171A1F3C434793A6A8B2CACA
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC90A4A52B3035171A1F
8C9C9DD6EEEED6EEEED6EEEE535D60171A1FC2D8D8D6EEEED6EEEEC5DBDC
22272C171A1F606C6FA1B7B7B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA6BCBD637073181C2122262BA5B8B9D6EEEED6EEEE535D60
171A1FC2D8D8D6EEEEC5DBDC2A2F34171A1F171A1F5D696BADC4C4B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB2C9CA98ACAD4B5559
171A1F181B20667275B2C7C78B9B9D6D7A7CB9CECE91A1A322272C171A1F
32383C1E2227181B206F7E81B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB1C9C990A3A4545F621E2227171A1F171A1F1C2025
282C31171A1F171A1F171A1F181B201E22277583851D2126181B206F7E7F
B3CBCBB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAFC7C7
9AAFB07585874751542D333721252A1E2227262B303B43475E6A6D546063
181C211E22277582841D2126181B206E7D7FB1C9C9B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCABC2C29AAFB08A9D9E7E8F91
7B8C8E8192948DA0A1A0B5B6A5BBBC5E6A6D181C211E22277582841D2126
191C216B797BB2C9CAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB1C9C9AEC5C5ADC4C4AFC6C6B2C9CAB4CCCCB4CCCC
A8BEBF5F6C6E181C211E22277582841D2126191C21809192B1C9C9B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCADC4C4626F71181C211D2126
272C31171A1F5E6B6DA2B8B9B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCAAC1C1616E71181C21171A1F40484C768688A4BABBB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAFC6C6758587
5C696C78888A9DB2B2B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCAEC5C5A1B7B7A5BBBBB3CBCBB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
zoomoutbt-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCACC2C382939569777A
6573757585879CB1B2B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
AAC1C15965681C1F24171A1F171A1F171A1F171A1F171A1F373F438B9E9F
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC9CB1B22C3236171A1F272B306671748A9A9C
98AAAB758385434B4F171A1F191C216C7A7CB3CBCBB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCA7BEBE2A2F34
171A1F576164C5DBDCD6EEEED6EEEED6EEEED6EEEED6EEEE8C9C9D21252A
171A1F718082B2C9CAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB2CACA515C5F171A1F596366D6EEEED6EEEED6EEEED6EEEE
D6EEEED6EEEED6EEEED6EEEEADC1C21C20251F23289CB0B1B4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC9DB2B31B1E23272B30
C6DCDDD6EEEED6EEEED6EEEED6EEEED6EEEED6EEEED6EEEED6EEEED6EEEE
727F81171A1F566164ADC5C5B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC6A797B171A1F667174D6EEEED6EEEED6EEEED6EEEED6EEEE
D6EEEED6EEEED6EEEED6EEEED6EEEEBBD1D1171A1F363D41A1B7B7B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC4F5A5C171A1F7F8E90
525C5F525C5F525C5F525C5F525C5F525C5F525C5F525C5F525C5F525C5F
8C9C9E1F2328262B2F92A6A7B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC485255171A1F869697171A1F171A1F171A1F171A1F171A1F
171A1F171A1F171A1F171A1F171A1F6C797B292E331F23288A9D9EB0C8C8
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC525D60171A1F738082
C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9C3D9D9
BACFD0171A1F272C308A9D9EB0C8C8B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCC707F81171A1F434B4FD4ECECD6EEEED6EEEED6EEEED6EEEE
D6EEEED6EEEED6EEEED6EEEED6EEEE92A2A4171A1F3C434793A6A8B2CACA
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC90A4A52B3035171A1F
8C9C9DD6EEEED6EEEED6EEEED6EEEED6EEEED6EEEED6EEEED6EEEEC5DBDC
22272C171A1F606D6FA1B7B7B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCA6BCBD637073181C2122262BA5B8B9D6EEEED6EEEED6EEEE
D6EEEED6EEEED6EEEECBE1E12B3035171A1F171A1F5C686BADC4C4B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB2C9CA98ACAD4B5559
171A1F181B20677376B4C8C9D2E9E9D6EEEECAE0E197A8AA2C3136171A1F
32383C1E2227181B206F7E81B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB1C9C98FA2A3545F621E2227171A1F171A1F1D2126
2A2F33171A1F171A1F171A1F181B201E22277583851D2126181B206F7E7F
B3CBCBB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAFC7C7
9AAFB07484864751542D333721252A2025292E34383C44485F6B6F546063
181C211E22277582841D2126181B206E7D7FB1C9C9B4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAAC1C19AAEAF8A9C9D7E8F91
7B8C8E8192948D9FA19FB4B5A5BBBC5E6A6D181C211E22277582841D2126
191C216B797BB2C9CAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB0C8C8AEC5C5ADC4C4AFC6C6B2C9CAB4CCCCB4CCCC
A8BEBF5F6C6E181C211E22277582841D2126191C21809192B1C9C9B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCADC4C4626F71181C211D2126
272C31171A1F5E6B6DA2B8B9B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCAAC1C1616E71181C21171A1F40484C768688A4BABBB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAFC6C6758587
5C696C78888A9DB2B2B2CACAB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCAEC5C5A1B7B7A5BBBBB3CBCBB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
navfullbt-img: make image! [25x25 #{
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCACC3C37C8C8C7C8B8B
7C8B8B7C8B8B7C8B8BA1B6B6B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCA1B6B67C8B8B7C8B8B7C8B8B7C8B8B7C8C8CACC3C3B4CCCCB4CCCC
B4CCCCB4CCCC353B3A0C0B0A0C0B0A0C0B0A0C0B0A0C0B0A444C4CB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC4A53520C0B0A0C0B0A0C0B0A
0C0B0A0C0B0A323737ACC3C3B4CCCCB4CCCCB4CCCC1C1E1E121211798685
555D5C0C0B0A0C0B0A464E4FB0C8C8B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B3CBCB4F59590C0B0A0C0B0A555D5C7986851212111B1D1C9FB4B5B4CCCC
B4CCCCB4CCCC1C1E1D191918A5B7B7181817181817464F4FA0B5B6B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCABC2C2181817181817181817
A5B7B71919181B1C1C9DB2B3B4CCCCB4CCCCB4CCCC1C1E1D0F0F0E131312
181817181817181817626E6FB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCC626E6F1818171818170D0D0C1313120F0F0E1B1C1C9DB2B3B4CCCC
B4CCCCB4CCCC1C1E1D0C0B0A0F0F0E586364181817181817181817626E6F
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC626E6F181817181817626E6F626E6F
0F0F0E0C0B0A1B1C1C9DB2B3B4CCCCB4CCCCB4CCCC4952521A1C1B647172
A9C0C0B4CCCC626E6F181817181817626E6FB4CCCCB4CCCCB4CCCC626E6F
181817181817626E6FB4CCCCB0C7C86E7C7C1B1C1C454D4DA1B7B7B4CCCC
B4CCCCB4CCCCA1B7B790A4A5A9C0C0B4CCCCB4CCCCB4CCCC626E6F181817
181817626E6FB4CCCC626E6F181817181817626E6FB4CCCCB4CCCCB4CCCC
AFC6C695A9AA9BB0B0B0C7C8B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC626E6F181817181817181817181817181817
626E6FB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
626E6F181817181817181817626E6FB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCC626E6F181817181817181817181817181817
626E6FB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC626E6F181817
181817626E6FB4CCCC626E6F181817181817626E6FB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC65717123252488999A
B4CCCCB4CCCC626E6F181817181817626E6FB4CCCCB4CCCCB4CCCC626E6F
181817181817626E6FB4CCCCB4CCCC8A9B9B232625646F6FB4CCCCB4CCCC
B4CCCCB4CCCC1E201F0C0B0A10100F181817181817181817181817626E6F
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC626E6F1818171818171818177E8E8E
1111100C0B0A1D1E1EA4BABBB4CCCCB4CCCCB4CCCC1C1E1D0F0F0E131312
181817181817181817626E6FB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCC626E6F1818171818170E0D0C1313120F0F0E1B1C1C9DB2B3B4CCCC
B4CCCCB4CCCC1C1E1D191918A5B7B71818170C0B0A636E6EB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC6672720C0B0A181817
A5B7B71919181B1C1C9DB2B3B4CCCCB4CCCCB4CCCC1C1E1D121211798685
555D5C0C0B0A0C0B0A5A6565B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCC5E69690C0B0A0C0B0A555D5C7986851212111B1C1C9DB2B3B4CCCC
B4CCCCB4CCCC2D31310C0B0A0C0B0A0C0B0A0C0B0A0C0B0A3F4746B0C8C8
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB3CBCB464E4E0C0B0A0C0B0A0C0B0A
0C0B0A0C0B0A2A2E2E9EB3B4B4CCCCB4CCCCB4CCCC8294954F58594E5859
4E58594E58594E58597D8D8EB3CBCBB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCC8C9E9F505B5C4E58594E58594E58594F585979898AA8BEBFB4CCCC
B4CCCCB4CCCCACC3C3A0B5B69EB3B49EB3B49EB3B49EB3B4AAC0C1B4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCAFC7C7A0B5B69EB3B49EB3B4
9EB3B49FB4B4A8BEBFB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
B4CCCCB4CCCCB4CCCCB4CCCCB4CCCC
}]
pan-img: make image! [25x25 #{
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6AAB6B6AADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AAB6B6556D6D556D6DAAB6B6AADBDBAAB6B6AAB6B6AADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AAB6B6AAB6B6AAB6B6AAB6B6AAB6B6556D6D000000000000000000AAB6B6
556D6D556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6556D6D000000556D6DAAB6B6
000000556D6D556D6D000000556D6D000000000000556D6DAAB6B6AADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6
000000000000000000000000556D6D000000556D6DAADBDB000000000000
002424002424000000556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAAB6B6556D6D000000AADBDBAADBDB000000000000
000000AADBDBAADBDB000000004949FFDBDBAADBDB000000556D6D556D6D
556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6556D6D
000000556D6DAADBDBFFDBDB000000000000AADBDBAADBDB000000554949
AADBDBAADBDB000000556D6D000000000000556D6DAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAAB6B6AAB6B6556D6D000000AADBDBAADBDB000000
000000AADBDBAADBDB000000554949AADBDBAADBDB000000000000000000
556D6D000000AAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6
556D6D000000556D6DAADBDB556D6D000000AADBDBAADBDB000000002424
AADBDBAADBDB000000000000000000AADBDB000000556D6DAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAAB6B6AAB6B6556D6D000000AADBDBAADBDB
000000AADBDBAADBDB000000000000AADBDBAADBDB000000000000556D6D
AADBDB000000556D6DAAB6B6AADBDBAADBDBAADBDBAAB6B6556D6D000000
556D6DAAB6B6000000556D6DFFDBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDB000000556D6DAADBDBAADBDB000000556D6DAAB6B6AADBDB
AADBDBAAB6B6556D6D000000000000000000556D6D556D6D000000AADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB000000AADBDBAADBDB
556D6D000000AAB6B6AAB6B6AADBDBAADBDBAAB6B6000000000000AADBDB
AADBDB000000002424000000AADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDB000000000000AAB6B6AAB6B6AADBDB
AADBDBAAB6B6556D6D000000556D6DAADBDBAADBDB000000000000AADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
000000556D6DAAB6B6AAB6B6AADBDBAADBDBAAB6B6AAB6B6000000000000
556D6DAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDB556D6D000000556D6DAAB6B6AAB6B6AADBDB
AADBDBAADBDBAAB6B6556D6D000000556D6DAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB556D6D
000000556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6000000
000000556D6DAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDB556D6D000000000000AAB6B6AADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAAB6B6556D6D000000000000556D6DAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB556D6D000000000000
000000AAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6
556D6D000000000000556D6DAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDB556D6D000000000000556D6DAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6556D6D000000000000556D6D
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDB556D6D000000000000556D6D
AAB6B6AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAAB6B6556D6D000000000000556D6DAADBDBAADBDBAADBDBAADBDB
AADBDB556D6D000000556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAAB6B6556D6D000000
556D6DAADBDBAADBDBAADBDBAADBDBAADBDB556D6D000000556D6DAAB6B6
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAAB6B6000000556D6DAADBDBAADBDBAADBDBAADBDB
AADBDB556D6D000000556D6DAAB6B6AADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDBAADBDB
AADBDBAADBDBAADBDBAADBDBAADBDB
}]
get-pan-ext: func [
offs
][
xd: (first imgxy-to-mapxy offs) - mapext/1
yd: (second imgxy-to-mapxy offs) - mapext/4
reduce [
mapext/1 - xd
mapext/2 - yd
mapext/3 - xd
mapext/4 - yd
]
]
errMsgLayout: layout [
backcolor maroon
errMsgText: text yellow "This is error text"
]
tag-parser: make object! [
tags: make block! 100
text: make string! 8000
html-code: [
copy tag ["<" thru ">"] (append tags tag) |
copy txt to "<" (append text txt)
]
parse-tags: func [ site [ url! file! ] ] [
clear tags clear text
parse read site [to "<" some html-code]
foreach tag tags [
; print tag
]
return text
]
]
loadMapImg: func [
mapUrl
/local rezImg tmpWl
][
mapFileSize: 60302
if exists? mapFileName [
mapFileSize: size? mapFileName
delete mapFileName
]
mapDwnlProgr/data: 0
mapDwnlProgr/color: red
progrInfoTxt/text: " Loading map: 0%"
show [ mapDwnlProgr progrInfoTxt ]
either attempt [
tmpWl: copy system/ports/wait-list
clear system/ports/wait-list
rezImg: read-thru/to/progress mapUrl mapFileName :mapLoadProgress
][
system/ports/wait-list: tmpWl
mapDwnlProgr/data: 1
progrInfoTxt/text: " Map loaded: 100%"
show [ mapDwnlProgr progrInfoTxt ]
either "<HTML>" = copy/part read mapFileName 6 [
errMsgText: tag-parser/parse-tags mapFileName
view/options/title/new/offset layout [
backcolor maroon
errMsgText: text yellow errMsgText
] [ all-over ] "Error:" 100x100
return none
][
return load mapFileName
]
][
return none
]
]
mapLoadProgress: func [
totb
curb
/local progPerc
][
either curb / mapFileSize > 1 [
progPerc: 1
][
progPerc: curb / mapFileSize
]
mapDwnlProgr/data: progPerc
mapDwnlProgr/color: red
progrInfoTxt/text: rejoin [ " Loading map: " to-integer 100 * progPerc "%" ]
show [ mapDwnlProgr progrInfoTxt ]
true
]
mapPane: reduce [
make face [
text: ""
offset: 0x0
size: mapsize
color: gold
image: none
edge: none
effect: reduce [
'draw rubber-box
]
feel: make feel [
engage: func [face action event] [
switch action [
down [
if any [ tgBtn-zoomin/state tgBtn-zoomout/state ] [
rBoxStartPoint: event/offset
]
if tgBtn-pan/state [
start-pan-offset: event/offset
start-pan-geo: imgxy-to-mapxy event/offset
]
]
over [
if all [ any [ tgBtn-zoomin/state tgBtn-zoomout/state ] rBoxStartPoint <> event/offset ] [
rubber-box/4: rBoxStartPoint
]
if any [ tgBtn-zoomin/state tgBtn-zoomout/state ] [
rubber-box/5: event/offset
]
if tgBtn-pan/state [
offset: offset + event/offset - start-pan-offset
end-pan-geo: imgxy-to-mapxy offset
; text: debugText offset
]
mouse-map-xy: imgxy-to-mapxy event/offset
xyfld/text: rejoin/with [ pad-decimal round/at mouse-map-xy/1 2 2 pad-decimal round/at mouse-map-xy/2 2 2 ] " "
show xyfld
]
away [
if tgBtn-pan/state [
offset: offset + event/offset - start-pan-offset
end-pan-geo: imgxy-to-mapxy offset
; text: debugText offset
]
]
up [
if all [
any [ tgBtn-zoomin/state tgBtn-zoomout/state not tgBtn-pan/state ]
rBoxStartPoint <> rubber-box/5
pair? rubber-box/5
] [
rubber-box/5: event/offset
extents-history: next extents-history
clear extents-history
if tgBtn-zoomin/state [
mapext: rbox-to-mapext rubber-box/4 rubber-box/5
]
if tgBtn-zoomout/state [
mapext: zoomout-ext mapext rbox-to-mapext rubber-box/4 rubber-box/5
]
repend/only extents-history mapext
extents-history: tail extents-history
create-mapserver-url mapext
face/image: loadMapImg myUrl
]
if tgBtn-pan/state [
extents-history: next extents-history
mapext: get-pan-ext offset
repend/only extents-history mapext
extents-history: tail extents-history
create-mapserver-url mapext
offset: 0x0
face/image: loadMapImg myUrl
]
rubber-box/4: none
rubber-box/5: none
]
]
show face
]
over: func [face act pos] [
mouse-map-xy: imgxy-to-mapxy pos - mapBox/offset
xyfld/text: rejoin/with [ pad-decimal round/at mouse-map-xy/1 2 2 pad-decimal round/at mouse-map-xy/2 2 2 ] " "
show xyfld
]
]
]
]
layer_switch: func [
layerName
status
][
either status [
if not find mapserver-layers layerName [
insert mapserver-layers layerName
]
][
remove find mapserver-layers layerName
]
create-mapserver-url mapext
mapBox/pane/1/image: loadMapImg myUrl
show mapBox
]
layerPane: layout [
across
check true [ layer_switch "roads" value ]
text "Roads"
return
check true [ layer_switch "hydro" value ]
text "Water features"
return
check true [ layer_switch "states" value ]
text "State boundaries"
return
]
mapAppWin: layout [
style btn button 30x30
style tbtn toggle 30x30
across
defSpace: space 0x10
tgBtn-zoomin: tbtn zoominbt-img true [ tools-switch 1 ]
tgBtn-zoomout: tbtn zoomoutbt-img [ tools-switch 2 ]
tgBtn-pan: tbtn pan-img [ tools-switch 3 ]
btn backb-img [
if tail? extents-history [
extents-history: back extents-history
]
if not head? extents-history [
extents-history: back extents-history
mapext: first extents-history
create-mapserver-url mapext
mapBox/pane/1/image: loadMapImg myUrl
show mapBox
]
]
btn forwb-img [
if not tail? next extents-history [
extents-history: skip extents-history 1
mapext: first extents-history
create-mapserver-url mapext
mapBox/pane/1/image: loadMapImg myUrl
show mapBox
]
]
btn navfullbt-img [
mapext: base-mapext
extents-history: next extents-history
clear extents-history
repend/only extents-history mapext
extents-history: tail extents-history
create-mapserver-url mapext
mapBox/pane/1/image: loadMapImg myUrl
show mapBox
]
; tgBtn-info: tbtn infobt-img [ tools-switch 4 ]
space defSpace
across
return
mapBox: box mapsize ibevel 6x6 none none
layerBox: box 200x100 ibevel ;10x10 none
return
xyfld: field center 138 "" ibevel
mapDwnlProgr: progress 200x24
progrInfoTxt: code 138
]
mapBox/pane: mapPane
layerBox/pane: layerPane
layerBox/size: to-pair reduce [ 200 mapSize/y ]
layerPane/offset: 0x0
progrInfoTxt/offset: to-pair reduce [ mapDwnlProgr/offset/x + 5 mapDwnlProgr/offset/y ]
progrInfoTxt/size: 200x20
;mapsize: 400x300
imgType: "GIF"
mainWin: layout [
button 200x20 "Open map" [
view/options/title/new mapAppWin [all-over] "Mapserver client"
mapBox/pane/1/image: loadMapImg myUrl
show mapBox
]
]
view mainWin |