К'Юра
Демон
Монстры дают повышенный на 200% опыт
monster dropped item rarity +% [0]
monster base type attack cast speed +% and damage -% final [33]
Скорость действий не может быть уменьшена ниже базового значения в 70%
monster penalty against minions damage +% final vs player minions [-25]
Монстры дают повышенный на 100% опыт
monster dropped item rarity +% [15000]
cannot be stunned for ms after stun finished [2000]
cannot be stunned while stunned [1]
Q'ura
SpectreN
AreaВершина жертвоприношений, Манящая бездна
Tagscleaving_weapon, demon, flesh_armour, has_two_hand_axe, has_two_handed_melee, medium_height, melee, no_maven, not_dex, not_int, physical_affinity, red_blood, slow_movement, unique_map_boss
Здоровье
833%
Броня
+100%
Ailment Threshold
588%
Сопротивление
40 40 40 25
Damage
125%
Точность
100%
Шанс критического удара
+5%
Множитель критического удара
+130%
Attack Distance
6 ~ 13
Attack Time
1.5 Second
Damage Spread
±20%
Опыт
125%
Model Size
125%
Type
DemonBoss1
Metadata
DemonBoss1
Уровень
80
Здоровье
11,712,936
Броня
146,882
Уклонение
7,124
Энерг. щит
0
Damage
1,079
Урон от чар
1,611
Точность
462
Attack Time
1.005
Опыт
87,395
Ailment Threshold
3,968,618
Chill
12,549
Shock
12,549
Brittle
70,995
Scorch
12,549
Sap
34,670
Melee
Attack, RangedAttack, MirageArcherCanUse, Projectile, MeleeSingleTarget, Multistrikeable, Melee, ProjectilesFromUser
Атака
Base Damage: 1714–2571
Шанс критического удара: 5%
Attack Time: 1.5 сек.
Герой наносит обычный удар.
skill can fire arrows [1]
skill can fire wand projectiles [1]
MonsterDemonCleave
Attack, Area, Melee, DamageOverTime
Base Damage: 1714–2571
Шанс критического удара: 5%
Attack Time: 1.5 сек.
Наносит 272.1 базового физического урона в секунду
50% снижение скорости атаки
corrupted blood cleave stacks to add [2]
is area damage [1]
MonsterDesecratedGroundCyclone
Attack, Area, Melee, Movement
Вихрь
Base Damage: 1714–2571
Шанс критического удара: 5%
Attack Time: 1.5 сек.
Перезарядка: 5 сек.
Герой отправляется в указанное место, вращаясь и атакуя врагов. Нельзя усилить Беспощадностью или Градом ударов.
Наносит на 60% меньше урона
35% увеличение физического урона
180% повышение скорости атаки
Скорость передвижения на 150% больше
cyclone extra distance [30]
cyclone places ground desecration chaos damage per minute [76848]
desecrated ground art variation [1]
is area damage [1]
MonsterDemonCleaveEnrage
Attack, Area, Melee, DamageOverTime
Base Damage: 1714–2571
Шанс критического удара: 5%
Attack Time: 1.5 сек.
Наносит 272.1 базового физического урона в секунду
50% снижение скорости атаки
corrupted blood cleave stacks to add [8]
is area damage [1]

Object Type

version 2
extends "Metadata/Monsters/DemonBosses/DemonBoss"

Actor
{
	main_hand_unarmed_type = "Two_Hand_Sword"
}

Object Type Codes

