aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libjin-lua/scripts/ai/state_machine.lua222
-rw-r--r--src/libjin-lua/scripts/ai/state_machine.lua.h376
2 files changed, 309 insertions, 289 deletions
diff --git a/src/libjin-lua/scripts/ai/state_machine.lua b/src/libjin-lua/scripts/ai/state_machine.lua
index 296296f..dbf655b 100644
--- a/src/libjin-lua/scripts/ai/state_machine.lua
+++ b/src/libjin-lua/scripts/ai/state_machine.lua
@@ -32,149 +32,149 @@ local NONE = "none"
local ASYNC = "async"
local function call_handler(handler, params)
- if handler then
- return handler(unpack(params))
- end
+ if handler then
+ return handler(unpack(params))
+ end
end
local function create_transition(name)
- local can, to, from, params
-
- local function transition(self, ...)
- if self.asyncState == NONE then
- can, to = self:can(name)
- from = self.current
- params = { self, name, from, to, ...}
-
- if not can then return false end
- self.currentTransitioningEvent = name
-
- local beforeReturn = call_handler(self["onbefore" .. name], params)
- local leaveReturn = call_handler(self["onleave" .. from], params)
-
- if beforeReturn == false or leaveReturn == false then
+ local can, to, from, params
+
+ local function transition(self, ...)
+ if self.asyncState == NONE then
+ can, to = self:can(name)
+ from = self.current
+ params = { self, name, from, to, ...}
+
+ if not can then return false end
+ self.currentTransitioningEvent = name
+
+ local beforeReturn = call_handler(self["onbefore" .. name], params)
+ local leaveReturn = call_handler(self["onleave" .. from], params)
+
+ if beforeReturn == false or leaveReturn == false then
+ return false
+ end
+
+ self.asyncState = name .. "WaitingOnLeave"
+
+ if leaveReturn ~= ASYNC then
+ transition(self, ...)
+ end
+
+ return true
+ elseif self.asyncState == name .. "WaitingOnLeave" then
+ self.current = to
+
+ local enterReturn = call_handler(self["onenter" .. to] or self["on" .. to], params)
+
+ self.asyncState = name .. "WaitingOnEnter"
+
+ if enterReturn ~= ASYNC then
+ transition(self, ...)
+ end
+
+ return true
+ elseif self.asyncState == name .. "WaitingOnEnter" then
+ call_handler(self["onafter" .. name] or self["on" .. name], params)
+ call_handler(self["onstatechange"], params)
+ self.asyncState = NONE
+ self.currentTransitioningEvent = nil
+ return true
+ else
+ if string.find(self.asyncState, "WaitingOnLeave") or string.find(self.asyncState, "WaitingOnEnter") then
+ self.asyncState = NONE
+ transition(self, ...)
+ return true
+ end
+ end
+
+ self.currentTransitioningEvent = nil
return false
- end
-
- self.asyncState = name .. "WaitingOnLeave"
-
- if leaveReturn ~= ASYNC then
- transition(self, ...)
- end
-
- return true
- elseif self.asyncState == name .. "WaitingOnLeave" then
- self.current = to
-
- local enterReturn = call_handler(self["onenter" .. to] or self["on" .. to], params)
-
- self.asyncState = name .. "WaitingOnEnter"
-
- if enterReturn ~= ASYNC then
- transition(self, ...)
- end
-
- return true
- elseif self.asyncState == name .. "WaitingOnEnter" then
- call_handler(self["onafter" .. name] or self["on" .. name], params)
- call_handler(self["onstatechange"], params)
- self.asyncState = NONE
- self.currentTransitioningEvent = nil
- return true
- else
- if string.find(self.asyncState, "WaitingOnLeave") or string.find(self.asyncState, "WaitingOnEnter") then
- self.asyncState = NONE
- transition(self, ...)
- return true
- end
end
- self.currentTransitioningEvent = nil
- return false
- end
-
- return transition
+ return transition
end
local function add_to_map(map, event)
- if type(event.from) == 'string' then
- map[event.from] = event.to
- else
- for _, from in ipairs(event.from) do
- map[from] = event.to
+ if type(event.from) == 'string' then
+ map[event.from] = event.to
+ else
+ for _, from in ipairs(event.from) do
+ map[from] = event.to
+ end
end
- end
end
function machine.create(options)
- assert(options.events)
-
- local fsm = {}
- setmetatable(fsm, machine)
-
- fsm.options = options
- fsm.current = options.initial or 'none'
- fsm.asyncState = NONE
- fsm.events = {}
-
- for _, event in ipairs(options.events or {}) do
- local name = event.name
- fsm[name] = fsm[name] or create_transition(name)
- fsm.events[name] = fsm.events[name] or { map = {} }
- add_to_map(fsm.events[name].map, event)
- end
-
- for name, callback in pairs(options.callbacks or {}) do
- fsm[name] = callback
- end
-
- return fsm
+ assert(options.events)
+
+ local fsm = {}
+ setmetatable(fsm, machine)
+
+ fsm.options = options
+ fsm.current = options.initial or 'none'
+ fsm.asyncState = NONE
+ fsm.events = {}
+
+ for _, event in ipairs(options.events or {}) do
+ local name = event.name
+ fsm[name] = fsm[name] or create_transition(name)
+ fsm.events[name] = fsm.events[name] or { map = {} }
+ add_to_map(fsm.events[name].map, event)
+ end
+
+ for name, callback in pairs(options.callbacks or {}) do
+ fsm[name] = callback
+ end
+
+ return fsm
end
function machine:is(state)
- return self.current == state
+ return self.current == state
end
function machine:can(e)
- local event = self.events[e]
- local to = event and event.map[self.current] or event.map['*']
- return to ~= nil, to
+ local event = self.events[e]
+ local to = event and event.map[self.current] or event.map['*']
+ return to ~= nil, to
end
function machine:cannot(e)
- return not self:can(e)
+ return not self:can(e)
end
function machine:todot(filename)
- local dotfile = io.open(filename,'w')
- dotfile:write('digraph {\n')
- local transition = function(event,from,to)
- dotfile:write(string.format('%s -> %s [label=%s];\n',from,to,event))
- end
- for _, event in pairs(self.options.events) do
- if type(event.from) == 'table' then
- for _, from in ipairs(event.from) do
- transition(event.name,from,event.to)
- end
- else
- transition(event.name,event.from,event.to)
+ local dotfile = io.open(filename,'w')
+ dotfile:write('digraph {\n')
+ local transition = function(event,from,to)
+ dotfile:write(string.format('%s -> %s [label=%s];\n',from,to,event))
+ end
+ for _, event in pairs(self.options.events) do
+ if type(event.from) == 'table' then
+ for _, from in ipairs(event.from) do
+ transition(event.name,from,event.to)
+ end
+ else
+ transition(event.name,event.from,event.to)
+ end
end
- end
- dotfile:write('}\n')
- dotfile:close()
+ dotfile:write('}\n')
+ dotfile:close()
end
function machine:transition(event)
- if self.currentTransitioningEvent == event then
- return self[self.currentTransitioningEvent](self)
- end
+ if self.currentTransitioningEvent == event then
+ return self[self.currentTransitioningEvent](self)
+ end
end
function machine:cancelTransition(event)
- if self.currentTransitioningEvent == event then
- self.asyncState = NONE
- self.currentTransitioningEvent = nil
- end
+ if self.currentTransitioningEvent == event then
+ self.asyncState = NONE
+ self.currentTransitioningEvent = nil
+ end
end
machine.NONE = NONE
diff --git a/src/libjin-lua/scripts/ai/state_machine.lua.h b/src/libjin-lua/scripts/ai/state_machine.lua.h
index 99eb6a6..85470c2 100644
--- a/src/libjin-lua/scripts/ai/state_machine.lua.h
+++ b/src/libjin-lua/scripts/ai/state_machine.lua.h
@@ -65,197 +65,217 @@ static char state_machine_lua[] = {
32,65,83,89,78,67,32,61,32,34,97,115,121,110,99,34,13,10,13,10,
108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,95,
104,97,110,100,108,101,114,40,104,97,110,100,108,101,114,44,32,112,97,114,
-97,109,115,41,13,10,32,32,105,102,32,104,97,110,100,108,101,114,32,116,
-104,101,110,13,10,32,32,32,32,114,101,116,117,114,110,32,104,97,110,100,
-108,101,114,40,117,110,112,97,99,107,40,112,97,114,97,109,115,41,41,13,
-10,32,32,101,110,100,13,10,101,110,100,13,10,13,10,108,111,99,97,108,
-32,102,117,110,99,116,105,111,110,32,99,114,101,97,116,101,95,116,114,97,
-110,115,105,116,105,111,110,40,110,97,109,101,41,13,10,32,32,108,111,99,
-97,108,32,99,97,110,44,32,116,111,44,32,102,114,111,109,44,32,112,97,
-114,97,109,115,13,10,13,10,32,32,108,111,99,97,108,32,102,117,110,99,
-116,105,111,110,32,116,114,97,110,115,105,116,105,111,110,40,115,101,108,102,
-44,32,46,46,46,41,13,10,32,32,32,32,105,102,32,115,101,108,102,46,
-97,115,121,110,99,83,116,97,116,101,32,61,61,32,78,79,78,69,32,116,
-104,101,110,13,10,32,32,32,32,32,32,99,97,110,44,32,116,111,32,61,
-32,115,101,108,102,58,99,97,110,40,110,97,109,101,41,13,10,32,32,32,
-32,32,32,102,114,111,109,32,61,32,115,101,108,102,46,99,117,114,114,101,
-110,116,13,10,32,32,32,32,32,32,112,97,114,97,109,115,32,61,32,123,
-32,115,101,108,102,44,32,110,97,109,101,44,32,102,114,111,109,44,32,116,
-111,44,32,46,46,46,125,13,10,13,10,32,32,32,32,32,32,105,102,32,
+97,109,115,41,13,10,32,32,32,32,105,102,32,104,97,110,100,108,101,114,
+32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,114,101,116,117,114,
+110,32,104,97,110,100,108,101,114,40,117,110,112,97,99,107,40,112,97,114,
+97,109,115,41,41,13,10,32,32,32,32,101,110,100,13,10,101,110,100,13,
+10,13,10,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,99,114,
+101,97,116,101,95,116,114,97,110,115,105,116,105,111,110,40,110,97,109,101,
+41,13,10,32,32,32,32,108,111,99,97,108,32,99,97,110,44,32,116,111,
+44,32,102,114,111,109,44,32,112,97,114,97,109,115,13,10,13,10,32,32,
+32,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,116,114,97,
+110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,10,
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,97,115,121,110,
+99,83,116,97,116,101,32,61,61,32,78,79,78,69,32,116,104,101,110,13,
+10,32,32,32,32,32,32,32,32,32,32,32,32,99,97,110,44,32,116,111,
+32,61,32,115,101,108,102,58,99,97,110,40,110,97,109,101,41,13,10,32,
+32,32,32,32,32,32,32,32,32,32,32,102,114,111,109,32,61,32,115,101,
+108,102,46,99,117,114,114,101,110,116,13,10,32,32,32,32,32,32,32,32,
+32,32,32,32,112,97,114,97,109,115,32,61,32,123,32,115,101,108,102,44,
+32,110,97,109,101,44,32,102,114,111,109,44,32,116,111,44,32,46,46,46,
+125,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,
110,111,116,32,99,97,110,32,116,104,101,110,32,114,101,116,117,114,110,32,
-102,97,108,115,101,32,101,110,100,13,10,32,32,32,32,32,32,115,101,108,
-102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,
-110,103,69,118,101,110,116,32,61,32,110,97,109,101,13,10,13,10,32,32,
-32,32,32,32,108,111,99,97,108,32,98,101,102,111,114,101,82,101,116,117,
-114,110,32,61,32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,101,
-108,102,91,34,111,110,98,101,102,111,114,101,34,32,46,46,32,110,97,109,
-101,93,44,32,112,97,114,97,109,115,41,13,10,32,32,32,32,32,32,108,
-111,99,97,108,32,108,101,97,118,101,82,101,116,117,114,110,32,61,32,99,
-97,108,108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,
-108,101,97,118,101,34,32,46,46,32,102,114,111,109,93,44,32,112,97,114,
-97,109,115,41,13,10,13,10,32,32,32,32,32,32,105,102,32,98,101,102,
-111,114,101,82,101,116,117,114,110,32,61,61,32,102,97,108,115,101,32,111,
-114,32,108,101,97,118,101,82,101,116,117,114,110,32,61,61,32,102,97,108,
-115,101,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,114,101,116,
-117,114,110,32,102,97,108,115,101,13,10,32,32,32,32,32,32,101,110,100,
-13,10,13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,110,99,
-83,116,97,116,101,32,61,32,110,97,109,101,32,46,46,32,34,87,97,105,
-116,105,110,103,79,110,76,101,97,118,101,34,13,10,13,10,32,32,32,32,
-32,32,105,102,32,108,101,97,118,101,82,101,116,117,114,110,32,126,61,32,
-65,83,89,78,67,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,
-116,114,97,110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,
-41,13,10,32,32,32,32,32,32,101,110,100,13,10,32,32,32,32,32,32,
-13,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,
-10,32,32,32,32,101,108,115,101,105,102,32,115,101,108,102,46,97,115,121,
+102,97,108,115,101,32,101,110,100,13,10,32,32,32,32,32,32,32,32,32,
+32,32,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,
+105,116,105,111,110,105,110,103,69,118,101,110,116,32,61,32,110,97,109,101,
+13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,108,111,99,97,
+108,32,98,101,102,111,114,101,82,101,116,117,114,110,32,61,32,99,97,108,
+108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,98,101,
+102,111,114,101,34,32,46,46,32,110,97,109,101,93,44,32,112,97,114,97,
+109,115,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,108,111,99,
+97,108,32,108,101,97,118,101,82,101,116,117,114,110,32,61,32,99,97,108,
+108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,108,101,
+97,118,101,34,32,46,46,32,102,114,111,109,93,44,32,112,97,114,97,109,
+115,41,13,10,13,10,32,32,32,32,32,32,32,32,32,32,32,32,105,102,
+32,98,101,102,111,114,101,82,101,116,117,114,110,32,61,61,32,102,97,108,
+115,101,32,111,114,32,108,101,97,118,101,82,101,116,117,114,110,32,61,61,
+32,102,97,108,115,101,32,116,104,101,110,13,10,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,
+101,13,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,13,10,
+13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,97,
+115,121,110,99,83,116,97,116,101,32,61,32,110,97,109,101,32,46,46,32,
+34,87,97,105,116,105,110,103,79,110,76,101,97,118,101,34,13,10,13,10,
+32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,108,101,97,118,101,
+82,101,116,117,114,110,32,126,61,32,65,83,89,78,67,32,116,104,101,110,
+13,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,116,114,
+97,110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,
+10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,13,10,32,32,
+32,32,32,32,32,32,32,32,32,32,13,10,32,32,32,32,32,32,32,32,
+32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,10,32,32,32,
+32,32,32,32,32,101,108,115,101,105,102,32,115,101,108,102,46,97,115,121,
110,99,83,116,97,116,101,32,61,61,32,110,97,109,101,32,46,46,32,34,
87,97,105,116,105,110,103,79,110,76,101,97,118,101,34,32,116,104,101,110,
-13,10,32,32,32,32,32,32,115,101,108,102,46,99,117,114,114,101,110,116,
-32,61,32,116,111,13,10,13,10,32,32,32,32,32,32,108,111,99,97,108,
-32,101,110,116,101,114,82,101,116,117,114,110,32,61,32,99,97,108,108,95,
-104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,101,110,116,101,
-114,34,32,46,46,32,116,111,93,32,111,114,32,115,101,108,102,91,34,111,
-110,34,32,46,46,32,116,111,93,44,32,112,97,114,97,109,115,41,13,10,
-13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,110,99,83,116,
-97,116,101,32,61,32,110,97,109,101,32,46,46,32,34,87,97,105,116,105,
-110,103,79,110,69,110,116,101,114,34,13,10,13,10,32,32,32,32,32,32,
-105,102,32,101,110,116,101,114,82,101,116,117,114,110,32,126,61,32,65,83,
-89,78,67,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,116,114,
-97,110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,
-10,32,32,32,32,32,32,101,110,100,13,10,32,32,32,32,32,32,13,10,
-32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,10,32,
-32,32,32,101,108,115,101,105,102,32,115,101,108,102,46,97,115,121,110,99,
-83,116,97,116,101,32,61,61,32,110,97,109,101,32,46,46,32,34,87,97,
-105,116,105,110,103,79,110,69,110,116,101,114,34,32,116,104,101,110,13,10,
+13,10,32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,99,
+117,114,114,101,110,116,32,61,32,116,111,13,10,13,10,32,32,32,32,32,
+32,32,32,32,32,32,32,108,111,99,97,108,32,101,110,116,101,114,82,101,
+116,117,114,110,32,61,32,99,97,108,108,95,104,97,110,100,108,101,114,40,
+115,101,108,102,91,34,111,110,101,110,116,101,114,34,32,46,46,32,116,111,
+93,32,111,114,32,115,101,108,102,91,34,111,110,34,32,46,46,32,116,111,
+93,44,32,112,97,114,97,109,115,41,13,10,13,10,32,32,32,32,32,32,
+32,32,32,32,32,32,115,101,108,102,46,97,115,121,110,99,83,116,97,116,
+101,32,61,32,110,97,109,101,32,46,46,32,34,87,97,105,116,105,110,103,
+79,110,69,110,116,101,114,34,13,10,13,10,32,32,32,32,32,32,32,32,
+32,32,32,32,105,102,32,101,110,116,101,114,82,101,116,117,114,110,32,126,
+61,32,65,83,89,78,67,32,116,104,101,110,13,10,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,105,116,105,111,110,
+40,115,101,108,102,44,32,46,46,46,41,13,10,32,32,32,32,32,32,32,
+32,32,32,32,32,101,110,100,13,10,32,32,32,32,32,32,32,32,32,32,
+32,32,13,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,
+114,110,32,116,114,117,101,13,10,32,32,32,32,32,32,32,32,101,108,115,
+101,105,102,32,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,32,
+61,61,32,110,97,109,101,32,46,46,32,34,87,97,105,116,105,110,103,79,
+110,69,110,116,101,114,34,32,116,104,101,110,13,10,32,32,32,32,32,32,
32,32,32,32,32,32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,
101,108,102,91,34,111,110,97,102,116,101,114,34,32,46,46,32,110,97,109,
101,93,32,111,114,32,115,101,108,102,91,34,111,110,34,32,46,46,32,110,
97,109,101,93,44,32,112,97,114,97,109,115,41,13,10,32,32,32,32,32,
-32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,
-111,110,115,116,97,116,101,99,104,97,110,103,101,34,93,44,32,112,97,114,
-97,109,115,41,13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,
-110,99,83,116,97,116,101,32,61,32,78,79,78,69,13,10,32,32,32,32,
-32,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,
-116,105,111,110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,10,
-32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,10,32,
-32,32,32,101,108,115,101,13,10,32,32,32,32,9,105,102,32,115,116,114,
-105,110,103,46,102,105,110,100,40,115,101,108,102,46,97,115,121,110,99,83,
-116,97,116,101,44,32,34,87,97,105,116,105,110,103,79,110,76,101,97,118,
-101,34,41,32,111,114,32,115,116,114,105,110,103,46,102,105,110,100,40,115,
-101,108,102,46,97,115,121,110,99,83,116,97,116,101,44,32,34,87,97,105,
-116,105,110,103,79,110,69,110,116,101,114,34,41,32,116,104,101,110,13,10,
-32,32,32,32,9,9,115,101,108,102,46,97,115,121,110,99,83,116,97,116,
-101,32,61,32,78,79,78,69,13,10,32,32,32,32,9,9,116,114,97,110,
+32,32,32,32,32,32,32,99,97,108,108,95,104,97,110,100,108,101,114,40,
+115,101,108,102,91,34,111,110,115,116,97,116,101,99,104,97,110,103,101,34,
+93,44,32,112,97,114,97,109,115,41,13,10,32,32,32,32,32,32,32,32,
+32,32,32,32,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,32,
+61,32,78,79,78,69,13,10,32,32,32,32,32,32,32,32,32,32,32,32,
+115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,116,105,
+111,110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,10,32,32,
+32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,
+101,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,32,32,
+32,32,32,32,32,9,105,102,32,115,116,114,105,110,103,46,102,105,110,100,
+40,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,44,32,34,87,
+97,105,116,105,110,103,79,110,76,101,97,118,101,34,41,32,111,114,32,115,
+116,114,105,110,103,46,102,105,110,100,40,115,101,108,102,46,97,115,121,110,
+99,83,116,97,116,101,44,32,34,87,97,105,116,105,110,103,79,110,69,110,
+116,101,114,34,41,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,
+9,9,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,32,61,32,
+78,79,78,69,13,10,32,32,32,32,32,32,32,32,9,9,116,114,97,110,
115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,10,32,
-32,32,32,9,9,114,101,116,117,114,110,32,116,114,117,101,13,10,32,32,
-32,32,9,101,110,100,13,10,32,32,32,32,101,110,100,13,10,13,10,32,
-32,32,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,
-105,116,105,111,110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,
-10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,13,10,32,
-32,101,110,100,13,10,13,10,32,32,114,101,116,117,114,110,32,116,114,97,
-110,115,105,116,105,111,110,13,10,101,110,100,13,10,13,10,108,111,99,97,
-108,32,102,117,110,99,116,105,111,110,32,97,100,100,95,116,111,95,109,97,
-112,40,109,97,112,44,32,101,118,101,110,116,41,13,10,32,32,105,102,32,
-116,121,112,101,40,101,118,101,110,116,46,102,114,111,109,41,32,61,61,32,
-39,115,116,114,105,110,103,39,32,116,104,101,110,13,10,32,32,32,32,109,
-97,112,91,101,118,101,110,116,46,102,114,111,109,93,32,61,32,101,118,101,
-110,116,46,116,111,13,10,32,32,101,108,115,101,13,10,32,32,32,32,102,
-111,114,32,95,44,32,102,114,111,109,32,105,110,32,105,112,97,105,114,115,
-40,101,118,101,110,116,46,102,114,111,109,41,32,100,111,13,10,32,32,32,
-32,32,32,109,97,112,91,102,114,111,109,93,32,61,32,101,118,101,110,116,
-46,116,111,13,10,32,32,32,32,101,110,100,13,10,32,32,101,110,100,13,
-10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,
-104,105,110,101,46,99,114,101,97,116,101,40,111,112,116,105,111,110,115,41,
-13,10,32,32,97,115,115,101,114,116,40,111,112,116,105,111,110,115,46,101,
-118,101,110,116,115,41,13,10,13,10,32,32,108,111,99,97,108,32,102,115,
-109,32,61,32,123,125,13,10,32,32,115,101,116,109,101,116,97,116,97,98,
-108,101,40,102,115,109,44,32,109,97,99,104,105,110,101,41,13,10,13,10,
-32,32,102,115,109,46,111,112,116,105,111,110,115,32,61,32,111,112,116,105,
-111,110,115,13,10,32,32,102,115,109,46,99,117,114,114,101,110,116,32,61,
-32,111,112,116,105,111,110,115,46,105,110,105,116,105,97,108,32,111,114,32,
-39,110,111,110,101,39,13,10,32,32,102,115,109,46,97,115,121,110,99,83,
-116,97,116,101,32,61,32,78,79,78,69,13,10,32,32,102,115,109,46,101,
-118,101,110,116,115,32,61,32,123,125,13,10,13,10,32,32,102,111,114,32,
-95,44,32,101,118,101,110,116,32,105,110,32,105,112,97,105,114,115,40,111,
-112,116,105,111,110,115,46,101,118,101,110,116,115,32,111,114,32,123,125,41,
-32,100,111,13,10,32,32,32,32,108,111,99,97,108,32,110,97,109,101,32,
-61,32,101,118,101,110,116,46,110,97,109,101,13,10,32,32,32,32,102,115,
-109,91,110,97,109,101,93,32,61,32,102,115,109,91,110,97,109,101,93,32,
-111,114,32,99,114,101,97,116,101,95,116,114,97,110,115,105,116,105,111,110,
-40,110,97,109,101,41,13,10,32,32,32,32,102,115,109,46,101,118,101,110,
-116,115,91,110,97,109,101,93,32,61,32,102,115,109,46,101,118,101,110,116,
-115,91,110,97,109,101,93,32,111,114,32,123,32,109,97,112,32,61,32,123,
-125,32,125,13,10,32,32,32,32,97,100,100,95,116,111,95,109,97,112,40,
+32,32,32,32,32,32,32,9,9,114,101,116,117,114,110,32,116,114,117,101,
+13,10,32,32,32,32,32,32,32,32,9,101,110,100,13,10,32,32,32,32,
+32,32,32,32,101,110,100,13,10,13,10,32,32,32,32,32,32,32,32,115,
+101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,116,105,111,
+110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,10,32,32,32,
+32,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,13,10,32,
+32,32,32,101,110,100,13,10,13,10,32,32,32,32,114,101,116,117,114,110,
+32,116,114,97,110,115,105,116,105,111,110,13,10,101,110,100,13,10,13,10,
+108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,97,100,100,95,116,
+111,95,109,97,112,40,109,97,112,44,32,101,118,101,110,116,41,13,10,32,
+32,32,32,105,102,32,116,121,112,101,40,101,118,101,110,116,46,102,114,111,
+109,41,32,61,61,32,39,115,116,114,105,110,103,39,32,116,104,101,110,13,
+10,32,32,32,32,32,32,32,32,109,97,112,91,101,118,101,110,116,46,102,
+114,111,109,93,32,61,32,101,118,101,110,116,46,116,111,13,10,32,32,32,
+32,101,108,115,101,13,10,32,32,32,32,32,32,32,32,102,111,114,32,95,
+44,32,102,114,111,109,32,105,110,32,105,112,97,105,114,115,40,101,118,101,
+110,116,46,102,114,111,109,41,32,100,111,13,10,32,32,32,32,32,32,32,
+32,32,32,32,32,109,97,112,91,102,114,111,109,93,32,61,32,101,118,101,
+110,116,46,116,111,13,10,32,32,32,32,32,32,32,32,101,110,100,13,10,
+32,32,32,32,101,110,100,13,10,101,110,100,13,10,13,10,102,117,110,99,
+116,105,111,110,32,109,97,99,104,105,110,101,46,99,114,101,97,116,101,40,
+111,112,116,105,111,110,115,41,13,10,32,32,32,32,97,115,115,101,114,116,
+40,111,112,116,105,111,110,115,46,101,118,101,110,116,115,41,13,10,13,10,
+32,32,32,32,108,111,99,97,108,32,102,115,109,32,61,32,123,125,13,10,
+32,32,32,32,115,101,116,109,101,116,97,116,97,98,108,101,40,102,115,109,
+44,32,109,97,99,104,105,110,101,41,13,10,13,10,32,32,32,32,102,115,
+109,46,111,112,116,105,111,110,115,32,61,32,111,112,116,105,111,110,115,13,
+10,32,32,32,32,102,115,109,46,99,117,114,114,101,110,116,32,61,32,111,
+112,116,105,111,110,115,46,105,110,105,116,105,97,108,32,111,114,32,39,110,
+111,110,101,39,13,10,32,32,32,32,102,115,109,46,97,115,121,110,99,83,
+116,97,116,101,32,61,32,78,79,78,69,13,10,32,32,32,32,102,115,109,
+46,101,118,101,110,116,115,32,61,32,123,125,13,10,13,10,32,32,32,32,
+102,111,114,32,95,44,32,101,118,101,110,116,32,105,110,32,105,112,97,105,
+114,115,40,111,112,116,105,111,110,115,46,101,118,101,110,116,115,32,111,114,
+32,123,125,41,32,100,111,13,10,32,32,32,32,32,32,32,32,108,111,99,
+97,108,32,110,97,109,101,32,61,32,101,118,101,110,116,46,110,97,109,101,
+13,10,32,32,32,32,32,32,32,32,102,115,109,91,110,97,109,101,93,32,
+61,32,102,115,109,91,110,97,109,101,93,32,111,114,32,99,114,101,97,116,
+101,95,116,114,97,110,115,105,116,105,111,110,40,110,97,109,101,41,13,10,
+32,32,32,32,32,32,32,32,102,115,109,46,101,118,101,110,116,115,91,110,
+97,109,101,93,32,61,32,102,115,109,46,101,118,101,110,116,115,91,110,97,
+109,101,93,32,111,114,32,123,32,109,97,112,32,61,32,123,125,32,125,13,
+10,32,32,32,32,32,32,32,32,97,100,100,95,116,111,95,109,97,112,40,
102,115,109,46,101,118,101,110,116,115,91,110,97,109,101,93,46,109,97,112,
-44,32,101,118,101,110,116,41,13,10,32,32,101,110,100,13,10,32,32,13,
-10,32,32,102,111,114,32,110,97,109,101,44,32,99,97,108,108,98,97,99,
-107,32,105,110,32,112,97,105,114,115,40,111,112,116,105,111,110,115,46,99,
-97,108,108,98,97,99,107,115,32,111,114,32,123,125,41,32,100,111,13,10,
-32,32,32,32,102,115,109,91,110,97,109,101,93,32,61,32,99,97,108,108,
-98,97,99,107,13,10,32,32,101,110,100,13,10,13,10,32,32,114,101,116,
-117,114,110,32,102,115,109,13,10,101,110,100,13,10,13,10,102,117,110,99,
-116,105,111,110,32,109,97,99,104,105,110,101,58,105,115,40,115,116,97,116,
-101,41,13,10,32,32,114,101,116,117,114,110,32,115,101,108,102,46,99,117,
-114,114,101,110,116,32,61,61,32,115,116,97,116,101,13,10,101,110,100,13,
-10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,
-99,97,110,40,101,41,13,10,32,32,108,111,99,97,108,32,101,118,101,110,
-116,32,61,32,115,101,108,102,46,101,118,101,110,116,115,91,101,93,13,10,
+44,32,101,118,101,110,116,41,13,10,32,32,32,32,101,110,100,13,10,32,
+32,32,32,13,10,32,32,32,32,102,111,114,32,110,97,109,101,44,32,99,
+97,108,108,98,97,99,107,32,105,110,32,112,97,105,114,115,40,111,112,116,
+105,111,110,115,46,99,97,108,108,98,97,99,107,115,32,111,114,32,123,125,
+41,32,100,111,13,10,32,32,32,32,32,32,32,32,102,115,109,91,110,97,
+109,101,93,32,61,32,99,97,108,108,98,97,99,107,13,10,32,32,32,32,
+101,110,100,13,10,13,10,32,32,32,32,114,101,116,117,114,110,32,102,115,
+109,13,10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,
+97,99,104,105,110,101,58,105,115,40,115,116,97,116,101,41,13,10,32,32,
+32,32,114,101,116,117,114,110,32,115,101,108,102,46,99,117,114,114,101,110,
+116,32,61,61,32,115,116,97,116,101,13,10,101,110,100,13,10,13,10,102,
+117,110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,99,97,110,40,
+101,41,13,10,32,32,32,32,108,111,99,97,108,32,101,118,101,110,116,32,
+61,32,115,101,108,102,46,101,118,101,110,116,115,91,101,93,13,10,32,32,
32,32,108,111,99,97,108,32,116,111,32,61,32,101,118,101,110,116,32,97,
110,100,32,101,118,101,110,116,46,109,97,112,91,115,101,108,102,46,99,117,
114,114,101,110,116,93,32,111,114,32,101,118,101,110,116,46,109,97,112,91,
-39,42,39,93,13,10,32,32,114,101,116,117,114,110,32,116,111,32,126,61,
-32,110,105,108,44,32,116,111,13,10,101,110,100,13,10,13,10,102,117,110,
-99,116,105,111,110,32,109,97,99,104,105,110,101,58,99,97,110,110,111,116,
-40,101,41,13,10,32,32,114,101,116,117,114,110,32,110,111,116,32,115,101,
-108,102,58,99,97,110,40,101,41,13,10,101,110,100,13,10,13,10,102,117,
-110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,116,111,100,111,116,
-40,102,105,108,101,110,97,109,101,41,13,10,32,32,108,111,99,97,108,32,
-100,111,116,102,105,108,101,32,61,32,105,111,46,111,112,101,110,40,102,105,
-108,101,110,97,109,101,44,39,119,39,41,13,10,32,32,100,111,116,102,105,
-108,101,58,119,114,105,116,101,40,39,100,105,103,114,97,112,104,32,123,92,
-110,39,41,13,10,32,32,108,111,99,97,108,32,116,114,97,110,115,105,116,
-105,111,110,32,61,32,102,117,110,99,116,105,111,110,40,101,118,101,110,116,
-44,102,114,111,109,44,116,111,41,13,10,32,32,32,32,100,111,116,102,105,
-108,101,58,119,114,105,116,101,40,115,116,114,105,110,103,46,102,111,114,109,
-97,116,40,39,37,115,32,45,62,32,37,115,32,91,108,97,98,101,108,61,
-37,115,93,59,92,110,39,44,102,114,111,109,44,116,111,44,101,118,101,110,
-116,41,41,13,10,32,32,101,110,100,13,10,32,32,102,111,114,32,95,44,
-32,101,118,101,110,116,32,105,110,32,112,97,105,114,115,40,115,101,108,102,
-46,111,112,116,105,111,110,115,46,101,118,101,110,116,115,41,32,100,111,13,
-10,32,32,32,32,105,102,32,116,121,112,101,40,101,118,101,110,116,46,102,
-114,111,109,41,32,61,61,32,39,116,97,98,108,101,39,32,116,104,101,110,
-13,10,32,32,32,32,32,32,102,111,114,32,95,44,32,102,114,111,109,32,
-105,110,32,105,112,97,105,114,115,40,101,118,101,110,116,46,102,114,111,109,
-41,32,100,111,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115,105,
-116,105,111,110,40,101,118,101,110,116,46,110,97,109,101,44,102,114,111,109,
-44,101,118,101,110,116,46,116,111,41,13,10,32,32,32,32,32,32,101,110,
-100,13,10,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,116,
-114,97,110,115,105,116,105,111,110,40,101,118,101,110,116,46,110,97,109,101,
-44,101,118,101,110,116,46,102,114,111,109,44,101,118,101,110,116,46,116,111,
-41,13,10,32,32,32,32,101,110,100,13,10,32,32,101,110,100,13,10,32,
+39,42,39,93,13,10,32,32,32,32,114,101,116,117,114,110,32,116,111,32,
+126,61,32,110,105,108,44,32,116,111,13,10,101,110,100,13,10,13,10,102,
+117,110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,99,97,110,110,
+111,116,40,101,41,13,10,32,32,32,32,114,101,116,117,114,110,32,110,111,
+116,32,115,101,108,102,58,99,97,110,40,101,41,13,10,101,110,100,13,10,
+13,10,102,117,110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,116,
+111,100,111,116,40,102,105,108,101,110,97,109,101,41,13,10,32,32,32,32,
+108,111,99,97,108,32,100,111,116,102,105,108,101,32,61,32,105,111,46,111,
+112,101,110,40,102,105,108,101,110,97,109,101,44,39,119,39,41,13,10,32,
+32,32,32,100,111,116,102,105,108,101,58,119,114,105,116,101,40,39,100,105,
+103,114,97,112,104,32,123,92,110,39,41,13,10,32,32,32,32,108,111,99,
+97,108,32,116,114,97,110,115,105,116,105,111,110,32,61,32,102,117,110,99,
+116,105,111,110,40,101,118,101,110,116,44,102,114,111,109,44,116,111,41,13,
+10,32,32,32,32,32,32,32,32,100,111,116,102,105,108,101,58,119,114,105,
+116,101,40,115,116,114,105,110,103,46,102,111,114,109,97,116,40,39,37,115,
+32,45,62,32,37,115,32,91,108,97,98,101,108,61,37,115,93,59,92,110,
+39,44,102,114,111,109,44,116,111,44,101,118,101,110,116,41,41,13,10,32,
+32,32,32,101,110,100,13,10,32,32,32,32,102,111,114,32,95,44,32,101,
+118,101,110,116,32,105,110,32,112,97,105,114,115,40,115,101,108,102,46,111,
+112,116,105,111,110,115,46,101,118,101,110,116,115,41,32,100,111,13,10,32,
+32,32,32,32,32,32,32,105,102,32,116,121,112,101,40,101,118,101,110,116,
+46,102,114,111,109,41,32,61,61,32,39,116,97,98,108,101,39,32,116,104,
+101,110,13,10,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,
+95,44,32,102,114,111,109,32,105,110,32,105,112,97,105,114,115,40,101,118,
+101,110,116,46,102,114,111,109,41,32,100,111,13,10,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,105,116,105,111,110,
+40,101,118,101,110,116,46,110,97,109,101,44,102,114,111,109,44,101,118,101,
+110,116,46,116,111,41,13,10,32,32,32,32,32,32,32,32,32,32,32,32,
+101,110,100,13,10,32,32,32,32,32,32,32,32,101,108,115,101,13,10,32,
+32,32,32,32,32,32,32,32,32,32,32,116,114,97,110,115,105,116,105,111,
+110,40,101,118,101,110,116,46,110,97,109,101,44,101,118,101,110,116,46,102,
+114,111,109,44,101,118,101,110,116,46,116,111,41,13,10,32,32,32,32,32,
+32,32,32,101,110,100,13,10,32,32,32,32,101,110,100,13,10,32,32,32,
32,100,111,116,102,105,108,101,58,119,114,105,116,101,40,39,125,92,110,39,
-41,13,10,32,32,100,111,116,102,105,108,101,58,99,108,111,115,101,40,41,
-13,10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,
-99,104,105,110,101,58,116,114,97,110,115,105,116,105,111,110,40,101,118,101,
-110,116,41,13,10,32,32,105,102,32,115,101,108,102,46,99,117,114,114,101,
-110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,110,116,
-32,61,61,32,101,118,101,110,116,32,116,104,101,110,13,10,32,32,32,32,
-114,101,116,117,114,110,32,115,101,108,102,91,115,101,108,102,46,99,117,114,
-114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,
-110,116,93,40,115,101,108,102,41,13,10,32,32,101,110,100,13,10,101,110,
-100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,104,105,110,
-101,58,99,97,110,99,101,108,84,114,97,110,115,105,116,105,111,110,40,101,
-118,101,110,116,41,13,10,32,32,105,102,32,115,101,108,102,46,99,117,114,
-114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,
-110,116,32,61,61,32,101,118,101,110,116,32,116,104,101,110,13,10,32,32,
-32,32,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,32,61,32,
-78,79,78,69,13,10,32,32,32,32,115,101,108,102,46,99,117,114,114,101,
+41,13,10,32,32,32,32,100,111,116,102,105,108,101,58,99,108,111,115,101,
+40,41,13,10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,
+109,97,99,104,105,110,101,58,116,114,97,110,115,105,116,105,111,110,40,101,
+118,101,110,116,41,13,10,32,32,32,32,105,102,32,115,101,108,102,46,99,
+117,114,114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,
+118,101,110,116,32,61,61,32,101,118,101,110,116,32,116,104,101,110,13,10,
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,91,
+115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,116,105,
+111,110,105,110,103,69,118,101,110,116,93,40,115,101,108,102,41,13,10,32,
+32,32,32,101,110,100,13,10,101,110,100,13,10,13,10,102,117,110,99,116,
+105,111,110,32,109,97,99,104,105,110,101,58,99,97,110,99,101,108,84,114,
+97,110,115,105,116,105,111,110,40,101,118,101,110,116,41,13,10,32,32,32,
+32,105,102,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,
+115,105,116,105,111,110,105,110,103,69,118,101,110,116,32,61,61,32,101,118,
+101,110,116,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,115,101,
+108,102,46,97,115,121,110,99,83,116,97,116,101,32,61,32,78,79,78,69,
+13,10,32,32,32,32,32,32,32,32,115,101,108,102,46,99,117,114,114,101,
110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,110,116,
-32,61,32,110,105,108,13,10,32,32,101,110,100,13,10,101,110,100,13,10,
-13,10,109,97,99,104,105,110,101,46,78,79,78,69,32,61,32,78,79,78,
-69,13,10,109,97,99,104,105,110,101,46,65,83,89,78,67,32,61,32,65,
-83,89,78,67,13,10,13,10,45,45,32,73,109,112,111,114,116,32,116,111,
-32,74,105,110,46,32,13,10,13,10,106,105,110,46,97,105,46,110,101,119,
-83,116,97,116,101,77,97,99,104,105,110,101,32,61,32,109,97,99,104,105,
-110,101,46,99,114,101,97,116,101,13,10
+32,61,32,110,105,108,13,10,32,32,32,32,101,110,100,13,10,101,110,100,
+13,10,13,10,109,97,99,104,105,110,101,46,78,79,78,69,32,61,32,78,
+79,78,69,13,10,109,97,99,104,105,110,101,46,65,83,89,78,67,32,61,
+32,65,83,89,78,67,13,10,13,10,45,45,32,73,109,112,111,114,116,32,
+116,111,32,74,105,110,46,32,13,10,13,10,106,105,110,46,97,105,46,110,
+101,119,83,116,97,116,101,77,97,99,104,105,110,101,32,61,32,109,97,99,
+104,105,110,101,46,99,114,101,97,116,101,13,10
};