evolve
Store/Shared libraries

fog_seen

Where each enemy hero is while nobody sees him: the tick he left vision, his last cast in the fog, a teleport's landing, a position another script worked out, plus the enemy smokes.

hunnyc0 scripts use it
SupportSource is readable
Use it in a script
pack.json
"requires": { "fog_seen": "^1.0" }
your lua
local fog_seen = require("lib/fog_seen")

Players install nothing: the script brings the library, any version inside the range. Edit scripts/lib/fog_seen/ in a dev session to try a change before you publish.

API
fog_seen.clock()#
fog_seen.on_teleport(key, fn)#
fog_seen.on_smoke(key, fn)#
fog_seen.sweep(now)#
fog_seen.settle(now)#
fog_seen.tick(now)#
fog_seen.casts()#
fog_seen.estimate(who, now)#
fog_seen.smokes()#
fog_seen.note(unit, pos, t)#
fog_seen.estimates(now)#
fog_seen.reset()#
fog_seen.on_create(p)#
fog_seen.on_update_entity(p)#
fog_seen.on_update(p)#
fog_seen.on_destroy(p)#
Overview

lib/fog_seen

Where each enemy hero is while nobody sees him: the tick he left vision, his last cast in the fog, a teleport's landing, a position another script worked out, plus the enemy smokes. Runs from the first require, whether any pack draws it or not. Moved from utea/core/fog_seen.lua (#132 step 4); that path is a redirect until the autopilot on arc requires this one.

local FS = require("lib/fog_seen")