version 2
extends "Metadata/Monsters/DemonBosses/DemonBoss"
-- src\Data\Spectres.lua
minions["Metadata/Monsters/DemonBosses/DemonBoss1/DemonBoss1"] = {
    name = "Q'ura",
    life = 8.33,
    fireResist = 40,
    coldResist = 40,
    lightningResist = 40,
    chaosResist = 25,
    damage = 1.25,
    damageSpread = 0.2,
    attackTime = 1.5,
    attackRange = 13,
    accuracy = 1,
    weaponType1 = "Two Hand Axe",
    skillList = {
        "Melee",
        "MonsterDesecratedGroundCyclone",
        "MonsterDemonCleave",
        "MonsterDemonCleaveEnrage",
    },
    modList = {
    },
}
-- src\Data\Skills\spectre.lua
skills["Melee"] = {
    name = "Default Attack",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "Strike your foes down with a powerful blow.",
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.RangedAttack] = true,
        [SkillType.MirageArcherCanUse] = true,
        [SkillType.Projectile] = true,
        [SkillType.MeleeSingleTarget] = true,
        [SkillType.Multistrikeable] = true,
        [SkillType.Melee] = true,
        [SkillType.ProjectilesFromUser] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        melee = true,
        projectile = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_can_fire_arrows",
        "skill_can_fire_wand_projectiles",
    },
    levels = {
        [1] = {levelRequirement = 1, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDesecratedGroundCyclone"] = {
    name = "Cyclone",
    hidden = true,
    color = "2",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "Damage enemies around you, then perform a spinning series of attacks as you travel to a target location. Cannot be supported by Ruthless or Multistrike.",
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.Movement] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "attack_speed_+%",
        "cyclone_movement_speed_+%_final",
        "cyclone_extra_distance",
        "cyclone_places_ground_desecration_chaos_damage_per_minute",
        "physical_damage_+%",
        "active_skill_damage_+%_final",
        "desecrated_ground_art_variation",
        "is_area_damage",
    },
    levels = {
        [1] = {120, 120, 40, 1230, 35, -60, 1, levelRequirement = 4, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [2] = {120, 120, 40, 6205, 35, -60, 1, levelRequirement = 9, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [3] = {120, 120, 40, 10185, 35, -60, 1, levelRequirement = 13, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [4] = {120, 120, 40, 15160, 35, -60, 1, levelRequirement = 18, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [5] = {120, 120, 40, 21130, 35, -60, 1, levelRequirement = 24, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [6] = {120, 120, 40, 24114, 35, -60, 1, levelRequirement = 27, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [7] = {120, 120, 40, 27099, 35, -60, 1, levelRequirement = 30, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [8] = {120, 120, 40, 30084, 35, -60, 1, levelRequirement = 33, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [9] = {120, 120, 40, 32074, 35, -60, 1, levelRequirement = 35, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [10] = {120, 120, 40, 35059, 35, -60, 1, levelRequirement = 38, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [11] = {120, 120, 40, 37049, 35, -60, 1, levelRequirement = 40, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [12] = {120, 120, 40, 40034, 35, -60, 1, levelRequirement = 43, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [13] = {120, 120, 40, 43019, 35, -60, 1, levelRequirement = 46, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [14] = {120, 120, 40, 45009, 35, -60, 1, levelRequirement = 48, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [15] = {120, 120, 40, 46999, 35, -60, 1, levelRequirement = 50, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [16] = {120, 120, 40, 48989, 35, -60, 1, levelRequirement = 52, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [17] = {120, 120, 40, 50979, 35, -60, 1, levelRequirement = 54, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [18] = {120, 120, 40, 52968, 35, -60, 1, levelRequirement = 56, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [19] = {120, 120, 40, 54958, 35, -60, 1, levelRequirement = 58, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [20] = {120, 120, 40, 56948, 35, -60, 1, levelRequirement = 60, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [21] = {120, 120, 40, 58938, 35, -60, 1, levelRequirement = 62, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [22] = {120, 120, 40, 60928, 35, -60, 1, levelRequirement = 64, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [23] = {120, 120, 40, 62918, 35, -60, 1, levelRequirement = 66, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [24] = {120, 120, 40, 63913, 35, -60, 1, levelRequirement = 67, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [25] = {120, 120, 40, 64908, 35, -60, 1, levelRequirement = 68, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [26] = {120, 120, 40, 65903, 35, -60, 1, levelRequirement = 69, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [27] = {120, 120, 40, 66898, 35, -60, 1, levelRequirement = 70, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [28] = {130, 125, 38, 67893, 35, -60, 1, levelRequirement = 71, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [29] = {140, 130, 36, 68888, 35, -60, 1, levelRequirement = 72, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [30] = {150, 135, 34, 69883, 35, -60, 1, levelRequirement = 73, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [31] = {160, 140, 32, 70878, 35, -60, 1, levelRequirement = 74, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [32] = {170, 145, 30, 71873, 35, -60, 1, levelRequirement = 75, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [33] = {180, 150, 30, 72868, 35, -60, 1, levelRequirement = 76, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [34] = {180, 150, 30, 73863, 35, -60, 1, levelRequirement = 77, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [35] = {180, 150, 30, 74858, 35, -60, 1, levelRequirement = 78, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [36] = {180, 150, 30, 75853, 35, -60, 1, levelRequirement = 79, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [37] = {180, 150, 30, 76848, 35, -60, 1, levelRequirement = 80, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [38] = {180, 150, 30, 77843, 35, -60, 1, levelRequirement = 81, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [39] = {180, 150, 30, 78838, 35, -60, 1, levelRequirement = 82, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [40] = {180, 150, 30, 80827, 35, -60, 1, levelRequirement = 84, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [41] = {180, 150, 30, 82817, 35, -60, 1, levelRequirement = 86, statInterpolation = {1, 1, 1, 1},  cost = { }, },
        [42] = {180, 150, 30, 84807, 35, -60, 1, levelRequirement = 88, statInterpolation = {1, 1, 1, 1},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDemonCleave"] = {
    name = "MonsterDemonCleave",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.DamageOverTime] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "base_physical_damage_to_deal_per_minute",
        "attack_speed_+%",
        "corrupted_blood_cleave_stacks_to_add",
        "is_area_damage",
    },
    levels = {
        [1] = {150, -50, 2, levelRequirement = 3, statInterpolation = {1},  cost = { }, },
        [2] = {235, -50, 2, levelRequirement = 5, statInterpolation = {1},  cost = { }, },
        [3] = {320, -50, 2, levelRequirement = 8, statInterpolation = {1},  cost = { }, },
        [4] = {406, -50, 2, levelRequirement = 10, statInterpolation = {1},  cost = { }, },
        [5] = {491, -50, 2, levelRequirement = 12, statInterpolation = {1},  cost = { }, },
        [6] = {576, -50, 2, levelRequirement = 14, statInterpolation = {1},  cost = { }, },
        [7] = {661, -50, 2, levelRequirement = 17, statInterpolation = {1},  cost = { }, },
        [8] = {746, -50, 2, levelRequirement = 20, statInterpolation = {1},  cost = { }, },
        [9] = {832, -50, 2, levelRequirement = 24, statInterpolation = {1},  cost = { }, },
        [10] = {917, -50, 2, levelRequirement = 30, statInterpolation = {1},  cost = { }, },
        [11] = {1002, -50, 2, levelRequirement = 31, statInterpolation = {1},  cost = { }, },
        [12] = {1062, -50, 2, levelRequirement = 36, statInterpolation = {1},  cost = { }, },
        [13] = {1458, -50, 2, levelRequirement = 41, statInterpolation = {1},  cost = { }, },
        [14] = {1854, -50, 2, levelRequirement = 44, statInterpolation = {1},  cost = { }, },
        [15] = {2250, -50, 2, levelRequirement = 51, statInterpolation = {1},  cost = { }, },
        [16] = {2646, -50, 2, levelRequirement = 54, statInterpolation = {1},  cost = { }, },
        [17] = {3345, -50, 2, levelRequirement = 57, statInterpolation = {1},  cost = { }, },
        [18] = {4045, -50, 2, levelRequirement = 60, statInterpolation = {1},  cost = { }, },
        [19] = {4744, -50, 2, levelRequirement = 65, statInterpolation = {1},  cost = { }, },
        [20] = {5443, -50, 2, levelRequirement = 66, statInterpolation = {1},  cost = { }, },
        [21] = {6142, -50, 2, levelRequirement = 67, statInterpolation = {1},  cost = { }, },
        [22] = {6842, -50, 2, levelRequirement = 68, statInterpolation = {1},  cost = { }, },
        [23] = {7541, -50, 2, levelRequirement = 69, statInterpolation = {1},  cost = { }, },
        [24] = {8240, -50, 2, levelRequirement = 70, statInterpolation = {1},  cost = { }, },
        [25] = {9049, -50, 2, levelRequirement = 71, statInterpolation = {1},  cost = { }, },
        [26] = {9858, -50, 2, levelRequirement = 72, statInterpolation = {1},  cost = { }, },
        [27] = {10666, -50, 2, levelRequirement = 73, statInterpolation = {1},  cost = { }, },
        [28] = {11475, -50, 2, levelRequirement = 74, statInterpolation = {1},  cost = { }, },
        [29] = {12284, -50, 2, levelRequirement = 75, statInterpolation = {1},  cost = { }, },
        [30] = {13093, -50, 2, levelRequirement = 76, statInterpolation = {1},  cost = { }, },
        [31] = {13901, -50, 2, levelRequirement = 77, statInterpolation = {1},  cost = { }, },
        [32] = {14710, -50, 2, levelRequirement = 78, statInterpolation = {1},  cost = { }, },
        [33] = {15519, -50, 2, levelRequirement = 79, statInterpolation = {1},  cost = { }, },
        [34] = {16327, -50, 2, levelRequirement = 80, statInterpolation = {1},  cost = { }, },
        [35] = {17136, -50, 2, levelRequirement = 81, statInterpolation = {1},  cost = { }, },
        [36] = {17945, -50, 2, levelRequirement = 82, statInterpolation = {1},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MonsterDemonCleaveEnrage"] = {
    name = "MonsterDemonCleaveEnrage",
    hidden = true,
    color = 4,
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.Area] = true,
        [SkillType.Melee] = true,
        [SkillType.DamageOverTime] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        attack = true,
        area = true,
        melee = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "base_physical_damage_to_deal_per_minute",
        "corrupted_blood_cleave_stacks_to_add",
        "attack_speed_+%",
        "is_area_damage",
    },
    levels = {
        [1] = {150, 4, -50, levelRequirement = 3, statInterpolation = {1, 1},  cost = { }, },
        [2] = {235, 4, -50, levelRequirement = 5, statInterpolation = {1, 1},  cost = { }, },
        [3] = {320, 5, -50, levelRequirement = 8, statInterpolation = {1, 1},  cost = { }, },
        [4] = {406, 5, -50, levelRequirement = 10, statInterpolation = {1, 1},  cost = { }, },
        [5] = {491, 6, -50, levelRequirement = 12, statInterpolation = {1, 1},  cost = { }, },
        [6] = {576, 6, -50, levelRequirement = 14, statInterpolation = {1, 1},  cost = { }, },
        [7] = {661, 7, -50, levelRequirement = 17, statInterpolation = {1, 1},  cost = { }, },
        [8] = {746, 7, -50, levelRequirement = 20, statInterpolation = {1, 1},  cost = { }, },
        [9] = {832, 8, -50, levelRequirement = 24, statInterpolation = {1, 1},  cost = { }, },
        [10] = {917, 8, -50, levelRequirement = 30, statInterpolation = {1, 1},  cost = { }, },
        [11] = {1002, 8, -50, levelRequirement = 31, statInterpolation = {1, 1},  cost = { }, },
        [12] = {1062, 8, -50, levelRequirement = 36, statInterpolation = {1, 1},  cost = { }, },
        [13] = {1458, 8, -50, levelRequirement = 41, statInterpolation = {1, 1},  cost = { }, },
        [14] = {1854, 8, -50, levelRequirement = 44, statInterpolation = {1, 1},  cost = { }, },
        [15] = {2250, 8, -50, levelRequirement = 51, statInterpolation = {1, 1},  cost = { }, },
        [16] = {2646, 8, -50, levelRequirement = 54, statInterpolation = {1, 1},  cost = { }, },
        [17] = {3345, 8, -50, levelRequirement = 57, statInterpolation = {1, 1},  cost = { }, },
        [18] = {4045, 8, -50, levelRequirement = 60, statInterpolation = {1, 1},  cost = { }, },
        [19] = {4744, 8, -50, levelRequirement = 65, statInterpolation = {1, 1},  cost = { }, },
        [20] = {5443, 8, -50, levelRequirement = 66, statInterpolation = {1, 1},  cost = { }, },
        [21] = {6142, 8, -50, levelRequirement = 67, statInterpolation = {1, 1},  cost = { }, },
        [22] = {6842, 8, -50, levelRequirement = 68, statInterpolation = {1, 1},  cost = { }, },
        [23] = {7541, 8, -50, levelRequirement = 69, statInterpolation = {1, 1},  cost = { }, },
        [24] = {8240, 8, -50, levelRequirement = 70, statInterpolation = {1, 1},  cost = { }, },
        [25] = {9049, 8, -50, levelRequirement = 71, statInterpolation = {1, 1},  cost = { }, },
        [26] = {9858, 8, -50, levelRequirement = 72, statInterpolation = {1, 1},  cost = { }, },
        [27] = {10666, 8, -50, levelRequirement = 73, statInterpolation = {1, 1},  cost = { }, },
        [28] = {11475, 8, -50, levelRequirement = 74, statInterpolation = {1, 1},  cost = { }, },
        [29] = {12284, 8, -50, levelRequirement = 75, statInterpolation = {1, 1},  cost = { }, },
        [30] = {13093, 8, -50, levelRequirement = 76, statInterpolation = {1, 1},  cost = { }, },
        [31] = {13901, 8, -50, levelRequirement = 77, statInterpolation = {1, 1},  cost = { }, },
        [32] = {14710, 8, -50, levelRequirement = 78, statInterpolation = {1, 1},  cost = { }, },
        [33] = {15519, 8, -50, levelRequirement = 79, statInterpolation = {1, 1},  cost = { }, },
        [34] = {16327, 8, -50, levelRequirement = 80, statInterpolation = {1, 1},  cost = { }, },
        [35] = {17136, 8, -50, levelRequirement = 81, statInterpolation = {1, 1},  cost = { }, },
        [36] = {17945, 8, -50, levelRequirement = 82, statInterpolation = {1, 1},  cost = { }, },
    },
}
Монстры дают повышенный на 200% опыт
monster dropped item rarity +% [0]
IdMonsterAtziriMapBoss
FamilyMonsterMapBoss
Domainsмонстр (3)
GenerationTypeУникальный (3)
Req. level1
Stats
  • monster slain experience +% Min: 200 Max: 200 Global
  • monster dropped item rarity +% Min: 0 Max: 0 Global
  • monster base type attack cast speed +% and damage -% final [33]
    IdMonsterSpeedAndDamageFixupComplete
    FamilyMonsterSpeedAndDamageFixup
    Domainsмонстр (3)
    GenerationTypeУникальный (3)
    Req. level1
    Stats
  • monster base type attack cast speed +% and damage -% final Min: 33 Max: 33 Global
  • Craft Tagscaster_damage damage attack caster speed
    Скорость действий не может быть уменьшена ниже базового значения в 70%
    IdCannotBeSlowedBelowValueBosses
    FamilyCannotBeSlowedBelowValue
    Domainsмонстр (3)
    GenerationTypeУникальный (3)
    Req. level1
    Stats
  • hellscape boots action speed +% minimum value Min: -30 Max: -30 Global
  • Craft Tagsspeed
    monster penalty against minions damage +% final vs player minions [-25]
    IdMonsterDamageVersusPlayerMinions25
    FamilyMonsterDamageVersusMinions
    Domainsмонстр (3)
    GenerationTypeУникальный (3)
    Req. level1
    Stats
  • monster penalty against minions damage +% final vs player minions Min: -25 Max: -25 Global
  • Craft Tagsdamage
    Монстры дают повышенный на 100% опыт
    monster dropped item rarity +% [15000]
    IdMonsterMapBoss
    FamilyMonsterMapBoss
    Domainsмонстр (3)
    GenerationTypeУникальный (3)
    Req. level1
    Stats
  • monster slain experience +% Min: 100 Max: 100 Global
  • monster dropped item rarity +% Min: 15000 Max: 15000 Global
  • cannot be stunned for ms after stun finished [2000]
    cannot be stunned while stunned [1]
    IdStunRepeatImmunityMapBoss_
    FamilyNothing
    Domainsмонстр (3)
    GenerationTypeУникальный (3)
    Req. level1
    Stats
  • cannot be stunned while stunned Min: 1 Max: 1 Global
  • cannot be stunned for ms after stun finished Min: 2000 Max: 2000 Global
  • Edit

    Wikis Content is available under CC BY-NC-SA 3.0 unless otherwise noted.