local e = FS.estimate(hero)      -- or "npc_dota_hero_lina"
-- { pos, age, source = "visible"|"tp"|"particle"|"noted"|"last_seen"|"respawn", speed, unit, land,
--   walk, held = { kind = "tp"|"stun"|"root"|"sleep"|"taunt"|"gone", left, from } }
for _, e in ipairs(FS.estimates()) do ... end   -- every live enemy hero with one
FS.on_teleport("my_pack", function(tp) end)     -- { hero, unit, pos (to), from, t, land }
FS.on_smoke("my_pack", function(sm) end)        -- { pos, t, index }, no allied hero smoked there
FS.note("npc_dota_hero_lina", pos)              -- a position you worked out; ranks like a cast
call what
estimate(who, now) best known place: in vision his own position, else the newest stamp. age from when it was true; a teleport has age 0 until land. walk: the part of the age he could spend walking; held while a teleport channel or a disable carried on his last visible tick keeps him in place (from: a teleport's start, where he stands). respawn: his fountain (or the death spot after a reincarnation) from when he came back to life out of vision. speed: the larger of the base stat and the post-modifier speed on his last visible tick (#179)
estimates(now) estimate of every enemy hero alive and not an illusion
on_teleport(key, fn), on_smoke(key, fn) one slot per key, so a reloaded caller replaces its own
smokes() enemy smokes of the last CFG.smoke_keep seconds, oldest first
casts() [unit] = { pos, t }, the fog casts as utea/alerts/cast_track.lua draws them
note(unit, pos, t) ignored for a hero in vision
clock() the clock every t here is on: globals.realtime()
CFG, S, reset, tick, on_create ... tuning, state and the handlers, for tests and the alerts

data

file what
data/cast_particles.lua particle hash -> { hero index, "keys" }: the hero whose cast makes it and the control points measured to sit on him ("N" world, "eN" entity-bound fallback), plus rejected (shared, made without him, or no point on the caster), over demos (docs/FOG_PARTICLES.md), by tools/fog_casts/gen_casts.py. a cast places him only from a point bound to him, or a listed one while the client cannot resolve what it is bound to; a create bound to another hero (rubick) is dropped (#154, #202). a hash with no listed point ("") places him only by a point bound to him, and one marked x only by its listed points (#242)
data/tp_hashes.lua hash -> teleport_start/teleport_end/smoke_of_deceit for every cosmetic variant, by tools/particle_names/gen_utea.py (the subset of utea/core/particle_hashes_generated.lua)

Depends on the native api (events, entities, globals); a disable's remaining time comes from NPC.GetControlState (compat, utea/core/target_checks) when that is loaded, and without it no disable is credited. Keeps one instance in __EVOLVE_LIB_REG.fog_seen (see lib/README.md); to reload it in a running client clear that and package.loaded["lib/fog_seen"].

Readers: utea/alerts/fog.lua, utea/alerts/cast_track.lua, utea/minimap/fog_particle_logic.lua (feeds note), the autopilot on arc.

Tests: tools\lua\lua.exe scripts\lib\fog_seen\selftest.lua (the library), python tools/skills.py check map (tests/fog_seen.lua, tests/fog_holds.lua, tests/fog_alerts.lua on skills/map/fog_harness.lua), tools\lua\lua.exe scripts\utea\alerts\fog_selftest.lua (a real teleport from a demo).

Source

The code of 1.2.0 as the client gets it. The bundle's bytecode is built from these files.

init.lua565 lines
---@diagnostic disable: undefined-global
-- lib/fog_seen (#132, was utea/core/fog_seen.lua): WHERE THE ENEMY HEROES ARE WHEN NOBODY SEES
-- THEM. the data under the fog alerts, loaded by whoever requires it, so it runs whether the
-- Alerts pack is on or not (the autopilot reads it). api and deps in README.md.
-- the sources, each stamped with when it was true:
--   last_seen  where a hero stood on the tick he went from visible to the fog
--   particle   a cast in the fog: almost every spell makes a particle the server sends to
--              everyone (docs/FOG_PARTICLES.md); the hero comes from the particle itself
--              (data/cast_particles.lua), since the stream often leaves the owner out.
--              items are skipped: whose they are is not on the wire
--   tp         a teleport's landing: teleport_end's control point 0 is where he lands, its
--              control point 3 is bound to the hero, fog or not; the start in the same tick
--              is where he leaves from (moved here from alerts/fog.lua)
--   smoke      smoke_of_deceit where no allied hero is smoked: no hero on it, so not in
--              estimate; M.smokes() and M.on_smoke() for whoever draws or reasons about it
--   noted      M.note(): a position another reader worked out (a script with its own particle
--              catalog, a projectile's origin); ranks like a cast, not drawn by the alerts
--   respawn    his fountain, from the moment he came back to life out of our vision
-- M.estimate(hero) gives the best of them: in vision his own position, else the newest stamp,
-- and how much of its age he could have spent walking (#179): a teleport's channel, or a stun,
-- root, sleep or taunt he carried on his last visible tick, keeps him in place.
-- sounds are not read yet.
--
-- Owns: __EVOLVE_LIB_REG.fog_seen, the live copy and its particle/on_update handlers
-- Must not: issue orders or require uTEA/*.
do
    local g = rawget(_G, "__EVOLVE_LIB_REG")
    if g and g.fog_seen then return g.fog_seen end
end
local reg = rawget(_G, "__EVOLVE_LIB_REG") or {}
rawset(_G, "__EVOLVE_LIB_REG", reg)

local M = {}

M.CFG = {
    cast_wait = 0.1,   -- a cast's control points arrive after its create
    tp_wait = 0.3,     -- the end's control points can land before the start's
    tp_channel = 3.0,  -- teleport scroll channel: he stands at the landing this much after the start
    tp_min_channel = 2.0, -- the shortest teleport (travel boots 2): an end gone sooner was cancelled
    tp_keep = 10,      -- a teleport's or smoke's particles are dropped after this (outposts 4 s, queues longer)
    smoke_keep = 40,   -- M.smokes() lists a smoke this long
    period = 0.1,      -- the vision sweep
    speed = 300,       -- a hero whose move speed reads 0 (schema not ready)
    -- where a hero comes back to life, by team
    fountain = { [2] = { x = -6733, y = -6163, z = 384 }, [3] = { x = 6733, y = 6163, z = 384 } },
}

local okg, GEN = pcall(require, "lib/fog_seen/data/cast_particles")
local HEROES = okg and GEN.heroes or {}
local BY_HASH = okg and GEN.by_hash or {}
-- hash -> short name; every cosmetic teleport (seasonal, boots of travel) is "teleport_start" /
-- "teleport_end" there, matched by pattern in tools/particle_names/gen_utea.py
local okph, SHORT = pcall(require, "lib/fog_seen/data/tp_hashes")
if not okph or type(SHORT) ~= "table" then SHORT = {} end
local TP = { teleport_start = "tp_start", teleport_end = "tp_end", smoke_of_deceit = "smoke" }
local SMOKE = "particles/items2_fx/smoke_of_deceit.vpcf"

-- [hero unit name] = ...
local S = {
    seen = {},     -- { pos, t, speed } updated every sweep while in vision; t freezes on the fog tick
    vis = {},      -- true while in vision
    cast = {},     -- { pos, t } the last cast in the fog, cleared when he is seen or dies
    tp = {},       -- { pos, from, t, land } the last teleport, cleared when he is seen or dies
    noted = {},    -- { pos, t } the last M.note(), cleared like a cast
    hold = {},     -- { kind, untl } a disable on his last visible tick and when it ends
    dead = {},     -- { speed, pos } while dead; pos when he revives where he fell
    pending = {},  -- [particle index] = cast being resolved
    live = {},     -- [particle index] = teleport or smoke particle being read
    smokes = {},   -- { pos, t } enemy smokes, oldest first
    swept = -1,
}
M.S = S

local subs = {}   -- [key] = fn(tp) for every enemy teleport, called the moment it pairs
local smoke_subs = {}

function M.clock()
    local ok, t = pcall(function() return globals.realtime() end)
    return (ok and type(t) == "number") and t or os.clock()
end

-- control points carry radii, colours and counts as vectors too
local function world(p)
    if type(p) ~= "table" and type(p) ~= "userdata" then return nil end
    local ok, x, y, z = pcall(function() return p.x, p.y, p.z end)
    if not ok or type(x) ~= "number" then return nil end
    if math.abs(x) + math.abs(y) < 200 or math.abs(x) > 9000 or math.abs(y) > 9000 then return nil end
    if (y == 0 and z == 0) or (x == y and y == z) then return nil end
    return p
end

local function unit_of(e)
    if not e then return nil end
    local ok, n = pcall(e.unit_name, e)
    return ok and n or nil
end

local function hero_on(unit, side)
    local ok, list = pcall(entities.heroes, side)
    if not ok or type(list) ~= "table" then return nil end
    for i = 1, #list do
        if unit_of(list[i]) == unit then return list[i] end
    end
    return nil
end

local function in_vision(h)
    local ok, v = pcall(function() return h:is_alive() and not h:is_dormant() end)
    return ok and v == true
end

-- ------------------------------------------------------------------ casts in the fog ---

-- the enemy picks (#154): a hero never seen yet has no entity on the client, his pick is in the
-- player resource from the draft on. [unit name] = true, refreshed every few seconds
local roster, roster_t = {}, -math.huge
local function team_of(pid)
    local ok, pr = pcall(players.profile, pid)
    local t = ok and type(pr) == "table" and tonumber(pr.team)
    return t or (pid < 5 and 2 or 3)
end
local function enemy_picked(unit)
    local now = M.clock()
    if type(players) ~= "table" then return false end
    if now - roster_t > 5 or now < roster_t then
        roster_t, roster = now, {}
        local okd, D = pcall(require, "draft/data")
        local okl, me = pcall(players.local_id)
        if okd and okl and type(me) == "number" and me >= 0 then
            local mine = team_of(me)
            for pid = 0, 9 do
                local ok, st = pcall(players.stats, pid)
                local id = ok and type(st) == "table" and st.selected_hero_id
                local okn, n = pcall(D.name_of_id, id)
                if id and okn and n and team_of(pid) ~= mine then roster[n] = true end
            end
        end
    end
    return roster[unit] == true
end

local function resolve(r)
    local pos = r.self_pos or (not r.far and r.pos) or nil
    if not pos then return end
    if r.owner then
        local ok, enemy = pcall(r.owner.is_enemy, r.owner)
        if ok and not enemy then return end
    elseif hero_on(r.unit, "ally") then
        return
    end
    local h = r.owner or hero_on(r.unit, "enemy")
    -- not among the enemies (seen, or picked): the hash came from someone else (#154)
    if not h and not enemy_picked(r.unit) then return end
    if h and in_vision(h) then return end               -- in vision: the hero is on the map already
    S.cast[r.unit] = { pos = pos, t = M.clock() }
end

-- ------------------------------------------------------------------ teleports ---

local function hero_of(handle)
    if not handle or handle == 0 or handle >= 0xFFFFFF then return nil end
    local ok, e = pcall(entities.get, handle & 0x3fff)
    if ok and e and e:valid() then
        local okh, is = pcall(e.is_hero, e)
        if okh and is then return e end
    end
    return nil
end

-- the start whose index sits right before this end, created in the same moment; with several
-- teleports in one tick, the one carrying the same hero
local function start_for(end_index, t, hero)
    local s = S.live[end_index - 1]
    if s and s.kind == "tp_start" and math.abs(s.t - t) < 0.2 then return s end
    local any
    for _, v in pairs(S.live) do
        if v.kind == "tp_start" and math.abs(v.t - t) < 0.2 and v.pos then
            if hero and v.hero == hero then return v end
            any = any or v
        end
    end
    return any
end

local function try_teleport(idx, force)
    local e = S.live[idx]
    if not e or e.kind ~= "tp_end" or e.done or not e.pos then return end
    local s0 = S.live[idx - 1]
    if s0 and s0.kind ~= "tp_start" then s0 = nil end
    -- the end names its hero on control point 3; the start, created with it, names him too
    e.hero = e.hero or (s0 and s0.hero)
    if not e.hero then return end
    if not force and s0 and not s0.pos and M.clock() - e.t < M.CFG.tp_wait then return end
    e.done = true
    local okt, enemy = pcall(e.hero.is_enemy, e.hero)
    if not okt or not enemy then return end
    local s = start_for(idx, e.t, e.hero)
    local unit = unit_of(e.hero)
    local tp = { hero = e.hero, unit = unit, pos = e.pos, from = s and s.pos or nil, t = e.t,
                 land = e.t + M.CFG.tp_channel }
    e.rec = tp
    if unit then S.tp[unit] = tp end
    for _, fn in pairs(subs) do pcall(fn, tp) end
end

-- fn(tp) on every enemy teleport: { hero, unit, pos (to), from, t, land }. one slot per key, so a
-- reloaded caller replaces its own
function M.on_teleport(key, fn) subs[key] = fn end

-- an allied smoke is one of ours: a smoked ally stands there
local function try_smoke(idx)
    local e = S.live[idx]
    if not e or e.kind ~= "smoke" or e.done or not e.pos then return end
    e.done = true
    local ok, allies = pcall(entities.heroes, "ally")
    if ok and type(allies) == "table" then
        for i = 1, #allies do
            local a = allies[i]
            local oka, near = pcall(function() return a:distance(e.pos) < 1200 and a:has_modifier("modifier_smoke_of_deceit") end)
            if oka and near then return end
        end
    end
    local sm = { pos = e.pos, t = e.t, index = idx }
    S.smokes[#S.smokes + 1] = sm
    for _, fn in pairs(smoke_subs) do pcall(fn, sm) end
end

-- fn(smoke) on every enemy smoke: { pos, t, index }
function M.on_smoke(key, fn) smoke_subs[key] = fn end

-- ------------------------------------------------------------------ the vision sweep ---

local function call(h, f, ...)
    local fn = h[f]
    if type(fn) ~= "function" then return nil end
    local ok, v = pcall(fn, h, ...)
    if ok then return v end
    return nil
end

-- the speed he keeps up: a slow on the last tick wears off, boots and hastes stay
local function speed_of(h)
    local v = math.max(tonumber(call(h, "move_speed")) or 0, tonumber(call(h, "ideal_speed")) or 0)
    return v > 0 and v or nil
end

-- seconds left on a visible hero's modifier, or nil. creation_time is on curtime
local function mod_left(h, name)
    local mod = call(h, "get_modifier", name)
    if type(mod) ~= "table" then return nil end
    local d, c = tonumber(mod.duration), tonumber(mod.creation_time)
    local okt, ct = pcall(function() return globals.curtime() end)
    if not (d and d > 0 and c and okt and type(ct) == "number") then return nil end
    local left = d - (ct - c)
    return (left > 0 and left <= d) and left or nil
end

-- the states that keep a hero where he stands; hex and fear walk, so they are not here
local HOLD_BITS = { { "is_stunned", "stun" }, { "is_nightmared", "sleep" }, { "is_frozen", "stun" },
                    { "is_rooted", "root" }, { "is_taunted", "taunt" }, { "is_out_of_game", "gone" } }

-- kind, seconds left; nil when he can walk or the length is unknown. the clock comes from
-- NPC.GetControlState (compat, backed by the generated ability facts) when it is loaded; a
-- state with no known length is not credited. the bits go first: they cost nothing
local function hold_of(h)
    local kind
    for i = 1, #HOLD_BITS do
        if call(h, HOLD_BITS[i][1]) == true then kind = HOLD_BITS[i][2] break end
    end
    if not kind then return nil end
    local npc = rawget(_G, "NPC")
    local gcs = type(npc) == "table" and npc.GetControlState or nil
    if type(gcs) ~= "function" then return nil end
    local ok, c = pcall(gcs, h)
    if not ok or type(c) ~= "table" or c.no_move ~= true then return nil end
    local left = tonumber(c.no_move_for)
    if not left or left <= 0 then return nil end
    return kind, left
end

local function fountain_of(h)
    local f = M.CFG.fountain[tonumber(call(h, "team")) or 0]
    return f and { x = f.x, y = f.y, z = f.z } or nil
end

-- the visible -> fog transition is read here, on the tick: the stamp stops moving then
function M.sweep(now)
    now = now or M.clock()
    if now - S.swept < M.CFG.period and now >= S.swept then return end
    S.swept = now
    local ok, list = pcall(entities.heroes, "enemy")
    for _, h in ipairs(ok and type(list) == "table" and list or {}) do
        local oki, ill = pcall(h.is_illusion, h)
        local unit = not (oki and ill) and unit_of(h) or nil
        if unit then
            local oka, alive = pcall(h.is_alive, h)
            if oka and alive == false then
                -- dead: every stamp is stale. he comes back at his fountain, or where he fell
                -- when he reincarnates
                if not S.dead[unit] then
                    local seen = S.seen[unit]
                    S.dead[unit] = { speed = seen and seen.speed,
                                     pos = call(h, "is_reincarnating") == true and seen and seen.pos or nil }
                end
                S.seen[unit], S.cast[unit], S.tp[unit], S.noted[unit], S.vis[unit], S.hold[unit] =
                    nil, nil, nil, nil, nil, nil
            elseif in_vision(h) then
                local okp, p = pcall(h.position, h)
                if okp and p then
                    S.seen[unit] = { pos = p, t = now, speed = speed_of(h) }
                end
                S.vis[unit], S.dead[unit] = true, nil
                S.cast[unit], S.noted[unit] = nil, nil
                local kind, left = hold_of(h)
                S.hold[unit] = kind and { kind = kind, untl = now + left } or nil
                -- a teleport channelled in plain sight stays: when it ends he is at its landing,
                -- maybe in the fog. its modifier has the real channel. without the modifier it
                -- was cancelled, unless it is just ending: the start can stay networked a tick
                -- after he has left it
                local tp = S.tp[unit]
                if tp then
                    if call(h, "has_modifier", "modifier_teleporting") == true then
                        local left_tp = mod_left(h, "modifier_teleporting")
                        if left_tp then tp.land = now + left_tp end
                    elseif now < tp.land - 0.5 or now > tp.land + 1 then
                        S.tp[unit] = nil
                    end
                end
            else
                S.vis[unit] = false
                local d = S.dead[unit]
                if d then
                    -- back to life where we cannot see him
                    S.dead[unit] = nil
                    local p = d.pos or fountain_of(h)
                    if p then S.seen[unit] = { pos = p, t = now, speed = d.speed or speed_of(h), respawn = true } end
                end
            end
        end
    end
end

-- pending casts and teleports that waited long enough
function M.settle(now)
    now = now or M.clock()
    while S.smokes[1] and now - S.smokes[1].t > M.CFG.smoke_keep do table.remove(S.smokes, 1) end
    for k, r in pairs(S.pending) do
        if now - r.t >= M.CFG.cast_wait then
            S.pending[k] = nil
            pcall(resolve, r)
        end
    end
    for k, v in pairs(S.live) do
        if now - v.t > M.CFG.tp_keep then S.live[k] = nil
        elseif v.kind == "tp_end" and not v.done and now - v.t >= M.CFG.tp_wait then pcall(try_teleport, k, true) end
    end
end

function M.tick(now)
    now = now or M.clock()
    M.sweep(now)
    M.settle(now)
end

-- ------------------------------------------------------------------ the reads ---

-- the fog casts as cast_track draws them: [unit] = { pos, t }. checked on the read too: the
-- sweep runs every `period`, a mark is gone the frame he shows up
function M.casts()
    for unit in pairs(S.cast) do
        local h = hero_on(unit, "enemy")
        if h then
            local ok, alive = pcall(h.is_alive, h)
            if in_vision(h) or (ok and alive == false) then S.cast[unit] = nil end
        end
    end
    return S.cast
end

-- who: an enemy hero entity or its unit name. -> { pos, age, source, speed, unit, land, walk,
-- held } or nil when nothing is known (never seen since his last death). source: "visible",
-- "particle", "tp", "noted", "last_seen", "respawn". a teleport not landed yet has age 0 at the
-- landing; land (tp only) is when he stands there, on M.clock(). walk: the seconds of the age he
-- could have been walking. held = { kind = "tp"|"stun"|"root"|"sleep"|"taunt"|"gone", left, from }
-- while something we know of keeps him in place (from: a teleport's start, where he stands).
function M.estimate(who, now)
    now = now or M.clock()
    local unit = type(who) == "string" and who or unit_of(who)
    if not unit then return nil end
    local seen = S.seen[unit]
    local speed = seen and seen.speed or M.CFG.speed
    if type(who) ~= "string" and in_vision(who) then
        local okp, p = pcall(who.position, who)
        if okp and p then return { pos = p, age = 0, source = "visible", speed = speed, unit = unit } end
    end
    if S.vis[unit] and seen then
        return { pos = seen.pos, age = 0, source = "visible", speed = speed, unit = unit }
    end
    local best, bt, src
    if seen then best, bt, src = seen.pos, seen.t, "last_seen" end
    local c = S.cast[unit]
    if c and (not bt or c.t >= bt) then best, bt, src = c.pos, c.t, "particle" end
    local n = S.noted[unit]
    if n and (not bt or n.t > bt) then best, bt, src = n.pos, n.t, "noted" end
    local tp = S.tp[unit]
    -- the half second: a teleport seen in vision can show him at the start a tick past the end
    if tp and (not bt or tp.land + 0.5 >= bt) then best, bt, src = tp.pos, tp.land, "tp" end
    if not best then return nil end
    if src == "last_seen" and seen.respawn then src = "respawn" end
    local free, held = bt, nil
    if src == "tp" then
        if now < tp.land then held = { kind = "tp", left = tp.land - now, from = tp.from } end
    elseif src == "last_seen" then
        local hd = S.hold[unit]
        if hd and hd.untl > bt then
            free = hd.untl
            if now < free then held = { kind = hd.kind, left = free - now } end
        end
    end
    return { pos = best, age = math.max(0, now - bt), source = src, speed = speed, unit = unit,
             land = src == "tp" and bt or nil, walk = math.max(0, now - free), held = held }
end

-- enemy smokes of the last smoke_keep seconds: { { pos, t }, ... }, oldest first
function M.smokes() return S.smokes end

-- a position worked out elsewhere for an enemy hero not in vision: unit name, world pos, and
-- when (now by default, on M.clock()). it ranks with the casts; a hero in vision ignores it
function M.note(unit, pos, t)
    if type(unit) ~= "string" or not world(pos) then return end
    local h = hero_on(unit, "enemy")
    if not h or in_vision(h) then return end
    t = t or M.clock()
    local c = S.noted[unit]
    if c and c.t > t then return end
    S.noted[unit] = { pos = { x = pos.x, y = pos.y, z = pos.z or 0 }, t = t }
end

-- every enemy hero with an estimate
function M.estimates(now)
    now = now or M.clock()
    local out = {}
    local ok, list = pcall(entities.heroes, "enemy")
    for _, h in ipairs(ok and type(list) == "table" and list or {}) do
        local oki, ill = pcall(h.is_illusion, h)
        if not (oki and ill) then
            local oka, alive = pcall(h.is_alive, h)
            if not (oka and alive == false) then
                local e = M.estimate(h, now)
                if e then out[#out + 1] = e end
            end
        end
    end
    return out
end

function M.reset()
    S.seen, S.vis, S.cast, S.tp, S.noted, S.pending, S.live, S.smokes, S.swept = {}, {}, {}, {}, {}, {}, {}, {}, -1
    S.hold, S.dead = {}, {}
end

-- ------------------------------------------------------------------ listeners ---

-- one set of handlers across reloads: a copy loaded after the registry was cleared by hand
-- bumps the version, and the older handlers step aside
local VER = (reg.fog_seen_ver or 0) + 1
reg.fog_seen_ver = VER
local function mine() return reg.fog_seen_ver == VER end

function M.on_create(p)
    if type(p) ~= "table" then return end
    local short = (p.hash and SHORT[p.hash]) or (type(p.name) == "string" and p.name:match("([^/]+)%.vpcf$"))
    local kind = TP[short] or (p.name == SMOKE and "smoke") or nil
    if kind then
        local hero
        if kind == "tp_start" then
            local okh, is = pcall(function() return p.entity and p.entity:is_hero() end)
            hero = (okh and is) and p.entity or hero_of(p.entityHandle)
        end
        S.live[p.index] = { kind = kind, t = M.clock(), hero = hero }
        return
    end
    if not p.hash then return end
    local hit = BY_HASH[p.hash]
    if not hit then return end
    local unit = HEROES[hit < 0 and -hit or hit]
    if not unit then return end
    local owner = p.entity
    if owner and unit_of(owner) ~= unit then owner = nil end
    S.pending[p.index] = { t = M.clock(), unit = unit, far = hit < 0, owner = owner }
end

function M.on_update_entity(p)
    if type(p) ~= "table" then return end
    local e = S.live[p.index]
    if e then
        -- a live client binds the start's control point 0 to the hero with a fallback position
        -- (the demo moved it by transform instead)
        if e.kind == "tp_start" and p.controlPoint == 0 then
            local pos = p.position
            if pos and pos.x == 0 and pos.y == 0 then pos = nil end
            e.pos = e.pos or pos
            e.hero = e.hero or p.entity or hero_of(p.entityHandle)
            pcall(try_teleport, p.index + 1)
            return
        end
        if e.kind ~= "tp_end" or p.controlPoint ~= 3 then return end
        e.hero = p.entity or hero_of(p.entityHandle)
        pcall(try_teleport, p.index)
        return
    end
    local r = S.pending[p.index]
    if not r or r.self_pos then return end
    -- a point bound to the caster: its fallback is where he stands
    if p.entity and unit_of(p.entity) == r.unit then
        r.owner = r.owner or p.entity
        r.self_pos = world(p.position)
    end
end

function M.on_update(p)
    if type(p) ~= "table" then return end
    local e = S.live[p.index]
    if e then
        if p.controlPoint ~= 0 or not p.position then return end
        e.pos = p.position
        if e.kind == "tp_end" then pcall(try_teleport, p.index)
        elseif e.kind == "tp_start" then pcall(try_teleport, p.index + 1)
        elseif e.kind == "smoke" then pcall(try_smoke, p.index) end
        return
    end
    local r = S.pending[p.index]
    if not r or r.far then return end
    local pos = world(p.position)
    if pos and (not r.pos or p.controlPoint == 0) then r.pos = pos end
end

-- a teleport's end goes away when he lands or when the channel breaks; sooner than any
-- teleport can finish means he stays at the start
function M.on_destroy(p)
    if type(p) ~= "table" then return end
    local e = S.live[p.index]
    S.live[p.index] = nil
    local tp = e and e.kind == "tp_end" and e.rec
    if not tp or not tp.unit or S.tp[tp.unit] ~= tp then return end
    local now = M.clock()
    if now - tp.t < M.CFG.tp_min_channel - 0.3 then
        S.tp[tp.unit] = nil
        if tp.from then S.noted[tp.unit] = { pos = { x = tp.from.x, y = tp.from.y, z = tp.from.z or 0 }, t = now } end
    elseif now < tp.land then
        tp.land = now
    end
end

if type(events) == "table" and type(events.register) == "function" then
    events.register("on_particle_create", function(p) if mine() then M.on_create(p) end end)
    events.register("on_particle_update_entity", function(p) if mine() then M.on_update_entity(p) end end)
    events.register("on_particle_update", function(p) if mine() then M.on_update(p) end end)
    events.register("on_particle_destroy", function(p) if mine() then M.on_destroy(p) end end)
    events.register("on_update", function() if mine() then pcall(M.tick) end end)
end

reg.fog_seen = M
return M
pack.json2 lines
{ "kind": "lib", "version": "1.0.1" }
data/tp_hashes.lua1134 lines
-- generated by tools/particle_names/gen_utea.py, do not edit.
-- server particle name hash -> short name, the teleport and smoke subset lib/fog_seen reads.
-- 1128 paths.
return {
[0x00023c5049fb0e71]="teleport_start",
[0x00c052067777e7dd]="teleport_start",
[0x010ca3ce30efaa24]="teleport_end",
[0x016278ccf8bdd1cb]="teleport_end",
[0x0169714c56aed0f5]="teleport_start",
[0x01b24e5bdbaa41cb]="teleport_end",
[0x01b349b2441a223d]="teleport_start",
[0x01d648d4092a198e]="teleport_end",
[0x020a170b84426469]="teleport_end",
[0x0211a82bbbfa3d1e]="teleport_start",
[0x0236baa197f2026c]="teleport_start",
[0x02412562c068c93e]="teleport_end",
[0x02b5e7bf003edb9b]="teleport_start",
[0x02de5e41a144772d]="teleport_end",
[0x0314fafefb4004e7]="teleport_end",
[0x03e55289a443a8b3]="teleport_start",
[0x03f1f91658a993d0]="teleport_end",
[0x03f597e76f9405bc]="teleport_end",
[0x0412aeaba40876a3]="teleport_start",
[0x0426aedb4d55a699]="teleport_start",
[0x042b69e89849dead]="teleport_start",
[0x0440dfe6e09e23b5]="teleport_end",
[0x0481681a4f20c239]="teleport_start",
[0x048a4ec6622c8d26]="teleport_end",
[0x04b4536ab88d174b]="teleport_end",
[0x04d213d49f30b49d]="teleport_end",
[0x04f8ba7fe80c6a6e]="teleport_end",
[0x052230cc52180f2b]="teleport_end",
[0x053df974b6e6b7ee]="teleport_end",
[0x05596ea0508c5ae4]="teleport_end",
[0x05a207322168e5c5]="teleport_start",
[0x05eb0f124d6fac45]="teleport_start",
[0x05fb08ec9d06eb69]="teleport_start",
[0x061c1ff7234657d1]="teleport_start",
[0x062e77a64919a4c1]="teleport_start",
[0x06336059cd39ac14]="teleport_start",
[0x065cebf7b7fe7106]="teleport_end",
[0x06b8e1e95a6d6cc4]="teleport_start",
[0x070ca713f2852f00]="teleport_start",
[0x0732f5bfe7fd2527]="teleport_end",
[0x07b2c37d3fc8b516]="teleport_end",
[0x07d03eb1f889e71c]="teleport_end",
[0x08af3fee71836640]="teleport_end",
[0x08ef0221a9a2e045]="teleport_end",
[0x091114ecad9c234c]="teleport_end",
[0x09187916ce3bf27d]="teleport_start",
[0x097c6a50c5dfd2b2]="teleport_end",
[0x09c9083874153651]="teleport_end",
[0x09f511ef19d757b4]="teleport_end",
[0x09fe3f644d275a65]="teleport_end",
[0x0a5f82a6c09ee135]="teleport_end",
[0x0a71c5aa8925f575]="teleport_start",
[0x0ab1645f4a2243f3]="teleport_start",
[0x0aff9fd75eccc6c7]="teleport_start",
[0x0b4818a6d773e7e5]="teleport_end",
[0x0b6039b94a7d4916]="teleport_start",
[0x0b863ae74705bda2]="teleport_start",
[0x0baac16a13570de2]="teleport_end",
[0x0bc0d798594dad85]="teleport_start",
[0x0c19bd2c1db5e1b4]="teleport_end",
[0x0c2296db91f82f2b]="teleport_end",
[0x0c8e7c1dbcb05ed7]="teleport_start",
[0x0c9ecf2947c3de96]="teleport_end",
[0x0cae5651e0344a4e]="teleport_start",
[0x0d3a2dceffbb32f5]="teleport_end",
[0x0d450c642f367048]="teleport_start",
[0x0d45170c30e28a34]="teleport_start",
[0x0dbffac87cd0068f]="teleport_end",
[0x0dc6d7b57450542c]="teleport_end",
[0x0e718837b064f744]="teleport_start",
[0x0e7cea555d095ca5]="teleport_end",
[0x0e80e0f16c93d1f4]="teleport_end",
[0x0ed81a9106d3dc90]="teleport_start",
[0x0f2812b060e5b852]="teleport_end",
[0x0f35b9693b4c47d7]="teleport_end",
[0x0f8d42c882cd40c6]="teleport_start",
[0x0f9e5c7530c6a8ca]="teleport_start",
[0x0fd26f2ab98d5e67]="teleport_end",
[0x0fe39b76d3b330c8]="teleport_end",
[0x101529e62552e627]="teleport_start",
[0x1020c7085cc77385]="teleport_end",
[0x106f393fab0a75b3]="teleport_end",
[0x107a526bdd8190f2]="teleport_end",
[0x1099e22298ff2209]="teleport_end",
[0x10c17353f6236581]="teleport_start",
[0x11004d1c7a8c787d]="teleport_end",
[0x1120fbeeb4adc684]="teleport_start",
[0x1124fcca4a678e32]="teleport_end",
[0x1131d79cf2498906]="teleport_start",
[0x118396fa7efc243f]="teleport_end",
[0x11b94c19609b03d5]="teleport_start",
[0x11d22da1f23e87b9]="teleport_start",
[0x127704f92bc8e72f]="teleport_end",
[0x129360320bf4db3e]="teleport_end",
[0x12a797231916913e]="teleport_end",
[0x12a94280aee0e59c]="teleport_start",
[0x12e21e8128241662]="teleport_end",
[0x13058827f60ed8b3]="teleport_start",
[0x135382f3ed3bb48b]="teleport_end",
[0x1378924429bbd295]="teleport_end",
[0x144bae78e84d50c8]="teleport_end",
[0x1464d1407ee9a393]="teleport_start",
[0x14666ef8d28010fc]="teleport_start",
[0x14796f46ca8ccf6c]="teleport_end",
[0x149b45fe72fbccb0]="teleport_end",
[0x15419a42d9463d19]="teleport_end",
[0x15544b1ed6b1dd2c]="teleport_end",
[0x163e2fe73493f333]="teleport_start",
[0x164fc67402e786ab]="teleport_start",
[0x1693ea918af8279a]="teleport_end",
[0x16a9cc2b775066e7]="teleport_end",
[0x16cb67cb77af2799]="teleport_start",
[0x16cf92c0ed5c7c35]="teleport_start",
[0x16e0eb00cb84d624]="teleport_start",
[0x173913b29b620cf0]="teleport_end",
[0x174aea5517ecd7d7]="teleport_end",
[0x18112b4c2c565ab1]="teleport_start",
[0x1845c99f71bdcb3c]="teleport_end",
[0x18af9365c729b148]="teleport_start",
[0x1908d09ef7f6955c]="teleport_end",
[0x191d09deb7282a71]="teleport_end",
[0x1a1d3dcf1f29d611]="teleport_start",
[0x1a2bd770f35f9e22]="teleport_start",
[0x1ab88a647e50c65f]="teleport_end",
[0x1ac6cb1b6cccf26e]="teleport_start",
[0x1ac78002edcf66b0]="teleport_end",
[0x1ac9c02094fc179e]="teleport_start",
[0x1acc48c1d8875440]="teleport_start",
[0x1b281c4d7d7d731d]="teleport_end",
[0x1b323fae044616a0]="teleport_end",
[0x1ba9a0974f5d4aff]="teleport_start",
[0x1be48d2ceb3433f4]="teleport_start",
[0x1c641064a823404e]="teleport_end",
[0x1c8fc9e03dece3b7]="teleport_end",
[0x1df736bf902efcfe]="teleport_start",
[0x1dfdae523ecafb86]="teleport_start",
[0x1e087517db062cb4]="teleport_end",
[0x1e47cf6f57896995]="teleport_start",
[0x1e7265f9b94d01da]="teleport_start",
[0x1e72f12461db05eb]="teleport_end",
[0x1e750f64bd9f4320]="teleport_start",
[0x1e7edd4c001ec52e]="teleport_start",
[0x1ed11ff48966ebff]="teleport_end",
[0x1f01f9e7b56fdac9]="teleport_start",
[0x1f41db1820c4e7e2]="teleport_end",
[0x1f9ebcdff2f94b5f]="teleport_end",
[0x1ff2c195cf86b2ec]="teleport_start",
[0x205c0bd16b1e84b0]="teleport_end",
[0x20a5d9d090642be8]="teleport_end",
[0x213e48544879a456]="teleport_end",
[0x218cfed0982d5105]="teleport_start",
[0x21a43395fbe8ebd1]="teleport_end",
[0x21bc2f0939bc6b5e]="teleport_start",
[0x21ef7adc1dae44f2]="teleport_start",
[0x223fbe3444489020]="teleport_start",
[0x226161d2d448e904]="teleport_end",
[0x228567b18f85a9a5]="teleport_start",
[0x22ac2d130c1294f3]="teleport_end",
[0x22ca40243c6613a3]="teleport_end",
[0x22d3681d1ede991e]="teleport_start",
[0x22e8d1ea34f21462]="teleport_end",
[0x234f618c9a1bf5e3]="teleport_start",
[0x238fd1a741fa49c8]="teleport_end",
[0x23ae1ef5792112f9]="teleport_start",
[0x23d300eab05a1a6b]="teleport_end",
[0x23f3580c80ae941a]="teleport_end",
[0x240fda61f6c62d15]="teleport_start",
[0x24104dcfe23a9a06]="teleport_start",
[0x2449529f98078124]="teleport_end",
[0x24810e131f6a8231]="teleport_end",
[0x248df2148fdfc3ae]="teleport_start",
[0x24d0b5c1ec474b36]="teleport_start",
[0x25a4816e2b70e3ac]="teleport_start",
[0x25d94c5c0cd0d4df]="teleport_end",
[0x25e22e838d54d4f9]="teleport_end",
[0x25f0b646c2bccb32]="teleport_end",
[0x2652a731eb76c1d0]="teleport_end",
[0x269514e522c25cd0]="teleport_start",
[0x26a1223ad27b7654]="teleport_start",
[0x26b77e9ed4913dbd]="teleport_end",
[0x273efbdc85b1d33f]="teleport_start",
[0x27737a748e18d876]="teleport_end",
[0x2774479a2a2051c2]="teleport_end",
[0x28a6151bd91487d0]="teleport_end",
[0x28ce5302d1942bf1]="teleport_start",
[0x290bd7751eba117b]="teleport_start",
[0x2944c001ee70e9de]="teleport_start",
[0x299cc8544424d4e7]="teleport_start",
[0x29fa15e025ef1f92]="teleport_end",
[0x2a619aa54b5cc9ac]="teleport_end",
[0x2af044c68d2d8b40]="teleport_end",
[0x2b62075c36dc3f07]="teleport_end",
[0x2b93f2a69e6b5e7c]="teleport_start",
[0x2bbbb2eedfbb1866]="teleport_start",
[0x2c61089afbf61ef8]="teleport_start",
[0x2c76f17a67c2cab1]="teleport_end",
[0x2cb2870edf67d20f]="teleport_end",
[0x2cfb2cc0d4826940]="teleport_start",
[0x2cfd8aaebf3e041b]="teleport_end",
[0x2d3f42a33f60a0b4]="teleport_end",
[0x2d8107664aee19be]="teleport_end",
[0x2d88002f44c6006c]="teleport_start",
[0x2d92320f9956933e]="teleport_start",
[0x2d9e60be371988e8]="teleport_end",
[0x2de349e43bf47ec7]="teleport_end",
[0x2e4ddf656aacacb9]="teleport_start",
[0x2e77d92f1a37cc59]="teleport_start",
[0x2ec3c37fbe596649]="teleport_start",
[0x2ed3783e412736eb]="teleport_start",
[0x2f012cf77ba71ebf]="teleport_end",
[0x308b847bd15c11f7]="teleport_end",
[0x30c1476f953cfba9]="teleport_start",
[0x30cd743ea2c0ea4b]="teleport_start",
[0x310b1e5b0c8f692a]="teleport_end",
[0x312cc7a71fd7b4c9]="teleport_end",
[0x3141a26ef0b809ea]="teleport_end",
[0x315dc439e0bcb720]="teleport_start",
[0x3186e06cc5f76e8d]="teleport_start",
[0x31bfb148bc6760fc]="teleport_start",
[0x32146be1c870b39b]="teleport_start",
[0x32253e16b85cd22b]="teleport_end",
[0x322f0e1cef3dcf4b]="teleport_start",
[0x3237f3ce597cb2ff]="teleport_end",
[0x326b9f03ee14cecb]="teleport_start",
[0x32d1b8b44f64b201]="teleport_start",
[0x3323123033084f3f]="teleport_end",
[0x33e13e8835068922]="teleport_end",
[0x34241da5d3e55add]="teleport_start",
[0x3430502a457a9e45]="teleport_start",
[0x34609002ce47b693]="teleport_end",
[0x34c186dff6c2cbfb]="teleport_end",
[0x35389aba7a7a9d7e]="teleport_end",
[0x3594c771b627738b]="teleport_end",
[0x36295c4da683c186]="teleport_start",
[0x370ae247ad11be3e]="teleport_end",
[0x37853b2ee084c408]="teleport_start",
[0x378defe29574b1b1]="teleport_end",
[0x3797acb337ffee32]="teleport_end",
[0x37c9d8b155d211db]="teleport_end",
[0x37d26255f13bdb11]="teleport_end",
[0x37fa0ea3462a1c83]="teleport_start",
[0x3808ae9e475e8807]="teleport_start",
[0x3819fb85562faaab]="teleport_end",
[0x382a0b8c78bb854d]="teleport_end",
[0x386af96cc2f384dd]="teleport_start",
[0x38a2a899f25dbab3]="teleport_end",
[0x38ae97516f3a0519]="teleport_start",
[0x3929414f831671b4]="teleport_start",
[0x392f4ff4be8167d4]="teleport_start",
[0x39753b5e9b9c271d]="teleport_start",
[0x3a0080ba12982931]="teleport_start",
[0x3a27013d650c3f95]="teleport_end",
[0x3a4556c1007be8ca]="teleport_end",
[0x3ad736f0c3d24f0a]="teleport_end",
[0x3b21b0540a6a70be]="teleport_end",
[0x3b4930b0ad641b74]="teleport_end",
[0x3b711d10017c1b60]="teleport_end",
[0x3b79009af6b919ab]="teleport_start",
[0x3bcf4f8fd376b1cd]="teleport_end",
[0x3bef6bdd48f2ebd0]="teleport_start",
[0x3c34b4050d927c6f]="teleport_end",
[0x3c664de214d5372d]="teleport_end",
[0x3c9670c78a1f69ef]="teleport_end",
[0x3ccb4534597090a8]="teleport_end",
[0x3cd396cf10b21859]="teleport_start",
[0x3ceb2393256f0810]="teleport_end",
[0x3d2df9bad8f12929]="teleport_start",
[0x3d505111d35f9096]="teleport_start",
[0x3d73bcd44b3641aa]="teleport_start",
[0x3d75c331a6e437e3]="teleport_end",
[0x3d8f14f1b06d2a7a]="teleport_end",
[0x3df0f8f334abc1bd]="teleport_start",
[0x3df4540bcfa2553a]="teleport_start",
[0x3e1499d2ff206aef]="teleport_start",
[0x3e41acf636494f01]="teleport_start",
[0x3e86ae357a925596]="teleport_start",
[0x3e88110274071d7f]="teleport_start",
[0x3e9d65cfab1b8306]="teleport_start",
[0x3eb4f93be13b7837]="teleport_end",
[0x3ed02e7621a9c33a]="teleport_end",
[0x3ee94ba6a9ff9c7f]="teleport_end",
[0x3f43cb0fd220e95b]="teleport_start",
[0x3f4e81031557a14f]="teleport_end",
[0x3f686139678c0f01]="teleport_end",
[0x3f9d8a3248a1730e]="teleport_end",
[0x3fe7964d049dd715]="teleport_end",
[0x3fea295f506adb21]="teleport_end",
[0x400a439a7c05379a]="teleport_start",
[0x400b9f5d3590917f]="teleport_end",
[0x407b5c292beef5c8]="teleport_end",
[0x40ba0fb5e356f2f0]="teleport_end",
[0x40c888916546d227]="teleport_start",
[0x40d46fe3168e5f1f]="teleport_end",
[0x42170e3593aafe20]="teleport_start",
[0x421ea0cbff720bff]="teleport_start",
[0x42582bfe5ddb21d5]="teleport_end",
[0x42652fb2f873d01e]="teleport_end",
[0x426eda7d9880e879]="teleport_end",
[0x429b67a4de806ca0]="teleport_end",
[0x43261f30c3022680]="teleport_end",
[0x4434f5a193d365e4]="teleport_end",
[0x44519e5d6399bd7c]="teleport_end",
[0x4484523af799fb7c]="teleport_end",
[0x44ef7b976b32b721]="teleport_end",
[0x4503c80d6e6bb0a8]="teleport_end",
[0x456f5b434c2f2044]="teleport_end",
[0x45f19356ecfdf70b]="teleport_start",
[0x46dc032a4c2da01d]="teleport_start",
[0x4724125d4fe9ca16]="teleport_end",
[0x477ea8f33285bb8d]="teleport_end",
[0x47b3284640564345]="teleport_start",
[0x48473e1a7bb7960c]="teleport_end",
[0x4848804984acc7c2]="teleport_start",
[0x486cffe0b86e9363]="teleport_end",
[0x489dfeebd4623aaf]="teleport_end",
[0x48c0aa16b2a5fc36]="teleport_start",
[0x495ad49724b4b2c9]="teleport_end",
[0x49c19ad28f35aa67]="teleport_start",
[0x49dc937d008c4091]="teleport_start",
[0x4a43edd979667627]="teleport_end",
[0x4a665ddd270f45c8]="teleport_start",
[0x4b69b862e5a77724]="teleport_start",
[0x4bb8d6c0dc73abb4]="teleport_end",
[0x4c069b90c09c853c]="teleport_end",
[0x4c43b1d29dac681b]="teleport_start",
[0x4cab7e4244895c7c]="teleport_end",
[0x4cd007ae03b28707]="teleport_end",
[0x4debdbbf832d6bce]="teleport_end",
[0x4dfb1f00cec9b03c]="teleport_end",
[0x4e1464e521578214]="teleport_start",
[0x4e692ea44cc947b1]="teleport_end",
[0x4e6aa094edf38239]="teleport_end",
[0x4e81980e1d700be7]="teleport_end",
[0x4ee996840dece831]="teleport_end",
[0x4eed00fd66e9a6e9]="teleport_start",
[0x4ef9dd408071ce30]="teleport_end",
[0x4f35bc517f979b09]="teleport_end",
[0x4f6f76e325fdb34f]="teleport_end",
[0x4fbb5b9873143a1e]="teleport_end",
[0x4fe9807969bfaaed]="teleport_end",
[0x4ff04ddd6f9d31fa]="teleport_start",
[0x5036f8dbeaf07131]="teleport_end",
[0x503aec3fa44de1c5]="teleport_end",
[0x5070cbbb4a0b5eb3]="teleport_end",
[0x50b31851bcb7b752]="teleport_start",
[0x50b892e5a6c51207]="teleport_end",
[0x50d08c0f0637dac5]="teleport_start",
[0x50d0a2ec94ed7f82]="teleport_start",
[0x50e0d5348392ad1e]="teleport_end",
[0x51a0b1ba9be46a39]="teleport_start",
[0x51a99c53c6aaf514]="teleport_end",
[0x51b9248fe9f176ad]="teleport_end",
[0x51d9c795ccb2214f]="teleport_start",
[0x51e0e16ebb0caf7d]="teleport_start",
[0x522cf4583a6df381]="teleport_end",
[0x52531066eb14a71d]="teleport_start",
[0x52797be735e50ae3]="teleport_end",
[0x52c259248fd011a2]="teleport_end",
[0x52d5276f99eaf508]="teleport_start",
[0x530f22703590d543]="teleport_end",
[0x531a8e624060f139]="teleport_end",
[0x53a27d5dcb2eaf34]="teleport_end",
[0x53e33df4b9668dc0]="teleport_end",
[0x53edb49cdef73062]="teleport_start",
[0x53f7261f92a30529]="teleport_start",
[0x545c12a1a40c1368]="teleport_end",
[0x54a62b44c6766645]="teleport_end",
[0x54c1ecf1ed407f07]="teleport_end",
[0x54cd403404fe8a83]="teleport_start",
[0x54ec40ae6af090b2]="teleport_start",
[0x5508f8c82af61bb9]="teleport_end",
[0x55615d0e6ed7a3ec]="teleport_end",
[0x55a8678866f299e4]="teleport_end",
[0x563db63b4ead54cd]="teleport_end",
[0x566db178e53ab123]="teleport_end",
[0x56b38da68083f8bb]="teleport_start",
[0x571084c58f4b93db]="teleport_end",
[0x571fe20f9aed65c0]="teleport_start",
[0x5750d5e953265801]="teleport_end",
[0x5782aa9d1fa8b818]="teleport_start",
[0x57c8251afc940dc3]="teleport_end",
[0x57e341ff2d2731ff]="teleport_start",
[0x57ed886c54f52ceb]="teleport_end",
[0x57fe85f4179b031a]="teleport_end",
[0x585db2e36b1425d6]="teleport_start",
[0x588dc67e6d19058e]="teleport_end",
[0x590307342fe44d29]="teleport_end",
[0x5990cf208d6e7e32]="teleport_end",
[0x599fae116d6b2cd6]="teleport_end",
[0x5aa3855d8a5ac134]="teleport_start",
[0x5ac6881bababd500]="teleport_start",
[0x5b941a8042fec178]="teleport_start",
[0x5c1b9054173abf39]="teleport_start",
[0x5c35801a7aec29da]="teleport_start",
[0x5c731d2a7b2b433d]="teleport_start",
[0x5c89441d7e69556b]="teleport_end",
[0x5cb38b489cc84e0b]="teleport_start",
[0x5cdb73dc31b3ecc9]="teleport_start",
[0x5cdc81f799bc643a]="teleport_end",
[0x5cf956e788ca281e]="teleport_end",
[0x5d376f2b63552d60]="teleport_end",
[0x5d49e22f36e79874]="teleport_end",
[0x5d7ede53058142ff]="teleport_start",
[0x5da9aafbc2186bf3]="teleport_end",
[0x5ddccc87756403a3]="teleport_end",
[0x5e6158bc7d49614a]="teleport_end",
[0x5e886ed87e33f909]="teleport_end",
[0x5f312d3d0f0c6eae]="teleport_end",
[0x5f85059a607a8baf]="teleport_end",
[0x5f8a29b9c0a353c9]="teleport_end",
[0x601d35485fead528]="teleport_start",
[0x60502581ebe9dc66]="teleport_start",
[0x60999f5a316aa7d5]="teleport_start",
[0x60e55530124449ce]="teleport_start",
[0x60eb1ffd44b8b1cc]="teleport_end",
[0x6147b687d3112d78]="teleport_end",
[0x61f1a3cb9f6e0244]="teleport_start",
[0x61f37a9c9bc0fcae]="teleport_start",
[0x61f450a48d27f6c0]="teleport_start",
[0x621268170bce16cb]="teleport_end",
[0x621b786a5cd2a11b]="teleport_start",
[0x624277599f76db22]="teleport_start",
[0x624b55beea98ac8f]="teleport_end",
[0x62c389b4ec64246d]="teleport_start",
[0x631f38bc41d7eb86]="teleport_end",
[0x632ecb12aa6a517d]="teleport_start",
[0x633593497fd3a133]="teleport_end",
[0x6341ed2eb661f1c1]="teleport_end",
[0x6370cee641d9d4b0]="teleport_end",
[0x637585e303b51e16]="teleport_end",
[0x6384bd856f612324]="teleport_end",
[0x6470f630b3fc2549]="teleport_end",
[0x64b29a596305ba6b]="teleport_start",
[0x64b6486da77c4d38]="teleport_end",
[0x65039c04188c98a9]="teleport_end",
[0x65a72051b7d89157]="teleport_end",
[0x661696ab2ce8ddc5]="teleport_start",
[0x6617870f31d974e1]="teleport_end",
[0x66247b0e094bf684]="teleport_start",
[0x6637f9c40bc2d3f6]="teleport_end",
[0x664fb19d4a4203b9]="teleport_end",
[0x6667533a91763fe8]="teleport_start",
[0x6702ecaaa705e1fb]="teleport_start",
[0x6707afce322559a3]="teleport_end",
[0x676e1cea9f879db9]="teleport_start",
[0x67d90676c48268d5]="teleport_end",
[0x67fc78172e1cb520]="teleport_start",
[0x68113740266a3415]="teleport_end",
[0x681bbf4d6e26bf1c]="teleport_start",
[0x6826ce83af031305]="teleport_end",
[0x68593ee9fdcd5b4f]="teleport_end",
[0x688de86a5261045c]="teleport_end",
[0x68ab6a964c66411a]="teleport_start",
[0x68c6f2ab9a78e36c]="teleport_start",
[0x69444a23702224d0]="teleport_end",
[0x6954570f54c00f56]="teleport_end",
[0x695eabc9d1193bbb]="teleport_end",
[0x6977676d24632384]="teleport_end",
[0x69a3fc3edbf63622]="teleport_end",
[0x69c12055dbfa4059]="teleport_start",
[0x69c6df2b04478b4b]="teleport_start",
[0x69cca1d01f930173]="teleport_end",
[0x69e2e1fadf30de65]="teleport_end",
[0x6a16d3a44a855d58]="teleport_end",
[0x6a261cb96ac18ca7]="teleport_start",
[0x6a2b560e8d8ba589]="teleport_start",
[0x6a90588f78fab6e0]="teleport_end",
[0x6ae38fb0c302215e]="teleport_start",
[0x6b2060333415fb69]="teleport_start",
[0x6b27a9d5c130ca1f]="teleport_start",
[0x6b3ff067759f9f30]="teleport_end",
[0x6b4cadf996597b18]="teleport_end",
[0x6b59f61274990b4a]="teleport_end",
[0x6b62587f5220367a]="teleport_start",
[0x6b699ad4775a1c9b]="teleport_end",
[0x6b6f72229b37c784]="teleport_end",
[0x6b8cafe21b6d622a]="teleport_start",
[0x6bb4358ed6013e70]="teleport_end",
[0x6bc38ec861d89641]="teleport_end",
[0x6bde89fd3522eca0]="teleport_end",
[0x6bf4731bb7973468]="teleport_end",
[0x6c11ee9b28d9e467]="teleport_end",
[0x6c3bf279bebc84b6]="teleport_end",
[0x6c452e78378cf095]="teleport_start",
[0x6c82b87c5d09bd1b]="teleport_start",
[0x6cbce1a73907d597]="teleport_start",
[0x6d4e11c007662432]="teleport_start",
[0x6d5f1b29e1d1b9ca]="teleport_end",
[0x6e10aa5aea756922]="teleport_end",
[0x6e26aa97cd038349]="teleport_start",
[0x6e562c2cdb7cc211]="teleport_end",
[0x6e7aae7cd9d14d24]="teleport_start",
[0x6f212615360d421c]="teleport_start",
[0x6f6276b09f7dfd98]="teleport_end",
[0x6fd908b798d5a2f8]="teleport_end",
[0x7002e1c524f0e1a8]="teleport_end",
[0x70605dbddfd46285]="teleport_end",
[0x70826a672ed6995e]="teleport_end",
[0x70a8c54932abcf2d]="teleport_start",
[0x70da9e5ca6750f30]="teleport_end",
[0x7116b8c48b3d328f]="teleport_end",
[0x718877ea85443b17]="teleport_end",
[0x71abc8b39ca9a696]="teleport_start",
[0x71c11d5e3c05b82f]="teleport_start",
[0x71d99fe8fc2cb46a]="teleport_start",
[0x723980b2f4b912c0]="teleport_start",
[0x723ea38e8f0704e2]="teleport_end",
[0x72552ff2068ce9ee]="teleport_start",
[0x729e72d1ce357cf4]="teleport_end",
[0x72d63818ca8f2f02]="teleport_start",
[0x72df16f050990670]="teleport_start",
[0x72e90f7b636feb91]="teleport_end",
[0x73150e1be5c1f965]="teleport_end",
[0x733ebbf135950a07]="teleport_start",
[0x7354185c762f0137]="teleport_start",
[0x73ea70af0552bb51]="teleport_end",
[0x73fa1f77d4e1891c]="teleport_start",
[0x740f438e5e724584]="teleport_end",
[0x7435beb28c7e6b41]="teleport_end",
[0x74b14590cd274651]="teleport_end",
[0x74df9fea1400dd99]="teleport_end",
[0x74e21fc7d61e0c1e]="teleport_end",
[0x74ea419702c2e94b]="teleport_end",
[0x751aa50d594757ce]="teleport_end",
[0x752e3eb9089b26e2]="teleport_start",
[0x7548774409f6ecf6]="teleport_start",
[0x759d5bb0dac8814c]="teleport_end",
[0x75c3a746295178df]="teleport_start",
[0x75e42468a8c84a9d]="teleport_start",
[0x75fdf799c322812d]="teleport_end",
[0x7663ed765208e12f]="teleport_end",
[0x768629ee89946014]="teleport_end",
[0x769dec075050d97e]="teleport_end",
[0x76c38c6edb77b5c6]="teleport_end",
[0x76f1f75c71bf284c]="teleport_end",
[0x76fbeeb869619cf7]="teleport_end",
[0x770e830b9f5cefe6]="teleport_end",
[0x770f0de924ba7d7f]="teleport_end",
[0x773f2a6bd89314a1]="teleport_start",
[0x77c8160fd85b8422]="teleport_end",
[0x77dfd98558a3b929]="teleport_end",
[0x77edb8e359d7c1b3]="teleport_end",
[0x7820386a24ba689a]="teleport_end",
[0x782b9581b814b636]="teleport_start",
[0x78c3d313381968ad]="teleport_start",
[0x78f5595ef7850e38]="teleport_end",
[0x7900b4d6546eefd7]="teleport_start",
[0x79ca980fc0a04e23]="teleport_end",
[0x79ed8d9feec42a33]="teleport_end",
[0x7a39ff9acd691db8]="teleport_start",
[0x7a52f0e632babfb6]="teleport_start",
[0x7a57c31a77a4287e]="teleport_start",
[0x7ad5d155ab88292d]="teleport_end",
[0x7b5e84595d16073b]="teleport_end",
[0x7b6434178789b806]="teleport_end",
[0x7ba704b9f978bbe6]="teleport_start",
[0x7baffbce8a31c6c1]="teleport_end",
[0x7bb5dec071dded37]="teleport_start",
[0x7bc5b2c413f47772]="teleport_end",
[0x7cb862a01472eeda]="teleport_end",
[0x7cbaa1d466a7dab5]="teleport_start",
[0x7ccb72f32947cb3e]="teleport_end",
[0x7cee5b151a012464]="teleport_start",
[0x7d46b8c4048dcfb0]="teleport_end",
[0x7d667258c2febbcb]="teleport_end",
[0x7d74b5c0197e4dfe]="teleport_start",
[0x7da4cdc15ee50c8e]="teleport_end",
[0x7e36f505e294373e]="teleport_start",
[0x7e53c11e68dadeec]="teleport_end",
[0x7e54bbf51354c537]="teleport_start",
[0x7e7780b66f83ea75]="teleport_start",
[0x7e8dceaf149b2396]="teleport_start",
[0x7e9aeb0d1f1ea9a6]="teleport_end",
[0x7f1e53b5d3e45901]="teleport_start",
[0x7f2a5a124563e1d2]="teleport_end",
[0x7f81e695ff5507cd]="teleport_start",
[0x7fa41c46797707c6]="teleport_end",
[0x7fb1e87c293cbc10]="teleport_end",
[0x7fd7675f5c67dd5c]="teleport_start",
[0x800368f623ce64f6]="teleport_end",
[0x806dca3efd9818b7]="teleport_end",
[0x809c8c14fcf47014]="teleport_start",
[0x80b571d3014c347a]="teleport_end",
[0x80dbe4cee2d1a547]="teleport_start",
[0x80ea52bf17653fd2]="teleport_end",
[0x80f6fd388fa14293]="teleport_end",
[0x80fa1f82dfed631d]="teleport_end",
[0x8107d9c8fdfd195d]="teleport_end",
[0x81189319bee693c7]="teleport_end",
[0x8144b785c748aff5]="teleport_end",
[0x815faccfcd33b9d3]="teleport_end",
[0x816085faa9c49f86]="teleport_start",
[0x81eaba361faed6cc]="teleport_end",
[0x822b5ba6201829a2]="teleport_end",
[0x823bf7fb2b4384b1]="teleport_end",
[0x823c50e6c421c8e3]="teleport_end",
[0x8268c10e7e370d9a]="teleport_end",
[0x82c5f5cf4240c0fb]="teleport_start",
[0x8302940b265f54c9]="teleport_start",
[0x836fac610806335d]="teleport_end",
[0x838c4d4d5e92afc6]="teleport_start",
[0x838fc38ef79c6e13]="teleport_end",
[0x83b5cde8ea75d8de]="teleport_start",
[0x83b893553ef94538]="teleport_start",
[0x845ab4e5c68cc108]="teleport_end",
[0x85637b9b95c87bcf]="teleport_start",
[0x859f786f4e0943bb]="teleport_start",
[0x85fb132d50327a49]="teleport_end",
[0x8603ac5683492dad]="teleport_start",
[0x8670c20d6d7f2588]="teleport_end",
[0x86a57291224a7a36]="teleport_start",
[0x86a5c4288f64e817]="teleport_start",
[0x86e0384eebe0ad2f]="teleport_start",
[0x8733915db3a7647c]="teleport_start",
[0x875738bfb66ddb02]="teleport_start",
[0x8769e7bf62352620]="teleport_start",
[0x878b0b5fedc35d9f]="teleport_end",
[0x878fa17e763158a7]="teleport_end",
[0x87a56f4ebc6b2f4f]="teleport_start",
[0x87aac198d1bb2f40]="teleport_end",
[0x87bba1752609f313]="teleport_start",
[0x87fb58323d508073]="teleport_end",
[0x880e1890463ed845]="teleport_end",
[0x881e3ca53153424a]="teleport_end",
[0x8829858b4c7b35ee]="teleport_start",
[0x883da002bae641f2]="teleport_end",
[0x889252ee61fdbb45]="teleport_end",
[0x88abde0d12f11f40]="teleport_start",
[0x88ba52c69e93a7ea]="teleport_end",
[0x8912118f90155349]="teleport_start",
[0x891c22aa3655a286]="teleport_end",
[0x8937330d3fc427f0]="teleport_end",
[0x8937f6156f9b7eb7]="teleport_end",
[0x895af695f8412607]="teleport_start",
[0x89838180f9141c07]="teleport_end",
[0x8a06abbf30be0790]="teleport_end",
[0x8a0ca50a34d5e7a3]="teleport_start",
[0x8a5c464f5cb0296d]="teleport_start",
[0x8ab3a25a870743b6]="teleport_end",
[0x8aba42f2a1e1ef0d]="teleport_end",
[0x8ad6e01e928e13fb]="teleport_end",
[0x8b12085a99ad3c12]="teleport_end",
[0x8b354156456fe5ca]="teleport_end",
[0x8c0081de550a18a7]="teleport_end",
[0x8c0259c5d558240b]="teleport_start",
[0x8c45b58cb4e50338]="teleport_end",
[0x8c6d0663ad925946]="teleport_end",
[0x8c86bb7b82f2bb52]="teleport_start",
[0x8cf8060999b56f63]="teleport_end",
[0x8d58310b1b153a50]="teleport_end",
[0x8d5ef38c35ddf588]="teleport_start",
[0x8ddfdae4d0d7aae0]="teleport_start",
[0x8e78ee9cbdb03603]="teleport_end",
[0x8ec5258227199e90]="teleport_start",
[0x8ee485dc2ed28014]="teleport_end",
[0x8f432e0be6614329]="teleport_start",
[0x8f7c91d9b7c05b1d]="teleport_start",
[0x8f7f59ba411d1db6]="teleport_start",
[0x8fe64ac172ec970c]="teleport_start",
[0x9048b21cd5abac91]="teleport_start",
[0x9091c01a63d2b6ea]="teleport_end",
[0x909520bf7bf15726]="teleport_end",
[0x91306870d587b04c]="teleport_start",
[0x913d69a44065d5df]="teleport_start",
[0x915eb4bf169a89ea]="teleport_end",
[0x916aa22de3535a76]="teleport_start",
[0x9174b1b117fc200f]="teleport_end",
[0x917a1298362142b3]="teleport_end",
[0x91c94a689a79c754]="teleport_end",
[0x91cd3434438de1ae]="teleport_start",
[0x926f290d274319df]="teleport_start",
[0x929a5405ed93647f]="teleport_start",
[0x92c43e6a1e536bf4]="teleport_start",
[0x93f0d756c9d468bc]="teleport_start",
[0x94004b233e234d9e]="teleport_start",
[0x94878c06fcf23e43]="teleport_start",
[0x94d68dcedc0aa83c]="teleport_start",
[0x94d740ffcd8fee7b]="teleport_end",
[0x954a7aa836305724]="teleport_end",
[0x954cf9c471d43f2e]="teleport_end",
[0x955c6da43163dc88]="teleport_start",
[0x958beb48759d3a8f]="teleport_end",
[0x9595e0401e531984]="teleport_start",
[0x95b3670216bb20b2]="teleport_end",
[0x963a9052be2b5dde]="teleport_start",
[0x966f7e8f915c8975]="teleport_start",
[0x96a5c9879361cc78]="teleport_start",
[0x96c0330f22737e83]="teleport_end",
[0x976567b6f44d443c]="teleport_end",
[0x97a3b5546ce6f293]="teleport_start",
[0x97dd22b3e942c0cc]="teleport_start",
[0x97df49ecfdddd540]="teleport_start",
[0x983554d0e34942a6]="teleport_start",
[0x985363c876e8e222]="teleport_end",
[0x987d2c6233f694c4]="teleport_start",
[0x98915b853b3d1dfe]="teleport_end",
[0x98bab8cbb545113e]="teleport_start",
[0x998468d4e3d30b69]="teleport_start",
[0x999f96466aaf73ef]="teleport_end",
[0x99d1a08050c3fc9e]="teleport_end",
[0x99e18178050cdb5d]="teleport_start",
[0x9a0bb6c82953971d]="teleport_start",
[0x9a67f54e5851a757]="teleport_end",
[0x9adec4673b9f415d]="teleport_start",
[0x9b750e51fae5ae78]="teleport_end",
[0x9bc52a593e2b89ca]="teleport_end",
[0x9bd0099aae73eaba]="teleport_end",
[0x9cbf10bfd384a9cd]="teleport_end",
[0x9ccf609492679a38]="teleport_start",
[0x9cdd0cee9952ff34]="teleport_end",
[0x9cde952d67d8777b]="teleport_start",
[0x9d4e1d03f9cd227f]="teleport_start",
[0x9dc96cf2af7a1a51]="teleport_start",
[0x9e0ec7589f1231b8]="teleport_end",
[0x9e27c29e7383670e]="teleport_end",
[0x9e3c277751a4dde7]="teleport_start",
[0x9e8835ffb828db4f]="teleport_start",
[0x9ea5c6a8c661abaa]="teleport_start",
[0x9ede4d471c5a4982]="teleport_end",
[0x9f3793e20dfda36a]="teleport_end",
[0xa01171fb2bdb99a9]="teleport_start",
[0xa012fae8c3c04da2]="teleport_start",
[0xa028cca0b7650335]="teleport_end",
[0xa02fe570fe986f3d]="teleport_end",
[0xa04067b274573f4c]="teleport_end",
[0xa07121483f6f1c7c]="teleport_end",
[0xa07be16fa718d76e]="teleport_end",
[0xa0a37a384eb2f2ca]="teleport_start",
[0xa13ca9b3a525b637]="teleport_end",
[0xa1984f1717304def]="teleport_start",
[0xa199a7905f34357f]="teleport_end",
[0xa19d108aa85bdd1a]="teleport_end",
[0xa1dd36b4ac87f27d]="teleport_end",
[0xa1ef365454bbd82d]="teleport_end",
[0xa21c41cdcdc9c64b]="teleport_start",
[0xa26e63eaecc0f08e]="teleport_start",
[0xa2efee4c8cc13f44]="teleport_start",
[0xa2f5cff64a242a86]="teleport_start",
[0xa3ba20bf75ea8d67]="teleport_end",
[0xa41c47509843dc07]="teleport_start",
[0xa41f1f822edd5e35]="teleport_end",
[0xa433add5bd2bd014]="teleport_start",
[0xa45bc890c67db1ec]="teleport_end",
[0xa47088417f923e32]="teleport_end",
[0xa4736263e753c543]="teleport_end",
[0xa4af4f4b24e2fbf9]="teleport_start",
[0xa4b35d59b6aea4b9]="teleport_end",
[0xa4e4637505b2d540]="teleport_end",
[0xa522086eaa4eb283]="teleport_start",
[0xa556a257b446f563]="teleport_end",
[0xa5bc5df10eb8224b]="teleport_start",
[0xa5cca4ec8dd0f99d]="teleport_start",
[0xa5cec2602e6d3dd4]="teleport_start",
[0xa66cfe16b4587634]="teleport_end",
[0xa6b6b6a420e3ebfa]="teleport_end",
[0xa6bbcebefa940282]="teleport_start",
[0xa6db19f3e1d84ebb]="teleport_end",
[0xa7422c1b3b75df28]="teleport_end",
[0xa814df40487f4b4b]="teleport_end",
[0xa82518f0592b3147]="teleport_end",
[0xa8bd1c51aee23ee0]="teleport_start",
[0xa93cb6e9614131d9]="teleport_end",
[0xa9b571f618c086f5]="teleport_end",
[0xa9cff646a7b15b04]="teleport_end",
[0xa9ed7c29334dc39d]="teleport_end",
[0xaa0f6814a55be458]="teleport_end",
[0xaa30046bae87e545]="teleport_end",
[0xaa53d4bbcd70e5ed]="teleport_start",
[0xaa658d933b0597bc]="teleport_end",
[0xac05407da372da4f]="teleport_end",
[0xac08aa3d19d05ab5]="teleport_start",
[0xac2835aa9f65415c]="teleport_end",
[0xac5a504d5868adb3]="teleport_start",
[0xad0d866b3b8b86c4]="teleport_start",
[0xad475e02a2e0effd]="teleport_end",
[0xad9187a4a4176447]="teleport_end",
[0xadaf22c4345950be]="teleport_end",
[0xae10e933b5a5596f]="teleport_start",
[0xae19df0f84730bcc]="teleport_end",
[0xaecc8af68324c61c]="teleport_end",
[0xaf02d1226c78bc1b]="teleport_end",
[0xaf0fd501a840716c]="teleport_end",
[0xaf3c016875aa43e6]="teleport_end",
[0xaf61fbba46fe4d6c]="teleport_start",
[0xaf81c2cef15f8493]="teleport_start",
[0xb05a09bbf109350a]="teleport_end",
[0xb09a123525c13887]="teleport_start",
[0xb0ab386fc5f33f06]="teleport_start",
[0xb1233283d55a6397]="teleport_start",
[0xb18d03a345541c24]="teleport_end",
[0xb19d9cf110270483]="teleport_end",
[0xb2309b37a60875d7]="teleport_start",
[0xb2a37280dd899193]="teleport_start",
[0xb2e52ba49c396d56]="teleport_start",
[0xb33a5d723b924f61]="teleport_end",
[0xb34d591368d1d11b]="teleport_end",
[0xb3e0822df633fad1]="teleport_start",
[0xb41c04245e3fdc4a]="teleport_start",
[0xb4498cfbcc82b0f6]="teleport_end",
[0xb466737f169017bf]="teleport_end",
[0xb4bc9c9f8b948963]="teleport_end",
[0xb4d0ffa9f723cd3d]="teleport_end",
[0xb575231db433f849]="teleport_start",
[0xb5ab25f129032513]="teleport_end",
[0xb64c3dcc94019026]="teleport_end",
[0xb675b4ce1610a776]="teleport_start",
[0xb69af63ed90fa658]="teleport_start",
[0xb7ce89a5be059cb3]="teleport_end",
[0xb7e480c031a38461]="teleport_end",
[0xb82df39e1824eae5]="teleport_start",
[0xb8523a77b68d8d11]="teleport_start",
[0xb8c875387751ac4e]="teleport_start",
[0xb90cde79833ce484]="teleport_end",
[0xb96a28045a8534bb]="teleport_start",
[0xb971e288c5d09978]="teleport_end",
[0xb98018efaabd6824]="teleport_start",
[0xb99ca4edcc56cdac]="teleport_start",
[0xb9a208f86d4582ec]="teleport_start",
[0xb9affe284507751c]="teleport_start",
[0xb9cd034f87f33759]="teleport_end",
[0xbb94bbaa3ca4d365]="teleport_end",
[0xbbd06b7cab03dfa0]="teleport_start",
[0xbbd17794295ba41d]="teleport_end",
[0xbbf5f52c843055c0]="teleport_start",
[0xbc37eba80b631f11]="teleport_start",
[0xbce4f413d30929be]="teleport_end",
[0xbd3f89a209041491]="teleport_start",
[0xbd455f79023db531]="teleport_end",
[0xbdc915b5c870f141]="teleport_start",
[0xbe51c44879a38a1d]="teleport_end",
[0xbea4c75c43d2abfa]="teleport_start",
[0xbf185108b989f1da]="teleport_end",
[0xbf95b6369e25b1e1]="teleport_end",
[0xbff40d53259b2fdc]="teleport_start",
[0xc0351bf4dd09e8cc]="teleport_start",
[0xc0c79d17c2f0f606]="teleport_end",
[0xc0d8a6524abe89bd]="teleport_end",
[0xc1ce187ee86ede4c]="teleport_start",
[0xc1d009c21add8316]="teleport_start",
[0xc20f62bb735abd26]="teleport_start",
[0xc2977779d71f3132]="teleport_start",
[0xc298d96e2e2b3ed9]="teleport_end",
[0xc2d420f28a307c21]="teleport_end",
[0xc30c095a6e662969]="teleport_end",
[0xc313b1ccf6ee3213]="teleport_end",
[0xc378cf0e29e668cc]="teleport_end",
[0xc4129e029edbb3fa]="teleport_end",
[0xc428a5801540b9c0]="teleport_end",
[0xc43f59fc684e405e]="teleport_start",
[0xc4ca622d8eeaef7c]="teleport_start",
[0xc55c16d69fc7b6d3]="smoke_of_deceit",
[0xc5a67bc9ff2e8128]="teleport_start",
[0xc644dae69bc986c3]="teleport_end",
[0xc6c7ffece80b785a]="teleport_start",
[0xc6fa533613044d9f]="teleport_end",
[0xc82a7f1e2b669088]="teleport_end",
[0xc847db3f0f565765]="teleport_start",
[0xc86446e50a99b8eb]="teleport_end",
[0xc881d58024830d68]="teleport_start",
[0xc8ac9cdff4a88291]="teleport_start",
[0xc8d546bdb4b84916]="teleport_end",
[0xc92d5e1dda6741c4]="teleport_start",
[0xc950ddcbe4dc531f]="teleport_start",
[0xc997138fda82e630]="teleport_end",
[0xc9f777ade469c11e]="teleport_start",
[0xca0199e5ea448460]="teleport_end",
[0xca376c8ec583b86c]="teleport_end",
[0xca847821c5cbc6a6]="teleport_end",
[0xca8bb42ee4ea2b98]="teleport_end",
[0xca8e975dea6618c5]="teleport_start",
[0xcab192c7319695bc]="teleport_end",
[0xcb01c7da312f78dc]="teleport_end",
[0xcb0e89743455a611]="teleport_end",
[0xcb28a26d2a8a15d2]="teleport_end",
[0xcb5107be6e8aaf44]="teleport_start",
[0xcb723a61a1722fb1]="teleport_end",
[0xcba83533f44c064d]="teleport_start",
[0xcbc6c90b3b45c16d]="teleport_end",
[0xcbca78e1418b97b1]="teleport_end",
[0xcbe09258d797ed23]="teleport_end",
[0xcbf437f97fddbaac]="teleport_start",
[0xcc14aa7e4ef8a446]="teleport_start",
[0xcc77c7d3c7593157]="teleport_end",
[0xcc7e0f6343e70dc8]="teleport_end",
[0xcc9b04816b2389fa]="teleport_end",
[0xccdd02e4d9792171]="teleport_end",
[0xcd1340bdae305ba9]="teleport_end",
[0xcd32e0134fa04735]="teleport_end",
[0xcd47122d5c461728]="teleport_end",
[0xcd82d66df021ea95]="teleport_end",
[0xcde0393acc932408]="teleport_start",
[0xcdf5c3c4aeee261b]="teleport_end",
[0xce28bb88365056ec]="teleport_end",
[0xce291d518b393d7a]="teleport_end",
[0xce4e1bc731539cac]="teleport_start",
[0xce540bd47b797594]="teleport_start",
[0xce57382a3d6c2da9]="teleport_start",
[0xce6cab779b42ed66]="teleport_start",
[0xce97abe378b89b38]="teleport_start",
[0xcf1bcb87bb981bcb]="teleport_start",
[0xcf69f2d3dc94c571]="teleport_end",
[0xcf9b640607356e8b]="teleport_start",
[0xd00cb841c6994a66]="teleport_start",
[0xd01e126c93fa526a]="teleport_start",
[0xd09533fc18027899]="teleport_end",
[0xd0a2e48da1696063]="teleport_start",
[0xd1886469611b7661]="teleport_end",
[0xd18c81bb1f863e64]="teleport_end",
[0xd19bad8f9eca5c99]="teleport_end",
[0xd1b6b5064cb11eeb]="teleport_end",
[0xd1e0849fe588b25e]="teleport_end",
[0xd1ed2eb1f40b1f5e]="teleport_end",
[0xd208c8da99f4d4b0]="teleport_start",
[0xd2a0a31e5f493390]="teleport_start",
[0xd2e706f45873a7dc]="teleport_start",
[0xd2fa3637b5cdb9c4]="teleport_start",
[0xd32c6c232e32794a]="teleport_start",
[0xd335bf5c62564326]="teleport_end",
[0xd3857afd6ce7b0cd]="teleport_end",
[0xd3e804bc9435087e]="teleport_end",
[0xd40fabb82a0ac8ce]="teleport_end",
[0xd41f1244a51ddf4f]="teleport_end",
[0xd4be2b452d20d133]="teleport_start",
[0xd4c317455090d5db]="teleport_end",
[0xd4ccc1f004f33570]="teleport_end",
[0xd4f55d5568228a60]="teleport_end",
[0xd52f9f0131865d58]="teleport_end",
[0xd559fd9f84de58e2]="teleport_end",
[0xd57add07d44527ae]="teleport_start",
[0xd5d4438182bcb4ad]="teleport_end",
[0xd6283c9c86a490a1]="teleport_end",
[0xd643ae382adb732a]="teleport_end",
[0xd64406070da9d6bf]="teleport_end",
[0xd6667cc197c6c481]="teleport_start",
[0xd69aa4f5e36a43ee]="teleport_end",
[0xd6bd973c60a3e5a2]="teleport_end",
[0xd729660c77a76476]="teleport_end",
[0xd7466ea1e1e47faa]="teleport_start",
[0xd7ba260b6be2d58e]="teleport_end",
[0xd7c5a0dd1e4d0293]="teleport_start",
[0xd802b0b712796afa]="teleport_start",
[0xd81c7412c3a8f9f0]="teleport_end",
[0xd86f722bbb57b0d3]="teleport_end",
[0xd87b022622a58541]="teleport_end",
[0xd8a10f5d8c6c89a1]="teleport_start",
[0xd8fb59dfbbe2aead]="teleport_end",
[0xd98f08a712eeaf91]="teleport_start",
[0xd9c62278b9ab528a]="teleport_start",
[0xd9ed174ada366596]="teleport_start",
[0xd9f2795751540803]="teleport_end",
[0xdae9293ca7e28edc]="teleport_end",
[0xdb0f8049e92f01fd]="teleport_end",
[0xdc07364572f2cb0f]="teleport_start",
[0xdc2f101fb6d56528]="teleport_end",
[0xdc65a54362231146]="teleport_end",
[0xdc702a6b907eb9d2]="teleport_end",
[0xdcbdbc93bc68a6d9]="teleport_start",
[0xdcde7af13f55d81c]="teleport_start",
[0xddbdcb59d39b07fa]="teleport_end",
[0xddf4b52fa706a763]="teleport_start",
[0xde0a61bafb72828e]="teleport_end",
[0xde3d7b1bb75d59a7]="teleport_end",
[0xdeb051265583b201]="teleport_start",
[0xdef6c4ffc5981fa4]="teleport_end",
[0xdf274cfeb5b3549e]="teleport_end",
[0xdf468e791418c88c]="teleport_start",
[0xdf6123690083cf48]="teleport_end",
[0xdf6bc48fdb09a25e]="teleport_start",
[0xdf6c00923f81dd44]="teleport_start",
[0xdf852fd56bf2a1c6]="teleport_start",
[0xdfc3403a5fd7a056]="teleport_start",
[0xe00a5e387b5d4db0]="teleport_start",
[0xe013f4335cc5d44a]="teleport_start",
[0xe0141b71f5db1817]="teleport_end",
[0xe050ab1b21077c74]="teleport_start",
[0xe066d34fc7406819]="teleport_start",
[0xe07048b27c636d6e]="teleport_end",
[0xe083fc396839d938]="teleport_start",
[0xe0a113ac86d1c82f]="teleport_end",
[0xe0ecfcf17f89d26c]="teleport_end",
[0xe0f70e1b18fa38fa]="teleport_start",
[0xe0f809acfdfbd742]="teleport_end",
[0xe10064245fa449ec]="teleport_start",
[0xe106a57330874e84]="teleport_start",
[0xe1146f15100859e8]="teleport_start",
[0xe126ade19c1b81a8]="teleport_end",
[0xe1957a00b8253fa5]="teleport_end",
[0xe1ce7cf965f146a2]="teleport_end",
[0xe20be3b9ef799e85]="teleport_end",
[0xe28b5662ab7eb7c9]="teleport_end",
[0xe3062a88973f4f01]="teleport_start",
[0xe30c1194448573ba]="teleport_start",
[0xe3478d7f937c0d21]="teleport_end",
[0xe39fb452efba14b1]="teleport_end",
[0xe3e1d6dea8d659d6]="teleport_start",
[0xe498706a7107b850]="teleport_start",
[0xe4c02714b00ec11b]="teleport_end",
[0xe4fe87dd3994c64c]="teleport_start",
[0xe520e95cfffd3c25]="teleport_end",
[0xe58b8ca9690700d8]="teleport_end",
[0xe5d3b3144ad5fc05]="teleport_start",
[0xe5eaf98990b79fe8]="teleport_end",
[0xe60c6b544708240d]="teleport_start",
[0xe614f0ab897b558c]="teleport_start",
[0xe62fad6cc233b9e6]="teleport_end",
[0xe63c0d90e5dafb79]="teleport_start",
[0xe670235d9744bc79]="teleport_end",
[0xe691cacfbb544d1b]="teleport_start",
[0xe6961793fc449db9]="teleport_end",
[0xe6be21b36ebf5504]="teleport_end",
[0xe6deee0a0a003d1a]="teleport_start",
[0xe6e48c872f6a1c8f]="teleport_end",
[0xe6e7a74bded998bf]="teleport_end",
[0xe722dce6996d4ef9]="teleport_end",
[0xe7bfcabd4d86933d]="teleport_end",
[0xe7fb44fd2b9e2481]="teleport_end",
[0xe80c88068fad2449]="teleport_start",
[0xe853e2dcf81f25b5]="teleport_end",
[0xe8b12ad98f85c9bc]="teleport_start",
[0xe8b99b485c9b0d53]="teleport_end",
[0xe96c390ce0061d68]="teleport_start",
[0xe972e5ad7befdf0e]="teleport_end",
[0xe9855ee6c3b6bd18]="teleport_start",
[0xe9b42b4a933d2ea1]="teleport_end",
[0xe9be6c95024eb23b]="teleport_end",
[0xe9d11a05db308cb4]="teleport_start",
[0xea129e6632118eac]="teleport_end",
[0xea2ebe5a4fad8f64]="teleport_start",
[0xea4e5747f29ece10]="teleport_start",
[0xea561b66f497b386]="teleport_start",
[0xea5dbe7d6ac64bbb]="teleport_end",
[0xea78a8b2256869ce]="teleport_end",
[0xea9dba17e5621658]="teleport_end",
[0xeab2951306dff1fa]="teleport_end",
[0xeab7f4df8a974a78]="teleport_end",
[0xeadb6545010463a2]="teleport_start",
[0xeb0331e4c60031af]="teleport_end",
[0xeb6e332c157a6ea4]="teleport_end",
[0xeb90d820e9c81998]="teleport_end",
[0xebc6ada1570a2e7a]="teleport_end",
[0xec13588d67b764e9]="teleport_end",
[0xec49819720427af0]="teleport_end",
[0xeca4e08308601f2d]="teleport_start",
[0xed0feb3f0544de62]="teleport_start",
[0xed282e2f05bbaac3]="teleport_end",
[0xed4fd8a16dcec0e2]="teleport_end",
[0xede12056573f41b7]="teleport_end",
[0xede58344e38b5386]="teleport_end",
[0xee2ee266dd78a311]="teleport_end",
[0xee57932056b4553d]="teleport_start",
[0xee5b953a871c06c8]="teleport_end",
[0xee6244d82fd3bcdb]="teleport_end",
[0xeea8e8db4624b478]="teleport_start",
[0xeeaf576bf1186f80]="teleport_end",
[0xeec0b91ddbf5d76b]="teleport_end",
[0xeeea0f5162e2c608]="teleport_start",
[0xeef19703434d466f]="teleport_start",
[0xef1c440cf4dee2e9]="teleport_end",
[0xef35070221df1729]="teleport_end",
[0xef4136d2430e9707]="teleport_end",
[0xf025a64283a8ceca]="teleport_end",
[0xf090cecdf27557e1]="teleport_end",
[0xf0dc618988dbeb6d]="teleport_end",
[0xf153928fb25ef375]="teleport_end",
[0xf15e4d309ea9faa8]="teleport_end",
[0xf1a44c36149eaed2]="teleport_end",
[0xf1fde6c2c9404386]="teleport_start",
[0xf20a6b6d1384b656]="teleport_end",
[0xf212614b9b635924]="teleport_end",
[0xf22d5302a8b7987b]="teleport_end",
[0xf27be89c0cba765e]="teleport_start",
[0xf2d84861980916d9]="teleport_end",
[0xf2da55d8c25e95d1]="teleport_start",
[0xf37db035698ff869]="teleport_start",
[0xf3c18964c1fc0b20]="teleport_start",
[0xf3f2d85b5e0f1ddf]="teleport_start",
[0xf4ca2ed7e14a5603]="teleport_end",
[0xf4e51fb2982e463c]="teleport_start",
[0xf5a640dc8ef557f8]="teleport_end",
[0xf5f70ff2b699be49]="teleport_end",
[0xf65145b80a7e837f]="teleport_end",
[0xf68466b4a2fecd7b]="teleport_start",
[0xf690357b1aac3f5e]="teleport_start",
[0xf7817122f4f90180]="teleport_start",
[0xf7b72976ac831f40]="teleport_start",
[0xf7e0fa31ca60ef9d]="teleport_end",
[0xf8202e3689bbc6e3]="teleport_end",
[0xf828eb627e6166d6]="teleport_end",
[0xf840bed4256d2d16]="teleport_start",
[0xf85e99cbf854a6e0]="teleport_end",
[0xf864d02e9bc2f978]="teleport_start",
[0xf8a1c181f111ba56]="teleport_end",
[0xf8cb40d67703521b]="teleport_start",
[0xf910eda2a340ba24]="teleport_start",
[0xf91410934c240553]="teleport_end",
[0xf91f404d190dfb2b]="teleport_end",
[0xf9264ef3ae478154]="teleport_end",
[0xf9362955ed7c048b]="teleport_start",
[0xfa09b07493de5437]="teleport_end",
[0xfa39dfa7e3849bcd]="teleport_end",
[0xfa6bcdeb397ed1c5]="teleport_start",
[0xfb2197526294fe79]="teleport_end",
[0xfb2cd77a2cc4a00b]="teleport_start",
[0xfb406a3f1c972f4d]="teleport_start",
[0xfb849d06ad1ab2eb]="teleport_start",
[0xfbb3886afc764595]="teleport_end",
[0xfc10bc9d58f23c19]="teleport_start",
[0xfc78c5fcd601c26d]="teleport_end",
[0xfcc29faa86a3389d]="teleport_start",
[0xfd0d14bfe0405607]="teleport_start",
[0xfd19781432004668]="teleport_start",
[0xfd21e53bb6f2aa4e]="teleport_start",
[0xfd4cbea1e4e80310]="teleport_end",
[0xfd53d05a09228521]="teleport_end",
[0xfd5c5bb6edd8b6b8]="teleport_end",
[0xfd633011015393eb]="teleport_start",
[0xfd6547c9425f6220]="teleport_start",
[0xfe0f93d0b51804fa]="teleport_end",
[0xfe3e916b440abe11]="teleport_end",
[0xfe42d9da877bc924]="teleport_start",
[0xfe7b899777a379d5]="teleport_end",
[0xfeacec2febc56d34]="teleport_start",
[0xff53225195bc5f63]="teleport_start",
[0xffa8144e3a22f89b]="teleport_start",
[0xffd2c76b4d0d7757]="teleport_start",
[0xffe607b4b7c78f54]="teleport_end",
[0xffefd7ac7b1c7e58]="teleport_start",
[0xfff5a134b62e7bd0]="teleport_start",
}
data/cast_particles.lua920 lines
-- generated by tools/fog_casts/gen_casts.py from fog_particles.json, do not edit.
-- particle hash -> hero index (negative: the spell can land away from him, so only a
-- control point bound to the hero himself places him). 788 particles, 123 heroes.
local H = {
"npc_dota_hero_abaddon",
"npc_dota_hero_abyssal_underlord",
"npc_dota_hero_alchemist",
"npc_dota_hero_ancient_apparition",
"npc_dota_hero_antimage",
"npc_dota_hero_arc_warden",
"npc_dota_hero_axe",
"npc_dota_hero_bane",
"npc_dota_hero_batrider",
"npc_dota_hero_beastmaster",
"npc_dota_hero_bloodseeker",
"npc_dota_hero_bounty_hunter",
"npc_dota_hero_brewmaster",
"npc_dota_hero_bristleback",
"npc_dota_hero_broodmother",
"npc_dota_hero_centaur",
"npc_dota_hero_chaos_knight",
"npc_dota_hero_chen",
"npc_dota_hero_clinkz",
"npc_dota_hero_crystal_maiden",
"npc_dota_hero_dark_seer",
"npc_dota_hero_dark_willow",
"npc_dota_hero_dawnbreaker",
"npc_dota_hero_dazzle",
"npc_dota_hero_death_prophet",
"npc_dota_hero_disruptor",
"npc_dota_hero_doom_bringer",
"npc_dota_hero_dragon_knight",
"npc_dota_hero_drow_ranger",
"npc_dota_hero_earth_spirit",
"npc_dota_hero_earthshaker",
"npc_dota_hero_elder_titan",
"npc_dota_hero_ember_spirit",
"npc_dota_hero_enchantress",
"npc_dota_hero_enigma",
"npc_dota_hero_faceless_void",
"npc_dota_hero_furion",
"npc_dota_hero_grimstroke",
"npc_dota_hero_gyrocopter",
"npc_dota_hero_hoodwink",
"npc_dota_hero_huskar",
"npc_dota_hero_invoker",
"npc_dota_hero_jakiro",
"npc_dota_hero_juggernaut",
"npc_dota_hero_keeper_of_the_light",
"npc_dota_hero_kez",
"npc_dota_hero_kunkka",
"npc_dota_hero_largo",
"npc_dota_hero_legion_commander",
"npc_dota_hero_leshrac",
"npc_dota_hero_lich",
"npc_dota_hero_life_stealer",
"npc_dota_hero_lina",
"npc_dota_hero_lion",
"npc_dota_hero_lone_druid",
"npc_dota_hero_luna",
"npc_dota_hero_lycan",
"npc_dota_hero_magnataur",
"npc_dota_hero_marci",
"npc_dota_hero_mars",
"npc_dota_hero_medusa",
"npc_dota_hero_meepo",
"npc_dota_hero_mirana",
"npc_dota_hero_monkey_king",
"npc_dota_hero_morphling",
"npc_dota_hero_muerta",
"npc_dota_hero_naga_siren",
"npc_dota_hero_necrolyte",
"npc_dota_hero_nevermore",
"npc_dota_hero_night_stalker",
"npc_dota_hero_nyx_assassin",
"npc_dota_hero_obsidian_destroyer",
"npc_dota_hero_ogre_magi",
"npc_dota_hero_omniknight",
"npc_dota_hero_oracle",
"npc_dota_hero_pangolier",
"npc_dota_hero_phantom_assassin",
"npc_dota_hero_phantom_lancer",
"npc_dota_hero_phoenix",
"npc_dota_hero_primal_beast",
"npc_dota_hero_puck",
"npc_dota_hero_pudge",
"npc_dota_hero_queenofpain",
"npc_dota_hero_rattletrap",
"npc_dota_hero_razor",
"npc_dota_hero_riki",
"npc_dota_hero_ringmaster",
"npc_dota_hero_rubick",
"npc_dota_hero_sand_king",
"npc_dota_hero_shadow_demon",
"npc_dota_hero_shadow_shaman",
"npc_dota_hero_shredder",
"npc_dota_hero_silencer",
"npc_dota_hero_skywrath_mage",
"npc_dota_hero_slardar",
"npc_dota_hero_slark",
"npc_dota_hero_snapfire",
"npc_dota_hero_sniper",
"npc_dota_hero_spectre",
"npc_dota_hero_spirit_breaker",
"npc_dota_hero_storm_spirit",
"npc_dota_hero_sven",
"npc_dota_hero_techies",
"npc_dota_hero_templar_assassin",
"npc_dota_hero_terrorblade",
"npc_dota_hero_tidehunter",
"npc_dota_hero_tinker",
"npc_dota_hero_treant",
"npc_dota_hero_tusk",
"npc_dota_hero_undying",
"npc_dota_hero_ursa",
"npc_dota_hero_vengefulspirit",
"npc_dota_hero_venomancer",
"npc_dota_hero_viper",
"npc_dota_hero_visage",
"npc_dota_hero_void_spirit",
"npc_dota_hero_warlock",
"npc_dota_hero_weaver",
"npc_dota_hero_windrunner",
"npc_dota_hero_winter_wyvern",
"npc_dota_hero_wisp",
"npc_dota_hero_witch_doctor",
"npc_dota_hero_zuus",
}
local P = {
[0x00551789ba47390c]=57,
[0x00a30144d4802358]=-57,
[0x00c30c138d95fbdc]=89,
[0x0107f39531941a16]=115,
[0x011af119e025f71e]=-94,
[0x01269a941da1c96d]=66,
[0x01419df1d12ba296]=-47,
[0x0150ff285902691a]=-92,
[0x0234dfc218ee714b]=59,
[0x0262802bddc1c7b5]=46,
[0x02758451eaeb9774]=102,
[0x0305d260f7b3a9e2]=48,
[0x033e624905bdf233]=116,
[0x03486f4f12bf0978]=116,
[0x03ecd971cba950c7]=13,
[0x04a547d7004000e2]=86,
[0x04d4caa121721095]=-23,
[0x05904bee34a2cbe5]=-98,
[0x063ad98fc99c49ab]=22,
[0x0660423d9c00ea00]=46,
[0x06fe829cd2a06b23]=116,
[0x080dfd050a34221b]=107,
[0x082f43a1cf8e963f]=7,
[0x0889a6a1706ea28b]=-4,
[0x08ae6af4a2777927]=21,
[0x0a21464a780b3679]=-15,
[0x0b002158c8e0d32e]=120,
[0x0bcae9e6025eef08]=47,
[0x0c6f620cf2c74f65]=97,
[0x0d17e3e8bb46426e]=44,
[0x0d4c55fc6d0550c6]=-18,
[0x0d99c1147bf936ce]=-30,
[0x0dc0fd07904bae6c]=90,
[0x0e28fc16abfe6c42]=110,
[0x0eab15ccb51ef5f7]=82,
[0x0f6410b915beb409]=75,
[0x10c82c9580f2ab6c]=73,
[0x10cc52201dadda0a]=55,
[0x114f7beedfd7974b]=72,
[0x116763a96dba716e]=13,
[0x11d6e8c884e2c022]=25,
[0x11e4c3af02bb9fdc]=45,
[0x11e62de58adc75f6]=26,
[0x124809b2df71c3f5]=59,
[0x126374d7409bc447]=106,
[0x135f44c36634d185]=84,
[0x14245074acc57679]=92,
[0x1433ae5a95014144]=119,
[0x144fe848d9d5623c]=10,
[0x14f86f609165f4a3]=109,
[0x15b14e81e5d4bce9]=36,
[0x15ba5bd9ababccbb]=87,
[0x162afaf3f6df3251]=92,
[0x163f89649667b70e]=-74,
[0x16ad5d969c00782e]=40,
[0x16e30a1f4b6c475c]=-99,
[0x1724ff5297e4e906]=70,
[0x17afb9d7307c4d03]=44,
[0x17ca95163c7cbc87]=52,
[0x17f4a3d73b9d8c1f]=-38,
[0x18293876c89f6fc5]=120,
[0x1830f3e7b2e3818b]=97,
[0x1831050b8c944a7f]=46,
[0x18b772d992621b46]=55,
[0x190a733b098c390e]=-79,
[0x190ae22d5e7a4f77]=12,
[0x192a39726c9e651f]=5,
[0x19528b7f1c63409c]=115,
[0x195e1632a19b2ec0]=115,
[0x199854b2a974b389]=-37,
[0x1bb3e7ef8ca9ff22]=6,
[0x1bba2277207d5580]=71,
[0x1bd5a429c6e14417]=59,
[0x1c0392d1823cc854]=49,
[0x1c32d0dccac0a784]=49,
[0x1c47e58c071fdbc0]=15,
[0x1ccb2de95c6162e9]=48,
[0x1d9e5f1bcd83a5e7]=98,
[0x1e497d1a65322629]=60,
[0x1e75d35e97b55979]=18,
[0x1e76188d9c1360a0]=31,
[0x1e9f544575622429]=117,
[0x1f15799175e6891e]=30,
[0x1fee10e0b3391563]=87,
[0x2068d063f9c78589]=22,
[0x20783289d1c3202a]=47,
[0x20e5a01b638ef65f]=-109,
[0x20f4216b30a06bd2]=-40,
[0x216a3434431073bb]=56,
[0x219a319803f8135a]=105,
[0x21a20e62732defc9]=30,
[0x21a837c3f061b6e9]=58,
[0x22ab5199c44ab35d]=45,
[0x22c0a1f6741b88ff]=104,
[0x22d18e013c48da2d]=29,
[0x22dece9b9dfb4c2b]=49,
[0x22f49dd693edd24b]=88,
[0x22f4c08a02b455f1]=113,
[0x23434ab402b1d1e3]=44,
[0x239c06d094369294]=-79,
[0x23ecb63867c80a2f]=97,
[0x24a7a4f29c522ddc]=106,
[0x25a12813fe9af6eb]=109,
[0x25b90ed1f23315ec]=23,
[0x26108c0da9f3e74d]=86,
[0x26996fa0122b118f]=24,
[0x26a8951fec284421]=79,
[0x26e011b896a67f40]=108,
[0x26ebb8069ae2697d]=-22,
[0x26f04589a586b222]=34,
[0x274bb97c52424dfc]=38,
[0x2755502f852b88ee]=54,
[0x27f11b6f09e7211b]=-81,
[0x2812e98c551833ba]=65,
[0x28b9823c3c77a4e8]=71,
[0x28d0bf4869a4e803]=45,
[0x28f73e6a32226ca4]=104,
[0x29808a191e2073fc]=86,
[0x29927e1ed2f80d41]=117,
[0x29c426cfd469cda4]=28,
[0x29ec90d8fc969827]=25,
[0x2a42374bee457f24]=13,
[0x2a4c726d9afca1a1]=13,
[0x2a678680a97c69f0]=81,
[0x2a7120004027afa6]=86,
[0x2b0364c0a458bc4c]=90,
[0x2b3d0d6b159f117f]=88,
[0x2b64e7385f3326ca]=75,
[0x2ba0d5830bc61c4f]=52,
[0x2c9a3b328aef275d]=93,
[0x2cfed8c51a0cbc55]=109,
[0x2d73ec717a67bb9d]=19,
[0x2d8f4c960f6a4585]=-16,
[0x2db6e075b5df1081]=110,
[0x2ddec55fb1467d33]=64,
[0x2e10f5d0f18a932e]=49,
[0x2e122d10f38cf791]=3,
[0x2e172bfd96d5d75f]=-23,
[0x2e7986554973a46b]=22,
[0x2e7abbce72edecba]=100,
[0x2ebac1ba67bad40d]=77,
[0x302878ec8a119aae]=-94,
[0x30e05de92b702bab]=23,
[0x30f108aa77650329]=87,
[0x3135f349b81079ed]=116,
[0x316321ce7a64bcb2]=116,
[0x31f4a1d8b8cb3346]=-23,
[0x32378c2734f32997]=95,
[0x324cab76faaae2d3]=90,
[0x3256c2fb01cbebfa]=77,
[0x32db9fc41a907b7d]=121,
[0x32e49f9d6a035c9a]=75,
[0x33965c53d64772d7]=-123,
[0x339de061e8a8e638]=102,
[0x33dfb31630ca83dc]=58,
[0x34139f81524ef7e2]=13,
[0x3456b18d5d8055f9]=90,
[0x34d6bac44ef8e16d]=50,
[0x3508882d36d0a77e]=4,
[0x35564de96c57848d]=-32,
[0x35895b0e3f7adc70]=-64,
[0x35f2ff59ca6c1f85]=76,
[0x3664188723e304d0]=88,
[0x369d525fc64c3ec2]=68,
[0x36ae1c7655ff7ea7]=78,
[0x36e9086ed56c8547]=108,
[0x3708667ee7e08d9c]=104,
[0x37131415e842a886]=72,
[0x3713851813916bca]=49,
[0x377f39cba719e9a0]=-123,
[0x37862840497b2374]=117,
[0x37b795a5b222a1ef]=-119,
[0x385683410fb95e3b]=87,
[0x387df41719dde718]=79,
[0x38f092d9c2d87c4a]=2,
[0x391968ab727125a0]=64,
[0x394af7018a226ea6]=109,
[0x3a1644bdaee01a38]=95,
[0x3a72fd089a868fc6]=88,
[0x3ab55259b8f20ed1]=120,
[0x3b0d1a90756b285f]=-26,
[0x3b4511a0eed8abdc]=75,
[0x3bf73419c9e71092]=-16,
[0x3c016b014ee9704c]=30,
[0x3c2eabb9d821e829]=-6,
[0x3c5c07f6d57b516d]=2,
[0x3ce0083615b3ad12]=117,
[0x3ceb8a07e0964229]=81,
[0x3cfe8594b7ea5ef0]=114,
[0x3d1f063277cd8311]=-22,
[0x3dc98ce971394c4a]=41,
[0x3e1dc2b392aa8785]=22,
[0x3e2843dddaebec66]=3,
[0x3e9e78e41a0d2b78]=9,
[0x3ecc4a248df44d42]=-61,
[0x3f2274946729c35e]=46,
[0x3f4aecf8d86a8786]=-43,
[0x3fe9efe9e5cda581]=2,
[0x3ffc03752a025ae3]=63,
[0x40cb8e96383e5e7d]=42,
[0x415bf7dfd72ce1c9]=76,
[0x418feaf406fb47ac]=33,
[0x423261825b7af801]=2,
[0x42bc810120766a09]=28,
[0x42e28d05af11cb18]=-40,
[0x43d755fcc3ae5199]=106,
[0x448b8c3912792090]=-88,
[0x44f245cf870a5126]=101,
[0x456c328ef5247ac7]=31,
[0x459cd231c305fdac]=-123,
[0x45f0a433c7b0693c]=23,
[0x4676f1a889d77960]=42,
[0x46ace9d59ed644cb]=27,
[0x46c3e67716679ead]=88,
[0x46c91e4fa3314e37]=20,
[0x470987ef52fa6968]=120,
[0x471a3ebb751e367c]=-105,
[0x47a5a428989089f2]=34,
[0x47c0f981bbd8f79c]=58,
[0x47ea63e2430c83b9]=108,
[0x4805509c7f948746]=93,
[0x4903db31cd458719]=-84,
[0x491a058fb56d1ccd]=87,
[0x494fb63f5794cbfb]=14,
[0x49ecd9cd19238ab6]=53,
[0x4a335c7913232aa4]=38,
[0x4aaf1f2007e1eff6]=16,
[0x4ac4b2e6bf8de7d9]=121,
[0x4aefb14750d9b2a2]=6,
[0x4b734dbb91c5106b]=20,
[0x4bc16edae886ac16]=62,
[0x4bfd7c31ac343c81]=86,
[0x4c88c43735974cc1]=120,
[0x4ce22b09205ed229]=-80,
[0x4ceb114d5915b986]=118,
[0x4cf2d5ff9f6e75f0]=-45,
[0x4dd5558f0dfa65a7]=81,
[0x4dd9740148c046ab]=-45,
[0x4dfb1f00cec9b03c]=107,
[0x4ea8b3e7dcbc24e7]=32,
[0x4eec25f29d54e964]=33,
[0x4ef9141ae9c5a903]=13,
[0x4f78250bf1b64a7e]=25,
[0x4fac737fa8e2ba31]=44,
[0x4ff1326b04ae683a]=73,
[0x5161c2f4be8d88bb]=61,
[0x516fd7c1c3117c41]=54,
[0x521628909beb329c]=95,
[0x52bfb0d03d815c4b]=47,
[0x530b32ce7f476121]=123,
[0x531b51edd06103c7]=19,
[0x53addb51f19adde5]=109,
[0x53d092fcfbc82dba]=21,
[0x5413354dcd75dd90]=-123,
[0x54c23afe2b946374]=-83,
[0x54f2e52b36053866]=84,
[0x55960694be6507e8]=41,
[0x55ed44cc40fec515]=49,
[0x5632fd023ace1826]=34,
[0x56621ab8598d321c]=17,
[0x56ad220c56de9bf9]=116,
[0x579760a876aab4c3]=99,
[0x57af09d100cdbf9d]=19,
[0x582dfab0e3f946ad]=90,
[0x583d9a181403c583]=21,
[0x59d88d8cc8a17922]=-30,
[0x59fd4add064ce505]=6,
[0x5a6bbd4ac2ed2347]=108,
[0x5ab4311709774e90]=86,
[0x5ac95b3427f241f5]=70,
[0x5accc910319c70f1]=-11,
[0x5ad1e4641ccb705b]=42,
[0x5b61377607f10147]=7,
[0x5bd2f4fc4ec6dab7]=12,
[0x5c1820ea62895dcd]=48,
[0x5c2d42e0ec8b03a9]=6,
[0x5c67fef551924cab]=4,
[0x5c7555b6fa962285]=-5,
[0x5d09fb8b4e11ee8e]=56,
[0x5dbf5b74cf3cd81a]=68,
[0x5e392e44e505f02a]=97,
[0x5ede6e9b0de88d6f]=48,
[0x5fde17d3db70fd87]=28,
[0x5ff005146e30b21f]=33,
[0x603df270b157ea0a]=93,
[0x604f6bf7eae46ec4]=48,
[0x610065d322918abf]=12,
[0x6155efffbf111e8a]=100,
[0x61c19bf69d2be96a]=117,
[0x61e0bd9202475323]=73,
[0x628b11e2011e2f92]=-67,
[0x62f59a63e58543ad]=55,
[0x63bf594b4e6fe7ab]=63,
[0x64296d52dd618bfd]=38,
[0x6460abe586e58085]=121,
[0x64853e0fb48dec66]=115,
[0x64e1886f63c71d68]=73,
[0x653cc0092edfec12]=87,
[0x65a354eeaeb3417c]=96,
[0x6674fae2959f46fa]=-92,
[0x66b2db43fda0a7da]=30,
[0x66d34e6889dd9d80]=51,
[0x670d005ae2bc7fa2]=76,
[0x677849fe5846c2c0]=-23,
[0x678f0c3bc3bd5a4a]=78,
[0x67ea9b83ef908521]=62,
[0x6823db44ec801f10]=2,
[0x68734fb76c5351bb]=-119,
[0x68830fcefd2a3002]=64,
[0x68c623acedef7a46]=79,
[0x68d3923ce04f77c0]=30,
[0x6921786d5c1b6379]=44,
[0x697e0fdc60fd64ae]=7,
[0x699ab36074872426]=57,
[0x69ff20222619e43a]=29,
[0x6b9137b6cfa2efcd]=56,
[0x6b94078738e31cd6]=3,
[0x6b94a5c5746d69f3]=91,
[0x6bc601383c7a6b83]=5,
[0x6be01575598ae58a]=123,
[0x6c19b6986508c09c]=50,
[0x6c6245580b603296]=95,
[0x6c98579abfd78f44]=9,
[0x6cabc8d1f3ffbe2f]=114,
[0x6d112905753f602e]=39,
[0x6d446079a789d344]=30,
[0x6d8311572ae2048d]=32,
[0x6db332c316bf3c37]=96,
[0x6db4e55532669cc4]=38,
[0x6dc6932c2d3f8544]=59,
[0x6de662f133d213a2]=1,
[0x6dec5694a7116920]=115,
[0x6df36e8ae607447e]=74,
[0x6df4470ca9a715a6]=85,
[0x6e05513a8009f380]=60,
[0x6e6c69c25e4fdcc1]=56,
[0x6e8d432791a8ae60]=37,
[0x6f16fb45a601a455]=10,
[0x6f1fbcbabadb0f63]=-88,
[0x6f59a13d958c5c8f]=-32,
[0x6fc092f8ee6a8ce0]=55,
[0x6ffb6e8e099ffbfa]=10,
[0x702ddb4387de5d79]=49,
[0x70758da0f449f0d9]=73,
[0x70e5e9d8a5aa28a0]=-33,
[0x712792e65030cf68]=123,
[0x712e3cf9b04805ec]=46,
[0x7153d0d489c4eba7]=71,
[0x724b58f690fcc5f2]=-61,
[0x7277bc9ca2bbc801]=-93,
[0x7290dbc2731c11d3]=71,
[0x734165bfe20dd732]=85,
[0x73534e0981d4570f]=-61,
[0x744537042f840e1d]=115,
[0x7449cca095d5a8ff]=44,
[0x7581b1e3a8b43cad]=101,
[0x75a0952673031fa0]=18,
[0x75b47cefad95d020]=83,
[0x75d53071519e3db8]=103,
[0x76de0996515c87c5]=111,
[0x770474116f2f33d5]=39,
[0x776e2075923f0ce4]=69,
[0x779f94b573d94144]=26,
[0x7819bfd3f97becdd]=1,
[0x78483cb238ab8acc]=31,
[0x791c3d3964d4782b]=-26,
[0x794cd3fc906f8a0f]=116,
[0x79a2051cce5dc2fd]=46,
[0x79b198c57a65be06]=115,
[0x7a7d393003d4a75c]=-92,
[0x7a7db85519c7609b]=-9,
[0x7aac08f510b50258]=-26,
[0x7b035b1ada56d721]=81,
[0x7b4742d0e7a9433d]=51,
[0x7c1bdd3a6d84c6a4]=3,
[0x7c70dc6b90bd6711]=42,
[0x7c72386d1168cfac]=44,
[0x7c82c27462e6264b]=73,
[0x7c8dc51d4d823d9e]=78,
[0x7d2e8263f059ce93]=74,
[0x7e3a94be5f816837]=9,
[0x7e73da4c4dfabe83]=44,
[0x7ee2a39bd687b07b]=-62,
[0x7f88c11a8abeccd5]=61,
[0x7faaede156456acd]=44,
[0x81c848b235aec71e]=56,
[0x821925fa52ae2cca]=-37,
[0x825dd6e54b9905dd]=-121,
[0x829caf26111aafa3]=-31,
[0x82e22aaceac3c0c4]=64,
[0x82f76e250f9ad0b3]=64,
[0x8327d5a3b137eaeb]=-6,
[0x834bb6f39fa51b24]=45,
[0x83550fa4f403e48d]=33,
[0x83a1afb85e1938ce]=81,
[0x83d04830433d9e18]=92,
[0x841d58c26e7c43a0]=71,
[0x84436e5c0ddda530]=2,
[0x845ebf761c07f20e]=75,
[0x84989ebe09c3f6e3]=64,
[0x849f492027eb73ec]=30,
[0x852e5048c4f17686]=2,
[0x8540e3a61e5fafec]=55,
[0x8585825b2cb992c9]=106,
[0x85a89613a7d16d9a]=101,
[0x85aff9f0f51d1870]=49,
[0x85e4196c8c253f18]=43,
[0x85efe0b08a451892]=109,
[0x863754b0dc74fce8]=77,
[0x869e1d8aa13bd133]=103,
[0x86c504eb0c6b3313]=96,
[0x86e0219b35250319]=-58,
[0x87b1966dda1ec4b6]=93,
[0x880dbe0ba2acc14e]=83,
[0x8873a035e53fb31b]=13,
[0x88e685d5e4cd188a]=32,
[0x891f7edc572261ab]=-63,
[0x8939cb55741d4b97]=57,
[0x8a0f4891c3226616]=25,
[0x8a343b8a66e09ac6]=31,
[0x8a728da18445b428]=110,
[0x8ae8d27c5bb024b3]=35,
[0x8c12585659169377]=96,
[0x8cd4b0167110b575]=87,
[0x8d014e4fccd30d23]=80,
[0x8d68b86daae9b578]=70,
[0x8d6fa238c5e3cb0e]=117,
[0x8d75e53bd43d8697]=18,
[0x8db04021f4d021d8]=-81,
[0x8e206816374158a7]=108,
[0x8e564ffbf3045be0]=18,
[0x8f56a733a7d9abda]=75,
[0x8fbe58fe2dd6dcfe]=-40,
[0x90139760e06ec93e]=-22,
[0x9042f1859348efb9]=-79,
[0x906a7e9012aa6f82]=90,
[0x9241b0783b2b9eaa]=73,
[0x92506aad78252ed9]=14,
[0x92c3f1c759f9c58f]=70,
[0x92e3e8d7e1b36c20]=-119,
[0x932a3e32492a7911]=-97,
[0x933aaa23a938e3d5]=89,
[0x9358097cf24700d3]=120,
[0x93d07fb9ff793729]=12,
[0x93e4ca109ce9aac9]=23,
[0x93f51656c1079b1d]=103,
[0x947b2f00ada14d35]=-88,
[0x9483c56016c59a48]=38,
[0x948e7c47ffd93df1]=-79,
[0x94a060be883b5853]=92,
[0x9536a1b85456d446]=60,
[0x959d1ef52bba1687]=31,
[0x95f8716b2d29866e]=69,
[0x9607f736ca005488]=87,
[0x9688b240f8201544]=9,
[0x969a360ecca62ae5]=46,
[0x97309e6290eccd89]=61,
[0x97c9774208541dca]=80,
[0x9857e8ba77377879]=50,
[0x98def428910a4d17]=102,
[0x9952e611e8955c4f]=117,
[0x99f522c2f687fa07]=103,
[0x9a072e710e816871]=64,
[0x9a0aa4784e668d74]=120,
[0x9a0b8be8d818f863]=-40,
[0x9a8048c1c28b728c]=46,
[0x9a89e71b716696e1]=92,
[0x9b1b126b6f4b6cdc]=111,
[0x9b98896f874df11d]=55,
[0x9ba4aee346442cf4]=12,
[0x9bae7061aa3d962e]=-84,
[0x9bc77409e45658ea]=117,
[0x9bf2b3d74bffb32e]=28,
[0x9bff7b7493609886]=45,
[0x9c13c5c01ccab392]=44,
[0x9c2bdabd1ecd95dc]=35,
[0x9c7e52bd8f86a0f4]=42,
[0x9c8f6f74bbc5e8db]=108,
[0x9c9105bcf3878dc7]=78,
[0x9cad32ed098f43a1]=71,
[0x9d2470456e7d0b76]=65,
[0x9d4a663022c4e32b]=88,
[0x9d8700c18999a795]=32,
[0x9d9eae01fa75ab02]=115,
[0x9dffa04d7573f5b7]=44,
[0x9e9a0c1e311bfcf4]=71,
[0x9f38e567bca4480f]=39,
[0x9f4028d950287a0f]=65,
[0x9f84158c684fb9b0]=-109,
[0x9ffb30b040038005]=48,
[0xa03f87203b22cc32]=-80,
[0xa0768b597f32885f]=72,
[0xa0a84110032bae3a]=105,
[0xa1226ff27a6f4190]=72,
[0xa1705ea0c40e1c18]=-61,
[0xa1e0ad5244f36b14]=75,
[0xa1ea1579476db85c]=26,
[0xa20ea180a3f9bd24]=103,
[0xa2821b76190762c4]=34,
[0xa31e00a9de7f283b]=-57,
[0xa3acdbeec5e1ca7c]=103,
[0xa41e4d206a9e6f92]=96,
[0xa4986ca90cbaa8be]=110,
[0xa4bcb4c1d21055bb]=52,
[0xa5000b8c0d7946b2]=56,
[0xa54fae9fda8821fd]=-30,
[0xa5903326f73466ec]=90,
[0xa5a73ba71e25add6]=106,
[0xa5a877e082b28ede]=34,
[0xa624a40f2fa5c2a0]=101,
[0xa6f1702718dc79d4]=42,
[0xa73e9e858d5978f2]=44,
[0xa78877eff43eb463]=117,
[0xa7a2a8acd16e903a]=-42,
[0xa7af32944fb6e9be]=48,
[0xa820417bb0c3adfa]=33,
[0xa860ea30beee8592]=-109,
[0xa885bb563906dbbb]=85,
[0xa920b14b6bfce0b6]=89,
[0xa9220c85d6bb5f6b]=108,
[0xa92c6a1b5b3558db]=51,
[0xa950a1670b254157]=88,
[0xa973d4cfcd1862d5]=23,
[0xa990b576c9618842]=-97,
[0xa9f43b3faeca1609]=83,
[0xaa6b0b88b09f095e]=73,
[0xaad42050d20ed703]=16,
[0xab20419d626f8024]=122,
[0xab4a05968854b554]=66,
[0xac0585a3843e2f17]=36,
[0xac1cf4e1613da1ae]=48,
[0xaca26623dd74cfe7]=72,
[0xacb0e102cf21f337]=49,
[0xad414ed358f17907]=117,
[0xadb6ffb0f74a94a9]=80,
[0xadc5f4320606c15a]=116,
[0xade9d31ebac361b4]=2,
[0xae03a2ae9e154f11]=46,
[0xae2da8cd016fee0b]=77,
[0xaf024a645ce404da]=38,
[0xaf090bb2771610d1]=104,
[0xaf8e56bc5e039a26]=64,
[0xafa32c88366c1de6]=30,
[0xafacd710423ae04d]=100,
[0xafb7bacb62947c21]=74,
[0xb0329ed0d86b804a]=113,
[0xb05b753745974e8d]=89,
[0xb079c80ccf984d40]=-30,
[0xb079cbecbcfcb761]=33,
[0xb0bb2e2ccb5650ed]=3,
[0xb143b35a26234839]=69,
[0xb1749ff7d203b055]=75,
[0xb182baccc86aecda]=-84,
[0xb21add2127d14194]=39,
[0xb21ee1cc7ee5a089]=-119,
[0xb23912418e76e68a]=-43,
[0xb240c184452d18b6]=87,
[0xb26008f9fb904a1f]=76,
[0xb2eb8fbebd9c6f14]=25,
[0xb3218dfac3530c58]=75,
[0xb342b1308ada1b03]=79,
[0xb3d440f1c0033694]=-18,
[0xb455201e1c4dd9d9]=122,
[0xb455caf6a4de08d1]=-39,
[0xb45916f4588fa1f4]=-63,
[0xb47556c47b857141]=89,
[0xb54614052fab6c1f]=-123,
[0xb5ed8a4608241002]=92,
[0xb5f57588e9244771]=23,
[0xb6264317a663d67d]=91,
[0xb637be5d2e7a49c2]=42,
[0xb66b59dc00aa05f8]=26,
[0xb6e309e64a1f354c]=8,
[0xb6efd1803e5079b5]=87,
[0xb709987f4a820e35]=74,
[0xb76eff4a5c48b31a]=66,
[0xb8188b9f1947ca91]=115,
[0xb82449108107a318]=-38,
[0xb85bb41d49ce1541]=70,
[0xb8e8b78ea0b6a12d]=-32,
[0xb9541a25f05df113]=119,
[0xb9c22712bc5c119c]=51,
[0xba541cbe093fae6e]=60,
[0xba62057bf4a6d26f]=45,
[0xba7394f168e8d243]=-22,
[0xbaf109462be15440]=-123,
[0xbb3da990f080d5bb]=64,
[0xbb89f1277045dc21]=33,
[0xbc92290bbe754974]=27,
[0xbcf430f90ac6d2cb]=23,
[0xbd36fbbad0a95036]=36,
[0xbd771e04352f6165]=74,
[0xbdcc2323c5c9ef2a]=71,
[0xbdf80e442bc22d0c]=117,
[0xbe0a24eafcf058db]=46,
[0xbe10822eb02b4e0d]=109,
[0xbe1ce6c778f77535]=88,
[0xbe1e55432f3c0ac1]=44,
[0xbe6346589e5b2ea1]=70,
[0xbe761bb566344b76]=114,
[0xbe8cf4830357e5fb]=14,
[0xbea511592b989930]=84,
[0xbed585255094490f]=87,
[0xbf55c7143ff28da7]=-97,
[0xbf7477a393136f9c]=6,
[0xc05eefcff425e9fc]=26,
[0xc06f3c8dd7e0fdb5]=89,
[0xc0b83ec4c14be350]=7,
[0xc1217a93104c423d]=34,
[0xc2077e0018076798]=88,
[0xc2a19e5c8d5ee466]=-30,
[0xc2bf3e2826e6d42a]=98,
[0xc2c6233969664ce1]=6,
[0xc2cfc9ab8b6d97f3]=102,
[0xc4265a90e7b4f89d]=109,
[0xc42d6464e6ab4928]=53,
[0xc434564b50b2a59f]=-37,
[0xc45231bf868595f6]=-30,
[0xc465c67b94e29803]=7,
[0xc48ef7a59730efac]=24,
[0xc492dd56c5e84f13]=58,
[0xc49e1970a754303e]=72,
[0xc59fd892d8b301b9]=24,
[0xc5f25cdf770a5d00]=-112,
[0xc64d1575f48018a9]=110,
[0xc678129beed40c70]=116,
[0xc6eed3b3e35248ec]=89,
[0xc701878cdcb46c3c]=71,
[0xc72cd042e6ffb639]=76,
[0xc85108b8b138a67c]=54,
[0xc8514afe10d8446c]=13,
[0xc863334301dc9077]=96,
[0xc8f5813bd3e6ba10]=109,
[0xc8ff05f587aaf926]=2,
[0xc92b5bfb966501eb]=92,
[0xc92eeb8430b58df2]=53,
[0xca100c3e595b7bcb]=120,
[0xca1164b1c5029571]=-67,
[0xca2f05e0a68d22ff]=-58,
[0xca31a4ed617b821f]=115,
[0xca530ad8e75405b3]=45,
[0xca570f488f1d4c12]=87,
[0xca9ff1e702e1f71f]=16,
[0xcaddd2abb40851b9]=114,
[0xcae3cd33076ef283]=107,
[0xcb1c8228d4e25dea]=107,
[0xcb291cbf1649b13c]=87,
[0xcc8cd616533d12a4]=64,
[0xccf301860ad3b5a5]=107,
[0xce7b80f12371b395]=-22,
[0xced2adab06f7f2ba]=76,
[0xcf7155542f44b639]=22,
[0xcf851b38814b041f]=66,
[0xcfda385137407a81]=76,
[0xd05d13cbc4f5d4fd]=87,
[0xd16f3d8706dfaf63]=38,
[0xd191f8dfddf916cf]=46,
[0xd1953f674166fce4]=49,
[0xd1c589c55c3759d9]=63,
[0xd232609f8d8760ae]=89,
[0xd293d9ec14f9f62f]=37,
[0xd3ef8c76a06ce40d]=35,
[0xd43ebd6701db51b2]=91,
[0xd6a9368d3a692471]=-98,
[0xd700cbf947225000]=46,
[0xd737c2b7ac8fad8d]=51,
[0xd7c78562f68c3994]=120,
[0xd861db69c772ea87]=25,
[0xd8ab584570ab9454]=84,
[0xd8bd4654bac450f4]=7,
[0xd8fe91d9eee7fb59]=40,
[0xd91bfd22c832c50f]=75,
[0xd995643ff644e8d2]=84,
[0xda059fc29fe9560b]=59,
[0xda5c36a28986eb50]=75,
[0xdaef4e45206381f1]=88,
[0xdb806362ba18557b]=54,
[0xdbb061fe61e6aa28]=54,
[0xdbb745f6ec51a0c0]=103,
[0xdc084086a286e6bf]=75,
[0xdc19f66705f19f68]=-57,
[0xdc2339d92883874c]=36,
[0xdc4ed9998eefbb0f]=63,
[0xdc643de098a6575c]=-23,
[0xdd0ea39eb20b8bd7]=28,
[0xdd1227b9871cb830]=55,
[0xdd24ac63980c1703]=79,
[0xdd9af2a3e55409cf]=24,
[0xddfbecb3bbf09b68]=-83,
[0xde1e971deccd98ea]=42,
[0xde390c9d32205a22]=46,
[0xdeff2a789a3a37d4]=42,
[0xdfc3403a5fd7a056]=107,
[0xdff45b107157d4f7]=-80,
[0xe022769a333f47b6]=96,
[0xe04d1df761e1f114]=36,
[0xe0ae51a3f89a4906]=72,
[0xe0b09127129efded]=80,
[0xe0c29667314244ca]=100,
[0xe0f1615d83c61967]=-63,
[0xe16d6373fc2c7f02]=64,
[0xe1ef3fc2f945a5d5]=-40,
[0xe28edb9510f7ce39]=58,
[0xe29580fec595d492]=20,
[0xe2b85cded7b04716]=-119,
[0xe312ed9a58f9b711]=118,
[0xe342c67ec4ae176c]=37,
[0xe388b27f45c71182]=111,
[0xe3a457bf417fbebb]=109,
[0xe3f5a92476e19da6]=-26,
[0xe4d6f65c56d9b47c]=-92,
[0xe5016c6a8a1ad82a]=16,
[0xe5084fe4b2ca2899]=-109,
[0xe52f1daeb172eb2f]=60,
[0xe539a4489067c800]=-82,
[0xe57c8b992eafe755]=87,
[0xe58d3e4e207c1df0]=43,
[0xe5979869158fd252]=33,
[0xe6473d6668eca2ff]=46,
[0xe6818bcbc8ac04cb]=4,
[0xe73d0f1b32af695d]=68,
[0xe73f6e43b34bdea3]=113,
[0xe79dce2c26dff6db]=59,
[0xe8e74f6b91b01700]=11,
[0xe916566c4488b540]=78,
[0xe94db6faaa581ff3]=56,
[0xe9bf212fd91cad9d]=72,
[0xe9c1b1a8053c706a]=23,
[0xea1303380ab2d154]=32,
[0xea24379a59b0d2f7]=38,
[0xea45a71fb36f59a8]=94,
[0xeb2eede7e4209e54]=20,
[0xeb42c3e49363795d]=103,
[0xeb9a30bac5fd8dc9]=-45,
[0xecffce18c9bc078e]=42,
[0xed1ee166263f6484]=6,
[0xed4849d9a92a22f8]=26,
[0xed8daf4bbfa5d5fe]=118,
[0xee5194a8f5a254b6]=85,
[0xee78c029bd8b5bfc]=65,
[0xeeca4184fb8622e2]=-38,
[0xf0f104d97ae82184]=59,
[0xf21098ab582ef4a5]=121,
[0xf3389b337a25705a]=48,
[0xf3f940f07a2ed641]=49,
[0xf4228bc40e9b8f08]=-108,
[0xf48fe4b416795ac7]=46,
[0xf49b7d76c7d6846e]=102,
[0xf4ad2778e2d509a5]=-16,
[0xf4d03d694a028114]=51,
[0xf4ff31932747f0d4]=122,
[0xf5277da781cbb8d9]=-105,
[0xf5438240f4f1a175]=109,
[0xf553d275b8b71ce7]=-64,
[0xf64a5cd65deed62d]=-5,
[0xf654ad01b55675b7]=23,
[0xf6cd13dae6504635]=123,
[0xf6ef62f8f1a6016e]=54,
[0xf70768098370c523]=54,
[0xf72ca20c5a95a2f2]=-32,
[0xf7446228e042e019]=8,
[0xf7abc0526aca08dd]=24,
[0xf7e14d49f095a70a]=-31,
[0xf8cc796167eda76c]=-63,
[0xf8da611c917786b2]=51,
[0xf99bb5ca104d80be]=85,
[0xf9fce8267e27ae9f]=-112,
[0xfa0c3234dcd89a91]=49,
[0xfa5133d6f087ce10]=-93,
[0xfa72e90bbb4933bd]=20,
[0xfb2c90e85e9b8d7d]=100,
[0xfb44ab678ac3f0d4]=55,
[0xfbe5b60c75613281]=28,
[0xfc2d98ddced275f7]=-64,
[0xfcb342770acf9247]=96,
[0xfd183f186ae1f318]=22,
[0xfdca14bc0106af3a]=32,
[0xfe41bf21d68be336]=76,
[0xfe4424d2961eb989]=121,
[0xfe5b31da168b4b48]=100,
[0xfea243edfd46fc6a]=15,
[0xff20ae60ac090d38]=106,
[0xff2153e985d557b1]=120,
[0xff571d884fc9acbb]=4,
[0xff8cdd6b881fe28b]=2,
[0xff8e20d51ee09a4a]=-61,
[0xffab87bdda589f2d]=9,
[0xffd2f813d91186b9]=13,
}
return { heroes = H, by_hash = P }
Changelog

No release notes recorded for this listing.

Used by

No published script needs it yet.

More from this author

More from this author

ground

by hunnyc

Ground height and high-ground level at any point of the dota map.

pack.json
"requires": { "ground": "^1.0" }
your lua
local ground = require("lib/ground")
0 scripts use itNo published version yet

Beta Tester Config

by hunnyc
Included with access

Beta 0.10.54 preset: combo on F, last hit on B, every other bind moved off dota's own keys, hp cards and minimap marks on.

configcombolast hit
Not rated yet0 installs
v1.0.0 · Updated 2026-10-17✓ 0.10.70

lane_geom

by hunnyc

A lane as a polyline: the point on it nearest to a creep, the heading there, and a walk of N units along it.

pack.json
"requires": { "lane_geom": "^1.0" }
your lua
local lane_geom = require("lib/lane_geom")
0 scripts use itv1.0.0