@pkmn/dex 0.7.38 → 0.7.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport * as T from '@pkmn/dex-types';\n\nimport * as AbilitiesJSON from './data/abilities.json';\nimport * as AliasesJSON from './data/aliases.json';\nimport * as ConditionsJSON from './data/conditions.json';\nimport * as FormatsDataJSON from './data/formats-data.json';\nimport * as ItemsJSON from './data/items.json';\nimport * as MovesJSON from './data/moves.json';\nimport * as NaturesJSON from './data/natures.json';\nimport * as SpeciesJSON from './data/species.json';\nimport * as TypesJSON from './data/types.json';\n\nexport function toID(text: any): T.ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as T.ID;\n}\n\nfunction getString(str: any): string {\n return (typeof str === 'string' || typeof str === 'number') ? '' + str : '';\n}\n\n// #region Data\n\nexport interface FormatData {\n tier?: string;\n doublesTier?: string;\n isNonstandard?: T.Nonstandard;\n inherit?: boolean;\n}\n\ninterface AnyObject { [k: string]: any }\n\nexport class BasicEffect<NameT extends string = string> implements T.BasicEffect<NameT> {\n id: T.ID;\n name: NameT;\n fullname: string;\n effectType: T.EffectType;\n kind: T.DataKind;\n exists: boolean;\n num: number;\n gen: T.GenerationNum;\n shortDesc: string;\n desc: string;\n isNonstandard: T.Nonstandard | null;\n duration?: number;\n\n constructor(data: AnyObject) {\n this.exists = true;\n Object.assign(this, data);\n\n this.name = getString(data.name).trim() as NameT;\n this.id = data.realMove ? toID(data.realMove) : toID(this.name); // Hidden Power hack\n this.fullname = getString(data.fullname) || this.name;\n this.effectType = getString(data.effectType) as T.EffectType || 'Condition';\n this.kind = 'Condition';\n this.exists = !!(this.exists && this.id);\n this.num = data.num || 0;\n this.gen = data.gen || 0;\n this.shortDesc = data.shortDesc || '';\n this.desc = data.desc || this.shortDesc;\n this.isNonstandard = data.isNonstandard || null;\n this.duration = data.duration;\n }\n\n toString() {\n return this.name;\n }\n}\n\nexport class Condition extends BasicEffect implements T.Condition {\n readonly effectType: 'Condition' | 'Weather' | 'Status' | 'Terastal';\n readonly kind: 'Condition';\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n this.effectType =\n (['Weather', 'Status'].includes(data.effectType) ? data.effectType : 'Condition');\n this.kind = 'Condition';\n }\n}\n\nconst EMPTY_CONDITION: Condition = new Condition({name: '', exists: false});\n\nclass DexConditions implements T.DexTable<Condition> {\n readonly dex: ModdedDex;\n readonly cache = Object.create(null) as { [id: string]: Condition };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Condition {\n // This treatment of 'item:id' and 'ability:id' is kind of repugnant but regrettably exists\n // for loose compatibility with Pokémon Showdown's Dex API. 'move:id' also needs to be handled\n // for the client to work correctly.\n if (name.startsWith('item:')) {\n const item = this.dex.items.get(name.slice(5));\n return item as any as Condition;\n } else if (name.startsWith('ability:')) {\n const ability = this.dex.abilities.get(name.slice(8));\n return ability as any as Condition;\n } else if (name.startsWith('move:')) {\n const move = this.dex.moves.get(name.slice(5));\n return move as any as Condition;\n }\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Condition {\n if (!id) return EMPTY_CONDITION;\n\n let condition = this.cache[id];\n if (condition) return condition;\n\n let found: T.AbilityData | T.ItemData | T.MoveData;\n if (this.dex.data.Conditions.hasOwnProperty(id)) {\n condition = new Condition({kind: 'Condition', ...this.dex.data.Conditions[id]});\n } else if (\n (this.dex.data.Moves.hasOwnProperty(id) &&\n (found = this.dex.data.Moves[id]).condition) ||\n (this.dex.data.Abilities.hasOwnProperty(id) &&\n (found = this.dex.data.Abilities[id]).condition) ||\n (this.dex.data.Items.hasOwnProperty(id) &&\n (found = this.dex.data.Items[id]).condition)) {\n condition = new Condition({name: found.name || id, ...found.condition});\n } else if (id === 'recoil') {\n condition = new Condition({name: 'Recoil', effectType: 'Recoil'});\n } else if (id === 'drain') {\n condition = new Condition({name: 'Drain', effectType: 'Drain'});\n } else {\n condition = new Condition({name: id, exists: false});\n }\n\n this.cache[id] = condition;\n return condition;\n }\n}\n\nexport class Ability extends BasicEffect<T.AbilityName> implements T.Ability {\n readonly effectType: 'Ability';\n readonly kind: 'Ability';\n readonly isBreakable?: boolean;\n readonly suppressWeather?: boolean;\n readonly condition?: Partial<Condition>;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `ability: ${this.name}`;\n this.effectType = 'Ability';\n this.kind = 'Ability';\n\n if (!this.gen) {\n if (this.num >= 268) {\n this.gen = 9;\n } else if (this.num >= 234) {\n this.gen = 8;\n } else if (this.num >= 192) {\n this.gen = 7;\n } else if (this.num >= 165) {\n this.gen = 6;\n } else if (this.num >= 124) {\n this.gen = 5;\n } else if (this.num >= 77) {\n this.gen = 4;\n } else if (this.num >= 1) {\n this.gen = 3;\n }\n }\n }\n}\n\nclass DexAbilities implements T.DexTable<Ability> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Ability },\n all: undefined as ReadonlyArray<Ability> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Ability {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Ability {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let ability = this.caches.get[id];\n if (ability) return ability;\n\n const data = this.dex.data.Abilities[id];\n if (id && data) {\n ability = new Ability(data);\n if (ability.gen > this.dex.gen) (ability as any).isNonstandard = 'Future';\n if (this.dex.gen <= 2 && ability.id === 'noability') (ability as any).isNonstandard = null;\n } else {\n ability = new Ability({id, name: id, exists: false});\n }\n\n if (ability.exists) this.caches.get[id] = ability;\n return ability;\n }\n\n all(): readonly Ability[] {\n if (this.caches.all) return this.caches.all;\n const abilities = [];\n for (const id in this.dex.data.Abilities) {\n abilities.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = abilities);\n }\n}\n\nexport class Item extends BasicEffect<T.ItemName> implements T.Item {\n readonly effectType: 'Item';\n readonly kind: 'Item';\n\n readonly forcedForme?: T.SpeciesName;\n readonly megaStone?: T.SpeciesName;\n readonly megaEvolves?: T.SpeciesName;\n readonly onDrive?: T.TypeName;\n readonly onMemory?: T.TypeName;\n readonly onPlate?: T.TypeName;\n readonly zMove?: T.MoveName | true;\n readonly zMoveType?: T.TypeName;\n readonly zMoveFrom?: T.MoveName;\n readonly itemUser?: T.SpeciesName[];\n readonly fling?: T.ItemData['fling'];\n readonly condition?: Partial<Condition>;\n readonly ignoreKlutz?: boolean;\n readonly isBerry?: boolean;\n readonly isChoice?: boolean;\n readonly isGem?: boolean;\n readonly isPokeball?: boolean;\n readonly naturalGift?: { basePower: number; type: T.TypeName };\n readonly boosts?: Partial<T.BoostsTable> | false;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `item: ${this.name}`;\n this.effectType = 'Item';\n this.kind = 'Item';\n\n if (!this.gen) {\n if (this.num >= 1124) {\n this.gen = 9;\n } else if (this.num >= 927) {\n this.gen = 8;\n } else if (this.num >= 689) {\n this.gen = 7;\n } else if (this.num >= 577) {\n this.gen = 6;\n } else if (this.num >= 537) {\n this.gen = 5;\n } else if (this.num >= 377) {\n this.gen = 4;\n } else {\n this.gen = 3;\n }\n // Due to difference in gen 2 item numbering, gen 2 items must be\n // specified manually\n }\n\n if (this.isBerry) this.fling = {basePower: 10};\n if (this.id.endsWith('plate')) this.fling = {basePower: 90};\n if (this.onDrive) this.fling = {basePower: 70};\n if (this.megaStone) this.fling = {basePower: 80};\n if (this.onMemory) this.fling = {basePower: 50};\n }\n}\n\nclass DexItems implements T.DexTable<Item> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Item },\n all: undefined as ReadonlyArray<Item> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name?: string): Item {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Item {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let item = this.caches.get[id];\n if (item) return item;\n\n if (id && !this.dex.data.Items[id] && this.dex.data.Items[id + 'berry']) {\n item = this.getByID(id + 'berry' as T.ID);\n return (this.caches.get[id] = item);\n }\n\n const data = this.dex.data.Items[id];\n if (id && data) {\n item = new Item(data);\n if (item.gen > this.dex.gen) (item as any).isNonstandard = 'Future';\n } else {\n item = new Item({name: id, exists: false});\n }\n\n if (item.exists) this.caches.get[id] = item;\n return item;\n }\n\n all(): readonly Item[] {\n if (this.caches.all) return this.caches.all;\n const items = [];\n for (const id in this.dex.data.Items) {\n items.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = items);\n }\n}\n\nexport class Move extends BasicEffect<T.MoveName> implements T.Move {\n readonly effectType: 'Move';\n readonly kind: 'Move';\n\n readonly boosts?: Partial<T.BoostsTable>;\n readonly status?: T.StatusName;\n readonly volatileStatus?: T.ID;\n readonly slotCondition?: T.ID;\n readonly sideCondition?: T.ID;\n readonly terrain?: T.ID;\n readonly pseudoWeather?: T.ID;\n readonly weather?: T.ID;\n\n readonly basePower!: number;\n readonly type!: T.TypeName;\n readonly accuracy!: true | number;\n readonly pp!: number;\n readonly target!: T.MoveTarget;\n readonly priority!: number;\n readonly flags: T.Move['flags'];\n readonly category!: T.MoveCategory;\n\n readonly condition?: Partial<T.Condition>;\n readonly damage?: number | 'level' | false | null;\n readonly noPPBoosts?: boolean;\n\n readonly isZ: boolean | T.ID;\n readonly zMove?: {\n basePower?: number;\n effect?: T.ID;\n boost?: Partial<T.BoostsTable>;\n };\n readonly isMax: boolean | T.SpeciesName;\n readonly maxMove?: {\n basePower: number;\n };\n\n readonly ohko?: boolean | T.TypeName;\n readonly thawsTarget?: boolean;\n readonly heal?: number[] | null;\n readonly forceSwitch?: boolean;\n readonly selfSwitch?: 'copyvolatile' | 'shedtail' | boolean;\n readonly selfBoost?: { boosts?: Partial<T.BoostsTable> };\n readonly selfdestruct?: boolean | 'ifHit' | 'always';\n readonly breaksProtect?: boolean;\n readonly recoil?: [number, number];\n readonly drain?: [number, number];\n readonly mindBlownRecoil?: boolean;\n readonly struggleRecoil?: boolean;\n readonly stealsBoosts?: boolean;\n readonly secondary?: T.SecondaryEffect | null;\n readonly secondaries: T.SecondaryEffect[] | null;\n readonly self?: T.HitEffect | null;\n\n readonly alwaysHit?: boolean;\n readonly basePowerModifier?: number;\n readonly critModifier?: number;\n readonly critRatio?: number;\n readonly overrideOffensivePokemon?: 'target' | 'source';\n readonly overrideOffensiveStat?: Exclude<T.StatID, 'hp'>;\n readonly overrideDefensivePokemon?: 'target' | 'source';\n readonly overrideDefensiveStat?: Exclude<T.StatID, 'hp'>;\n readonly forceSTAB?: boolean;\n readonly ignoreAbility?: boolean;\n readonly ignoreAccuracy?: boolean;\n readonly ignoreDefensive?: boolean;\n readonly ignoreEvasion?: boolean;\n readonly ignoreImmunity?: boolean | { [k in keyof T.TypeName]?: boolean };\n readonly ignoreNegativeOffensive?: boolean;\n readonly ignoreOffensive?: boolean;\n readonly ignorePositiveDefensive?: boolean;\n readonly ignorePositiveEvasion?: boolean;\n readonly infiltrates?: boolean;\n readonly multiaccuracy?: boolean;\n readonly multihit?: number | number[];\n readonly noCopy?: boolean;\n readonly noDamageVariance?: boolean;\n readonly noFaint?: boolean;\n readonly nonGhostTarget?: T.MoveTarget;\n readonly pressureTarget?: T.MoveTarget;\n readonly sleepUsable?: boolean;\n readonly smartTarget?: boolean;\n readonly spreadModifier?: number;\n readonly tracksTarget?: boolean;\n readonly willCrit?: boolean;\n\n readonly hasCrashDamage?: boolean;\n readonly hasSheerForce?: boolean;\n readonly isConfusionSelfHit?: boolean;\n readonly noMetronome?: T.MoveName[];\n readonly noSketch?: boolean;\n readonly stallingMove?: boolean;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `move: ${this.name}`;\n this.effectType = 'Move';\n this.kind = 'Move';\n\n this.type = getString(data.type) as T.TypeName;\n this.basePower = Number(data.basePower);\n this.critRatio = Number(data.critRatio) || 1;\n this.secondary = data.secondary || null;\n this.secondaries = data.secondaries?.length\n ? data.secondaries : this.secondary\n ? [this.secondary]\n : null;\n this.hasSheerForce = !!(data.hasSheerForce && !this.secondaries);\n this.priority = Number(data.priority) || 0;\n this.ignoreImmunity =\n (data.ignoreImmunity !== undefined ? data.ignoreImmunity : data.category === 'Status');\n this.pp = Number(data.pp);\n this.isZ = data.isZ || false;\n this.isMax = data.isMax || false;\n this.flags = data.flags || {};\n this.selfSwitch =\n (typeof data.selfSwitch === 'string'\n ? (data.selfSwitch as 'copyvolatile' | 'shedtail')\n : data.selfSwitch) ||\n undefined;\n this.pressureTarget = data.pressureTarget || undefined;\n this.nonGhostTarget = data.nonGhostTarget || undefined;\n this.ignoreAbility = data.ignoreAbility || false;\n this.volatileStatus =\n typeof data.volatileStatus === 'string' ? (data.volatileStatus as T.ID) : undefined;\n\n if (this.category !== 'Status' && !this.maxMove && this.id !== 'struggle') {\n this.maxMove = {basePower: 1};\n if (this.isMax || this.isZ) {\n // already initialized to 1\n } else if (!this.basePower) {\n this.maxMove.basePower = 100;\n } else if (['Fighting', 'Poison'].includes(this.type)) {\n if (this.basePower >= 150) {\n this.maxMove.basePower = 100;\n } else if (this.basePower >= 110) {\n this.maxMove.basePower = 95;\n } else if (this.basePower >= 75) {\n this.maxMove.basePower = 90;\n } else if (this.basePower >= 65) {\n this.maxMove.basePower = 85;\n } else if (this.basePower >= 55) {\n this.maxMove.basePower = 80;\n } else if (this.basePower >= 45) {\n this.maxMove.basePower = 75;\n } else {\n this.maxMove.basePower = 70;\n }\n } else {\n if (this.basePower >= 150) {\n this.maxMove.basePower = 150;\n } else if (this.basePower >= 110) {\n this.maxMove.basePower = 140;\n } else if (this.basePower >= 75) {\n this.maxMove.basePower = 130;\n } else if (this.basePower >= 65) {\n this.maxMove.basePower = 120;\n } else if (this.basePower >= 55) {\n this.maxMove.basePower = 110;\n } else if (this.basePower >= 45) {\n this.maxMove.basePower = 100;\n } else {\n this.maxMove.basePower = 90;\n }\n }\n }\n if (this.category !== 'Status' && !this.zMove &&\n !this.isZ && !this.isMax && this.id !== 'struggle') {\n let basePower = this.basePower;\n this.zMove = {};\n if (Array.isArray(this.multihit)) basePower *= 3;\n if (!basePower) {\n this.zMove.basePower = 100;\n } else if (basePower >= 140) {\n this.zMove.basePower = 200;\n } else if (basePower >= 130) {\n this.zMove.basePower = 195;\n } else if (basePower >= 120) {\n this.zMove.basePower = 190;\n } else if (basePower >= 110) {\n this.zMove.basePower = 185;\n } else if (basePower >= 100) {\n this.zMove.basePower = 180;\n } else if (basePower >= 90) {\n this.zMove.basePower = 175;\n } else if (basePower >= 80) {\n this.zMove.basePower = 160;\n } else if (basePower >= 70) {\n this.zMove.basePower = 140;\n } else if (basePower >= 60) {\n this.zMove.basePower = 120;\n } else {\n this.zMove.basePower = 100;\n }\n }\n if (!this.gen) {\n // special handling for gen8 gmax moves (all of them have num 1000 but they are part of gen8)\n if (this.num >= 827 && !this.isMax) {\n this.gen = 9;\n } else if (this.num >= 743) {\n this.gen = 8;\n } else if (this.num >= 622) {\n this.gen = 7;\n } else if (this.num >= 560) {\n this.gen = 6;\n } else if (this.num >= 468) {\n this.gen = 5;\n } else if (this.num >= 355) {\n this.gen = 4;\n } else if (this.num >= 252) {\n this.gen = 3;\n } else if (this.num >= 166) {\n this.gen = 2;\n } else if (this.num >= 1) {\n this.gen = 1;\n }\n }\n }\n}\n\nclass DexMoves implements T.DexTable<Move> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Move },\n all: undefined as ReadonlyArray<Move> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Move {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Move {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let move = this.caches.get[id];\n if (move) return move;\n\n if (id.startsWith('hiddenpower')) {\n id = /([a-z]*)([0-9]*)/.exec(id)![1] as T.ID;\n }\n\n const data = this.dex.data.Moves[id];\n if (id && data) {\n move = new Move(data);\n if (id.substr(0, 11) === 'hiddenpower') {\n id = /([a-z]*)([0-9]*)/.exec(id)![1] as T.ID;\n } else if (id.substr(0, 6) === 'return' && id.length > 6) {\n id = 'return' as T.ID;\n (move as any).basePower = Number(id.slice(6));\n } else if (id.substr(0, 11) === 'frustration' && id.length > 11) {\n id = 'frustration' as T.ID;\n (move as any).basePower = Number(id.slice(11));\n }\n if (this.dex.gen <= 3 && data.category !== 'Status') {\n (move as any).category = getGen3Category(data.type);\n }\n if (move.gen > this.dex.gen) (move as any).isNonstandard = 'Future';\n } else {\n move = new Move({id, name: id, exists: false});\n }\n\n if (move.exists) this.caches.get[id] = move;\n return move;\n }\n\n all(): readonly Move[] {\n if (this.caches.all) return this.caches.all;\n const moves = [];\n for (const id in this.dex.data.Moves) {\n moves.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = moves);\n }\n}\n\nexport class Nature extends BasicEffect<T.NatureName> implements T.Nature {\n readonly effectType: 'Nature';\n readonly kind: 'Nature';\n readonly plus?: Exclude<T.StatID, 'hp'>;\n readonly minus?: Exclude<T.StatID, 'hp'>;\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `nature: ${this.name}`;\n this.effectType = 'Nature';\n this.kind = 'Nature';\n this.gen = 3;\n this.plus = data.plus || undefined;\n this.minus = data.minus || undefined;\n }\n}\n\nclass DexNatures implements T.DexTable<Nature> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Nature },\n all: undefined as ReadonlyArray<Nature> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Nature {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Nature {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let nature = this.caches.get[id];\n if (nature) return nature;\n\n const data = this.dex.data.Natures[id];\n if (id && data) {\n nature = new Nature(data);\n if (nature.gen > this.dex.gen) nature.isNonstandard = 'Future';\n } else {\n nature = new Nature({name: id, exists: false});\n }\n\n if (nature.exists) this.caches.get[id] = nature;\n return nature;\n }\n\n all(): readonly Nature[] {\n if (this.caches.all) return this.caches.all;\n const natures = [];\n for (const id in this.dex.data.Natures) {\n natures.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = natures);\n }\n}\n\nexport class Species extends BasicEffect<T.SpeciesName> implements T.Species {\n readonly effectType: 'Pokemon';\n readonly kind: 'Species';\n\n readonly baseStats: T.StatsTable;\n readonly bst: number;\n readonly baseSpecies: T.SpeciesName;\n readonly baseForme: T.FormeName | '';\n readonly forme: T.FormeName | '';\n readonly abilities: T.SpeciesAbility<T.AbilityName | ''>;\n readonly types: [T.TypeName] | [T.TypeName, T.TypeName];\n readonly prevo?: T.SpeciesName | '';\n readonly evos?: T.SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups: T.EggGroup[];\n readonly canHatch: boolean;\n readonly weightkg: number;\n readonly weighthg: number;\n readonly tags: T.SpeciesTag[];\n readonly unreleasedHidden: boolean | 'Past';\n readonly maleOnlyHidden: boolean;\n readonly changesFrom?: T.SpeciesName;\n readonly tier: T.Tier.Singles | T.Tier.Other | 'Illegal';\n readonly doublesTier: T.Tier.Doubles | 'Illegal';\n\n readonly cosmeticFormes?: T.SpeciesName[];\n readonly otherFormes?: T.SpeciesName[];\n readonly formeOrder?: T.SpeciesName[];\n readonly genderRatio: { M: number; F: number };\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: T.SpeciesName | T.SpeciesName[];\n readonly canGigantamax?: T.MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: T.AbilityName;\n readonly requiredItem?: T.ItemName;\n readonly requiredItems?: T.ItemName[];\n readonly requiredMove?: T.MoveName;\n readonly gender?: T.GenderName;\n readonly maxHP?: number;\n readonly evoMove?: T.MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: T.EvoType;\n readonly condition?: Partial<Condition>;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `pokemon: ${data.name as string}`;\n this.effectType = 'Pokemon';\n this.kind = 'Species';\n\n this.baseSpecies = data.baseSpecies || data.name;\n this.forme = data.forme || '';\n this.baseForme = data.baseForme || '';\n this.abilities = data.abilities || {0: ''};\n this.types = data.types || ['???'];\n this.prevo = data.prevo || '';\n this.tier = data.tier || '';\n this.doublesTier = data.doublesTier || '';\n this.evos = data.evos || [];\n this.nfe = !!this.evos?.length;\n this.eggGroups = data.eggGroups || [];\n this.canHatch = data.canHatch || false;\n this.genderRatio = data.genderRatio || (this.gender === 'M' ? {M: 1, F: 0}\n : this.gender === 'F' ? {M: 0, F: 1}\n : this.gender === 'N' ? {M: 0, F: 0}\n : {M: 0.5, F: 0.5});\n this.requiredItems =\n this.requiredItems || (this.requiredItem ? [this.requiredItem] : undefined);\n this.baseStats = data.baseStats || {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0};\n this.bst = this.baseStats.hp + this.baseStats.atk + this.baseStats.def +\n this.baseStats.spa + this.baseStats.spd + this.baseStats.spe;\n this.weightkg = data.weightkg || 0;\n this.weighthg = this.weightkg * 10;\n this.tags = data.tags || [];\n this.unreleasedHidden = data.unreleasedHidden || false;\n this.maleOnlyHidden = !!data.maleOnlyHidden;\n this.isMega = !!(this.forme && ['Mega', 'Mega-X', 'Mega-Y'].includes(this.forme)) || undefined;\n this.gmaxUnreleased = !!data.gmaxUnreleased;\n this.cannotDynamax = !!data.cannotDynamax;\n this.battleOnly = data.battleOnly || (this.isMega ? this.baseSpecies : undefined);\n this.changesFrom = data.changesFrom ||\n (this.battleOnly !== this.baseSpecies ? this.battleOnly : this.baseSpecies);\n if (Array.isArray(data.changesFrom)) this.changesFrom = data.changesFrom[0]; // BUG\n\n if (!this.gen && data.num >= 1) {\n if (this.num >= 906 || this.forme.includes('Paldea')) {\n this.gen = 9;\n } else if (this.num >= 810 || ['Gmax', 'Galar', 'Galar-Zen', 'Hisui'].includes(this.forme)) {\n this.gen = 8;\n } else if (data.num >= 722 || this.forme.startsWith('Alola') || this.forme === 'Starter') {\n this.gen = 7;\n } else if (this.forme === 'Primal') {\n this.gen = 6;\n this.isPrimal = true;\n this.battleOnly = this.baseSpecies;\n } else if (data.num >= 650 || this.isMega) {\n this.gen = 6;\n } else if (data.num >= 494) {\n this.gen = 5;\n } else if (data.num >= 387) {\n this.gen = 4;\n } else if (data.num >= 252) {\n this.gen = 3;\n } else if (data.num >= 152) {\n this.gen = 2;\n } else {\n this.gen = 1;\n }\n }\n }\n}\n\ntype Mutable<T> = {-readonly [P in keyof T]: T[P]};\n\nclass DexSpecies implements T.DexTable<Species> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Species },\n all: undefined as ReadonlyArray<Species> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Species {\n name = name.trim();\n let id = toID(name);\n if (id === 'nidoran' && name.endsWith('♀')) {\n id = 'nidoranf' as T.ID;\n } else if (id === 'nidoran' && name.endsWith('♂')) {\n id = 'nidoranm' as T.ID;\n }\n return this.getByID(id);\n }\n\n getByID(id: T.ID): Species {\n let species: Mutable<Species> | undefined = this.caches.get[id];\n if (species) return species;\n\n const alias = this.dex.data.Aliases[id];\n if (alias) {\n const data = this.dex.data.FormatsData[id];\n if (data) {\n // special event ID, like Rockruff-Dusk\n const baseId = toID(alias);\n species = new Species({\n ...this.dex.data.Species[baseId],\n ...this.dex.data.FormatsData[id],\n name: id,\n });\n species.abilities = {0: species.abilities['S']!};\n } else {\n species = this.get(alias);\n if (species.cosmeticFormes) {\n for (const forme of species.cosmeticFormes) {\n if (toID(forme) === id) {\n species = new Species({\n ...species,\n name: forme,\n id,\n forme: forme.slice(species.name.length + 1),\n baseForme: '',\n baseSpecies: species.name,\n otherFormes: null,\n cosmeticFormes: null,\n });\n break;\n }\n }\n }\n }\n\n if (species?.exists) this.caches.get[id] = species;\n return species;\n }\n\n let data = this.dex.data.Species[id];\n if (id && !data) {\n let aliasTo = '';\n const formeNames: {[k: string]: string[]} = {\n alola: ['a', 'alola', 'alolan'],\n galar: ['g', 'galar', 'galarian'],\n hisui: ['h', 'hisui', 'hisuian'],\n paldea: ['p', 'paldea', 'paldean'],\n mega: ['m', 'mega'],\n primal: ['p', 'primal'],\n };\n for (const forme in formeNames) {\n let pokeName = '';\n for (const i of formeNames[forme]) {\n if (id.startsWith(i)) {\n pokeName = id.slice(i.length);\n } else if (id.endsWith(i)) {\n pokeName = id.slice(0, -i.length);\n }\n }\n if (this.dex.data.Aliases.hasOwnProperty(pokeName)) {\n pokeName = toID(this.dex.data.Aliases[pokeName]);\n }\n if (this.dex.data.Species[pokeName + forme]) {\n aliasTo = pokeName + forme;\n break;\n }\n }\n if (aliasTo) {\n species = this.get(aliasTo);\n if (species.exists) {\n this.caches.get[id] = species;\n return species;\n }\n }\n }\n\n data = this.dex.data.Species[id];\n\n if (id && data) {\n const tags = data.baseSpecies && this.dex.data.Species[toID(data.baseSpecies)].tags;\n species = new Species({tags, ...data, ...this.dex.data.FormatsData[id]});\n if (!species.tier && !species.doublesTier && species.baseSpecies !== species.name) {\n if (species.baseSpecies === 'Mimikyu') {\n (species as any).tier =\n this.dex.data.FormatsData[toID(species.baseSpecies)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[toID(species.baseSpecies)].doublesTier || 'Illegal';\n } else if (species.id.endsWith('totem')) {\n (species as any).tier =\n this.dex.data.FormatsData[species.id.slice(0, -5)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[species.id.slice(0, -5)].doublesTier || 'Illegal';\n } else if (species.battleOnly) {\n (species as any).tier =\n this.dex.data.FormatsData[toID(species.battleOnly)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[toID(species.battleOnly)].doublesTier || 'Illegal';\n } else {\n const baseFormatsData = this.dex.data.FormatsData[toID(species.baseSpecies)];\n if (!baseFormatsData) {\n throw new Error(`${species.baseSpecies} has no formats-data entry`);\n }\n (species as any).tier = baseFormatsData.tier || 'Illegal';\n (species as any).doublesTier = baseFormatsData.doublesTier || 'Illegal';\n }\n }\n if (!species.tier) species.tier = 'Illegal';\n if (!species.doublesTier) species.doublesTier = species.tier as any;\n if (species.gen > this.dex.gen) {\n species.tier = 'Illegal';\n species.doublesTier = 'Illegal';\n species.isNonstandard = 'Future';\n }\n species.nfe = !!(species.evos?.length && this.get(species.evos[0]).gen <= this.dex.gen);\n species.canHatch = species.canHatch ||\n (!['Ditto', 'Undiscovered'].includes(\n species.eggGroups[0]\n ) && !species.prevo && species.name !== 'Manaphy');\n if (this.dex.gen === 1) species.bst -= species.baseStats.spd;\n if (this.dex.gen < 5) delete species.abilities['H'];\n } else {\n species = new Species({\n id, name: id,\n exists: false, tier: 'Illegal', doublesTier: 'Illegal', isNonstandard: 'Custom',\n });\n }\n\n if (species.exists) this.caches.get[id] = species;\n return species;\n }\n\n all(): readonly Species[] {\n if (this.caches.all) return this.caches.all;\n const species = [];\n for (const id in this.dex.data.Species) {\n species.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = species);\n }\n}\n\nexport class Learnset implements T.Learnset {\n readonly effectType: 'Learnset';\n readonly kind: 'Learnset';\n readonly learnset?: { [moveid: string]: T.MoveSource[] };\n readonly eventOnly: boolean;\n readonly eventData?: T.EventInfo[];\n readonly encounters?: T.EventInfo[];\n readonly exists: boolean;\n\n constructor(data: AnyObject) {\n this.effectType = 'Learnset';\n this.kind = 'Learnset';\n this.learnset = data.learnset || undefined;\n this.eventOnly = !!data.eventOnly;\n this.eventData = data.eventData || undefined;\n this.encounters = data.encounters || undefined;\n this.exists = data.exists ?? true;\n }\n}\n\nclass DexLearnsets {\n readonly dex: ModdedDex;\n readonly cache = Object.create(null) as { [id: string]: Learnset };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n async get(name: string): Promise<Learnset> {\n return this.getByID(toID(name));\n }\n\n async getByID(id: T.ID): Promise<Learnset> {\n let learnset = this.cache[id];\n if (learnset) return learnset;\n\n if (!DATA.Learnsets) {\n try {\n DATA.Learnsets = (await import('./data/learnsets.json')).default as Data<T.LearnsetData>;\n } catch (err) {\n // @ts-ignore If we're being used via a <script> tag we depend on Learnsets being required\n DATA.Learnsets = (window as any).pkmn?.learnsets as Data<T.LearnsetData>;\n if (!DATA.Learnsets) throw new Error('Learnsets have not been included!');\n }\n }\n this.dex.load('Learnsets', this.dex.modData);\n this.dex.modData = undefined;\n\n const data = this.dex.data.Learnsets![id];\n if (id && data) {\n learnset = new Learnset(data);\n } else {\n learnset = new Learnset({exists: false});\n }\n if (learnset.exists) this.cache[id] = learnset;\n return learnset;\n }\n}\n\nexport class Type implements T.Type {\n readonly id: T.ID;\n readonly name: T.TypeName;\n readonly effectType: 'Type';\n readonly kind: 'Type';\n readonly exists: boolean;\n readonly gen: T.GenerationNum;\n readonly isNonstandard: T.Nonstandard | null;\n readonly damageTaken: { [t in Exclude<T.TypeName, '???'>]: number } & { [key: string]: number };\n readonly HPivs: Partial<T.StatsTable>;\n readonly HPdvs: Partial<T.StatsTable>;\n\n constructor(data: AnyObject) {\n this.exists = true;\n Object.assign(this, data);\n\n this.effectType = 'Type';\n this.kind = 'Type';\n this.id = data.id;\n this.name = data.name;\n this.exists = !!(this.exists && this.id);\n this.gen = data.gen || 0;\n this.isNonstandard = data.isNonstandard || null;\n this.damageTaken = data.damageTaken || {};\n this.HPivs = data.HPivs || {};\n this.HPdvs = data.HPdvs || {};\n }\n\n toString() {\n return this.name;\n }\n}\n\nclass DexTypes implements T.DexTable<Type> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Type },\n all: undefined as ReadonlyArray<Type> | undefined,\n names: undefined as ReadonlyArray<string> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Type {\n if (name && typeof name !== 'string') return name;\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Type {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let type = this.caches.get[id];\n if (type) return type;\n\n const typeName = id.charAt(0).toUpperCase() + id.substr(1) as Exclude<T.TypeName, '???'>;\n const data = this.dex.data.Types[id];\n if (typeName && data) {\n type = new Type({name: typeName, id, ...data});\n } else {\n type = new Type({name: typeName, id, exists: false});\n }\n\n if (type.exists) this.caches.get[id] = type;\n return type;\n }\n\n names(): readonly string[] {\n if (this.caches.names) return this.caches.names;\n this.caches.names = this.all().filter(type => !type.isNonstandard).map(type => type.name);\n return this.caches.names;\n }\n\n isName(name: string): boolean {\n const id = name.toLowerCase();\n const typeName = id.charAt(0).toUpperCase() + id.substr(1);\n return name === typeName && this.dex.data.Types.hasOwnProperty(id);\n }\n\n all(): readonly Type[] {\n if (this.caches.all) return this.caches.all;\n const types = [];\n for (const id in this.dex.data.Types) {\n types.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = types);\n }\n}\n\nconst STATS: readonly T.StatID[] = ['hp', 'atk', 'def', 'spa', 'spd', 'spe'];\n\nclass DexStats {\n readonly shortNames: {readonly [k in T.StatID]: string};\n readonly mediumNames: {readonly [k in T.StatID]: string};\n readonly names: {readonly [k in T.StatID]: string};\n\n constructor(dex: ModdedDex) {\n if (dex.gen !== 1) {\n this.shortNames = {\n __proto__: null,\n hp: 'HP', atk: 'Atk', def: 'Def',\n spa: 'SpA', spd: 'SpD', spe: 'Spe',\n } as any;\n this.mediumNames = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Sp. Atk', spd: 'Sp. Def', spe: 'Speed',\n } as any;\n this.names = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special Attack', spd: 'Special Defense', spe: 'Speed',\n } as any;\n } else {\n this.shortNames = {\n __proto__: null,\n hp: 'HP', atk: 'Atk', def: 'Def',\n spa: 'Spc', spd: '[SpD]', spe: 'Spe',\n } as any;\n this.mediumNames = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special', spd: '[Sp. Def]', spe: 'Speed',\n } as any;\n this.names = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special', spd: '[Special Defense]', spe: 'Speed',\n } as any;\n }\n }\n\n ids(): typeof STATS {\n return STATS;\n }\n}\n\n// #endregion\n\n// #region Dex\n\ntype Data<T> = { 9: { [id: string]: T } } & {\n [num in Exclude<T.GenerationNum, 9>]?: { [id: string]: { inherit?: boolean } & T.DeepPartial<T> }\n};\n\nconst DATA = {\n Abilities: AbilitiesJSON as Data<T.AbilityData>,\n Aliases: AliasesJSON as { [id: string]: string },\n Conditions: ConditionsJSON as Data<T.ConditionData>,\n Items: ItemsJSON as Data<T.ItemData>,\n Moves: MovesJSON as unknown as Data<T.MoveData>,\n Species: SpeciesJSON as Data<T.SpeciesData>,\n Natures: NaturesJSON as Data<T.NatureData>,\n Learnsets: null! as Data<T.LearnsetData>,\n Types: TypesJSON as Data<T.TypeData>,\n FormatsData: FormatsDataJSON as Data<FormatData>,\n};\n\nconst HP_TYPES: T.HPTypeName[] = [\n 'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel',\n 'Fire', 'Water', 'Grass', 'Electric', 'Psychic', 'Ice', 'Dragon', 'Dark',\n];\n\nconst GEN_IDS = ['gen1', 'gen2', 'gen3', 'gen4', 'gen5', 'gen6', 'gen7', 'gen8', 'gen9'] as const;\ntype GenID = typeof GEN_IDS[number];\nconst CURRENT_GEN_ID: GenID = GEN_IDS[8];\n\nconst dexes: { [mod: string]: ModdedDex } = Object.create(null);\n\nexport type ModData = T.DeepPartial<ModdedDex['data']> & T.ModData;\n\nexport class ModdedDex implements T.Dex {\n static readonly STATS: ReadonlyArray<T.StatID> = ['hp', 'atk', 'def', 'spa', 'spd', 'spe'];\n\n readonly gen: T.GenerationNum;\n readonly modid: T.ID;\n readonly data!: {\n Abilities: { [id: string]: T.AbilityData };\n Aliases: { [id: string]: string };\n Conditions: { [id: string]: T.ConditionData };\n FormatsData: { [id: string]: FormatData };\n Items: { [id: string]: T.ItemData };\n Learnsets: null | { [id: string]: T.LearnsetData };\n Moves: { [id: string]: T.MoveData };\n Natures: { [id: string]: T.NatureData };\n Species: { [id: string]: T.SpeciesData };\n Types: { [id: string]: T.TypeData };\n };\n\n readonly abilities: DexAbilities;\n readonly conditions: DexConditions;\n readonly items: DexItems;\n readonly learnsets: DexLearnsets;\n readonly moves: DexMoves;\n readonly natures: DexNatures;\n readonly species: DexSpecies;\n readonly stats: DexStats;\n readonly types: DexTypes;\n\n /* private */ modData?: ModData = undefined;\n\n constructor(modid = CURRENT_GEN_ID as GenID | T.ID, modData?: ModData) {\n const isGen = (GEN_IDS as unknown as Array<GenID | T.ID>).includes(modid);\n if (!isGen && !modData) throw new Error(`Must provide mod data with mod '${modid}'`);\n this.modid = modid as T.ID;\n this.gen = parseInt((modData?.Scripts?.inherit ?? modid).slice(3)) as T.GenerationNum || 9;\n this.loadData(modData);\n\n this.abilities = new DexAbilities(this);\n this.conditions = new DexConditions(this);\n this.items = new DexItems(this);\n this.learnsets = new DexLearnsets(this);\n this.moves = new DexMoves(this);\n this.natures = new DexNatures(this);\n this.species = new DexSpecies(this);\n this.stats = new DexStats(this);\n this.types = new DexTypes(this);\n }\n\n mod(genid: GenID): ModdedDex;\n mod(modid: T.ID, modData: ModData): ModdedDex;\n mod(modid: GenID | T.ID, modData?: ModData) {\n if (modid in dexes) return modData ? new ModdedDex(modid, modData) : dexes[modid];\n return (dexes[modid] = new ModdedDex(modid as T.ID, modData));\n }\n\n forGen(gen: number) {\n if (gen < 1 || gen > 9) throw new Error(`Unsupported gen ${gen}`);\n return this.mod(`gen${gen}` as GenID);\n }\n\n getImmunity(\n source: { type: string } | string,\n target: { getTypes: () => string[] } | { types: string[] } | string[] | string\n ): boolean {\n const sourceType: string = typeof source !== 'string' ? source.type : source;\n // @ts-ignore\n const targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n if (Array.isArray(targetTyping)) {\n for (const type of targetTyping) {\n if (!this.getImmunity(sourceType, type)) return false;\n }\n return true;\n }\n const typeData = this.types.get(targetTyping as Exclude<T.TypeName, '???'>);\n if (typeData && typeData.damageTaken[sourceType] === 3) return false;\n return true;\n }\n\n getEffectiveness(\n source: { type: string } | string,\n target: { getTypes: () => string[] } | { types: string[] } | string[] | string\n ): number {\n const sourceType: string = typeof source !== 'string' ? source.type : source;\n // @ts-ignore\n const targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n let totalTypeMod = 0;\n if (Array.isArray(targetTyping)) {\n for (const type of targetTyping) {\n totalTypeMod += this.getEffectiveness(sourceType, type);\n }\n return totalTypeMod;\n }\n const typeData = this.types.get(targetTyping as Exclude<T.TypeName, '???'>);\n if (!typeData) return 0;\n switch (typeData.damageTaken[sourceType]) {\n case 1: return 1; // super-effective\n case 2: return -1; // resist\n // in case of weird situations like Gravity, immunity is handled elsewhere\n default: return 0;\n }\n }\n\n getHiddenPower(ivs: T.StatsTable) {\n const tr = (num: number, bits = 0) => {\n if (bits) return (num >>> 0) % (2 ** bits);\n return num >>> 0;\n };\n const stats = {hp: 31, atk: 31, def: 31, spe: 31, spa: 31, spd: 31};\n if (this.gen <= 2) {\n // Gen 2 specific Hidden Power check. IVs are still treated 0-31 so we get them 0-15\n const atkDV = tr(ivs.atk / 2);\n const defDV = tr(ivs.def / 2);\n const speDV = tr(ivs.spe / 2);\n const spcDV = tr(ivs.spa / 2);\n return {\n type: HP_TYPES[4 * (atkDV % 4) + (defDV % 4)],\n power: tr(\n (5 * ((spcDV >> 3) +\n (2 * (speDV >> 3)) +\n (4 * (defDV >> 3)) +\n (8 * (atkDV >> 3))) +\n (spcDV % 4)) / 2 + 31\n ),\n };\n } else {\n // Hidden Power check for Gen 3 onwards\n let hpTypeX = 0;\n let hpPowerX = 0;\n let i = 1;\n for (const s in stats) {\n hpTypeX += i * (ivs[s as T.StatID] % 2);\n hpPowerX += i * (tr(ivs[s as T.StatID] / 2) % 2);\n i *= 2;\n }\n return {\n type: HP_TYPES[tr(hpTypeX * 15 / 63)],\n // After Gen 6, Hidden Power is always 60 base power\n power: (this.gen && this.gen < 6) ? tr(hpPowerX * 40 / 63) + 30 : 60,\n };\n }\n }\n\n includeModData() {\n return this;\n }\n\n includeData() {\n return this;\n }\n\n includeFormats() {\n return this;\n }\n\n loadData(modData?: ModData) {\n if (this.data) return this.data;\n (this.data as any) = {} as ModdedDex['data'];\n\n for (const t in DATA) {\n const type = t as keyof typeof DATA;\n if (type === 'Learnsets') {\n this.modData = modData;\n continue; // async\n }\n if (type === 'Aliases') {\n (this.data as any)[type] = DATA[type];\n continue;\n }\n this.load(type, modData);\n }\n return this.data;\n }\n\n load(type: Exclude<keyof ModdedDex['data'], 'Aliases'>, modData?: ModData) {\n if (this.data[type]) return;\n\n const d = modData ? modData[type] : DATA[type][this.gen];\n if (d !== this.data[type]) this.data[type] = ({...d, ...this.data[type]}) as any;\n\n if (this.modid === CURRENT_GEN_ID) return;\n\n const parentDex = modData?.Scripts?.inherit\n ? this.mod(modData.Scripts.inherit)\n : this.forGen(modData ? this.gen : this.gen + 1 as T.GenerationNum);\n if (type === 'Learnsets') parentDex.load('Learnsets');\n\n const parentDataType = parentDex.data[type];\n const childDataType = this.data[type] || (this.data[type] = {} as any);\n for (const e in parentDataType) {\n const entry = e as keyof typeof parentDataType;\n if (childDataType[entry] === null) {\n // null means don't inherit\n delete childDataType[entry];\n } else if (!(entry in childDataType)) {\n // If it doesn't exist it's inherited from the parent data\n if (type === 'Species') {\n // Species entries can be modified too many different ways\n // e.g. inheriting different formats-data/learnsets\n childDataType[entry] = deepClone(parentDataType[entry]);\n } else {\n childDataType[entry] = parentDataType[entry];\n }\n } else if (childDataType[entry]?.inherit) {\n // {inherit: true} can be used to modify only parts of the parent data,\n // instead of overwriting entirely\n delete childDataType[entry].inherit;\n // Merge parent into children entry, preserving existing childs' properties.\n for (const key in parentDataType[entry]) {\n if (key in childDataType[entry]) continue;\n (childDataType[entry])[key] = (parentDataType[entry] as any)[key];\n }\n }\n }\n }\n}\n\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\nfunction getGen3Category(type: T.TypeName) {\n return SPECIAL.includes(type) ? 'Special' : 'Physical';\n}\n\nfunction deepClone(obj: any): any {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Array.isArray(obj)) return obj.map(prop => deepClone(prop));\n const clone = Object.create(Object.getPrototypeOf(obj));\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone(obj[key]);\n }\n return clone;\n}\n\n// #endregion\n\ndexes[CURRENT_GEN_ID] = new ModdedDex(CURRENT_GEN_ID);\nexport const Dex = dexes[CURRENT_GEN_ID];\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n // BasicEffect,\n // Condition,\n // Ability,\n // Item,\n // Move,\n // Species,\n EventInfo,\n // Learnset,\n // Type,\n // Nature,\n GenID,\n // Dex,\n} from '@pkmn/dex-types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","names":["data","tr"]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport * as T from '@pkmn/dex-types';\n\nimport * as AbilitiesJSON from './data/abilities.json';\nimport * as AliasesJSON from './data/aliases.json';\nimport * as ConditionsJSON from './data/conditions.json';\nimport * as FormatsDataJSON from './data/formats-data.json';\nimport * as ItemsJSON from './data/items.json';\nimport * as MovesJSON from './data/moves.json';\nimport * as NaturesJSON from './data/natures.json';\nimport * as SpeciesJSON from './data/species.json';\nimport * as TypesJSON from './data/types.json';\n\nexport function toID(text: any): T.ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as T.ID;\n}\n\nfunction getString(str: any): string {\n return (typeof str === 'string' || typeof str === 'number') ? '' + str : '';\n}\n\n// #region Data\n\nexport interface FormatData {\n tier?: string;\n doublesTier?: string;\n isNonstandard?: T.Nonstandard;\n inherit?: boolean;\n}\n\ninterface AnyObject { [k: string]: any }\n\nexport class BasicEffect<NameT extends string = string> implements T.BasicEffect<NameT> {\n id: T.ID;\n name: NameT;\n fullname: string;\n effectType: T.EffectType;\n kind: T.DataKind;\n exists: boolean;\n num: number;\n gen: T.GenerationNum;\n shortDesc: string;\n desc: string;\n isNonstandard: T.Nonstandard | null;\n duration?: number;\n\n constructor(data: AnyObject) {\n this.exists = true;\n Object.assign(this, data);\n\n this.name = getString(data.name).trim() as NameT;\n this.id = data.realMove ? toID(data.realMove) : toID(this.name); // Hidden Power hack\n this.fullname = getString(data.fullname) || this.name;\n this.effectType = getString(data.effectType) as T.EffectType || 'Condition';\n this.kind = 'Condition';\n this.exists = !!(this.exists && this.id);\n this.num = data.num || 0;\n this.gen = data.gen || 0;\n this.shortDesc = data.shortDesc || '';\n this.desc = data.desc || this.shortDesc;\n this.isNonstandard = data.isNonstandard || null;\n this.duration = data.duration;\n }\n\n toString() {\n return this.name;\n }\n}\n\nexport class Condition extends BasicEffect implements T.Condition {\n readonly effectType: 'Condition' | 'Weather' | 'Status' | 'Terastal';\n readonly kind: 'Condition';\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n this.effectType =\n (['Weather', 'Status'].includes(data.effectType) ? data.effectType : 'Condition');\n this.kind = 'Condition';\n }\n}\n\nconst EMPTY_CONDITION: Condition = new Condition({name: '', exists: false});\n\nclass DexConditions implements T.DexTable<Condition> {\n readonly dex: ModdedDex;\n readonly cache = Object.create(null) as { [id: string]: Condition };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Condition {\n // This treatment of 'item:id' and 'ability:id' is kind of repugnant but regrettably exists\n // for loose compatibility with Pokémon Showdown's Dex API. 'move:id' also needs to be handled\n // for the client to work correctly.\n if (name.startsWith('item:')) {\n const item = this.dex.items.get(name.slice(5));\n return item as any as Condition;\n } else if (name.startsWith('ability:')) {\n const ability = this.dex.abilities.get(name.slice(8));\n return ability as any as Condition;\n } else if (name.startsWith('move:')) {\n const move = this.dex.moves.get(name.slice(5));\n return move as any as Condition;\n }\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Condition {\n if (!id) return EMPTY_CONDITION;\n\n let condition = this.cache[id];\n if (condition) return condition;\n\n let found: T.AbilityData | T.ItemData | T.MoveData;\n if (this.dex.data.Conditions.hasOwnProperty(id)) {\n condition = new Condition({kind: 'Condition', ...this.dex.data.Conditions[id]});\n } else if (\n (this.dex.data.Moves.hasOwnProperty(id) &&\n (found = this.dex.data.Moves[id]).condition) ||\n (this.dex.data.Abilities.hasOwnProperty(id) &&\n (found = this.dex.data.Abilities[id]).condition) ||\n (this.dex.data.Items.hasOwnProperty(id) &&\n (found = this.dex.data.Items[id]).condition)) {\n condition = new Condition({name: found.name || id, ...found.condition});\n } else if (id === 'recoil') {\n condition = new Condition({name: 'Recoil', effectType: 'Recoil'});\n } else if (id === 'drain') {\n condition = new Condition({name: 'Drain', effectType: 'Drain'});\n } else {\n condition = new Condition({name: id, exists: false});\n }\n\n this.cache[id] = condition;\n return condition;\n }\n}\n\nexport class Ability extends BasicEffect<T.AbilityName> implements T.Ability {\n readonly effectType: 'Ability';\n readonly kind: 'Ability';\n readonly isBreakable?: boolean;\n readonly suppressWeather?: boolean;\n readonly condition?: Partial<Condition>;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `ability: ${this.name}`;\n this.effectType = 'Ability';\n this.kind = 'Ability';\n\n if (!this.gen) {\n if (this.num >= 268) {\n this.gen = 9;\n } else if (this.num >= 234) {\n this.gen = 8;\n } else if (this.num >= 192) {\n this.gen = 7;\n } else if (this.num >= 165) {\n this.gen = 6;\n } else if (this.num >= 124) {\n this.gen = 5;\n } else if (this.num >= 77) {\n this.gen = 4;\n } else if (this.num >= 1) {\n this.gen = 3;\n }\n }\n }\n}\n\nclass DexAbilities implements T.DexTable<Ability> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Ability },\n all: undefined as ReadonlyArray<Ability> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Ability {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Ability {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let ability = this.caches.get[id];\n if (ability) return ability;\n\n const data = this.dex.data.Abilities[id];\n if (id && data) {\n ability = new Ability(data);\n if (ability.gen > this.dex.gen) (ability as any).isNonstandard = 'Future';\n if (this.dex.gen <= 2 && ability.id === 'noability') (ability as any).isNonstandard = null;\n } else {\n ability = new Ability({id, name: id, exists: false});\n }\n\n if (ability.exists) this.caches.get[id] = ability;\n return ability;\n }\n\n all(): readonly Ability[] {\n if (this.caches.all) return this.caches.all;\n const abilities = [];\n for (const id in this.dex.data.Abilities) {\n abilities.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = abilities);\n }\n}\n\nexport class Item extends BasicEffect<T.ItemName> implements T.Item {\n readonly effectType: 'Item';\n readonly kind: 'Item';\n\n readonly forcedForme?: T.SpeciesName;\n readonly megaStone?: T.SpeciesName;\n readonly megaEvolves?: T.SpeciesName;\n readonly onDrive?: T.TypeName;\n readonly onMemory?: T.TypeName;\n readonly onPlate?: T.TypeName;\n readonly zMove?: T.MoveName | true;\n readonly zMoveType?: T.TypeName;\n readonly zMoveFrom?: T.MoveName;\n readonly itemUser?: T.SpeciesName[];\n readonly fling?: T.ItemData['fling'];\n readonly condition?: Partial<Condition>;\n readonly ignoreKlutz?: boolean;\n readonly isBerry?: boolean;\n readonly isChoice?: boolean;\n readonly isGem?: boolean;\n readonly isPokeball?: boolean;\n readonly naturalGift?: { basePower: number; type: T.TypeName };\n readonly boosts?: Partial<T.BoostsTable> | false;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `item: ${this.name}`;\n this.effectType = 'Item';\n this.kind = 'Item';\n\n if (!this.gen) {\n if (this.num >= 1124) {\n this.gen = 9;\n } else if (this.num >= 927) {\n this.gen = 8;\n } else if (this.num >= 689) {\n this.gen = 7;\n } else if (this.num >= 577) {\n this.gen = 6;\n } else if (this.num >= 537) {\n this.gen = 5;\n } else if (this.num >= 377) {\n this.gen = 4;\n } else {\n this.gen = 3;\n }\n // Due to difference in gen 2 item numbering, gen 2 items must be\n // specified manually\n }\n\n if (this.isBerry) this.fling = {basePower: 10};\n if (this.id.endsWith('plate')) this.fling = {basePower: 90};\n if (this.onDrive) this.fling = {basePower: 70};\n if (this.megaStone) this.fling = {basePower: 80};\n if (this.onMemory) this.fling = {basePower: 50};\n }\n}\n\nclass DexItems implements T.DexTable<Item> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Item },\n all: undefined as ReadonlyArray<Item> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name?: string): Item {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Item {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let item = this.caches.get[id];\n if (item) return item;\n\n if (id && !this.dex.data.Items[id] && this.dex.data.Items[id + 'berry']) {\n item = this.getByID(id + 'berry' as T.ID);\n return (this.caches.get[id] = item);\n }\n\n const data = this.dex.data.Items[id];\n if (id && data) {\n item = new Item(data);\n if (item.gen > this.dex.gen) (item as any).isNonstandard = 'Future';\n } else {\n item = new Item({name: id, exists: false});\n }\n\n if (item.exists) this.caches.get[id] = item;\n return item;\n }\n\n all(): readonly Item[] {\n if (this.caches.all) return this.caches.all;\n const items = [];\n for (const id in this.dex.data.Items) {\n items.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = items);\n }\n}\n\nexport class Move extends BasicEffect<T.MoveName> implements T.Move {\n readonly effectType: 'Move';\n readonly kind: 'Move';\n\n readonly boosts?: Partial<T.BoostsTable>;\n readonly status?: T.StatusName;\n readonly volatileStatus?: T.ID;\n readonly slotCondition?: T.ID;\n readonly sideCondition?: T.ID;\n readonly terrain?: T.ID;\n readonly pseudoWeather?: T.ID;\n readonly weather?: T.ID;\n\n readonly basePower!: number;\n readonly type!: T.TypeName;\n readonly accuracy!: true | number;\n readonly pp!: number;\n readonly target!: T.MoveTarget;\n readonly priority!: number;\n readonly flags: T.Move['flags'];\n readonly category!: T.MoveCategory;\n\n readonly condition?: Partial<T.Condition>;\n readonly damage?: number | 'level' | false | null;\n readonly noPPBoosts?: boolean;\n\n readonly isZ: boolean | T.ID;\n readonly zMove?: {\n basePower?: number;\n effect?: T.ID;\n boost?: Partial<T.BoostsTable>;\n };\n readonly isMax: boolean | T.SpeciesName;\n readonly maxMove?: {\n basePower: number;\n };\n\n readonly ohko?: boolean | T.TypeName;\n readonly thawsTarget?: boolean;\n readonly heal?: number[] | null;\n readonly forceSwitch?: boolean;\n readonly selfSwitch?: 'copyvolatile' | 'shedtail' | boolean;\n readonly selfBoost?: { boosts?: Partial<T.BoostsTable> };\n readonly selfdestruct?: boolean | 'ifHit' | 'always';\n readonly breaksProtect?: boolean;\n readonly recoil?: [number, number];\n readonly drain?: [number, number];\n readonly mindBlownRecoil?: boolean;\n readonly struggleRecoil?: boolean;\n readonly stealsBoosts?: boolean;\n readonly secondary?: T.SecondaryEffect | null;\n readonly secondaries: T.SecondaryEffect[] | null;\n readonly self?: T.HitEffect | null;\n\n readonly alwaysHit?: boolean;\n readonly basePowerModifier?: number;\n readonly critModifier?: number;\n readonly critRatio?: number;\n readonly overrideOffensivePokemon?: 'target' | 'source';\n readonly overrideOffensiveStat?: Exclude<T.StatID, 'hp'>;\n readonly overrideDefensivePokemon?: 'target' | 'source';\n readonly overrideDefensiveStat?: Exclude<T.StatID, 'hp'>;\n readonly forceSTAB?: boolean;\n readonly ignoreAbility?: boolean;\n readonly ignoreAccuracy?: boolean;\n readonly ignoreDefensive?: boolean;\n readonly ignoreEvasion?: boolean;\n readonly ignoreImmunity?: boolean | { [k in keyof T.TypeName]?: boolean };\n readonly ignoreNegativeOffensive?: boolean;\n readonly ignoreOffensive?: boolean;\n readonly ignorePositiveDefensive?: boolean;\n readonly ignorePositiveEvasion?: boolean;\n readonly infiltrates?: boolean;\n readonly multiaccuracy?: boolean;\n readonly multihit?: number | number[];\n readonly noCopy?: boolean;\n readonly noDamageVariance?: boolean;\n readonly noFaint?: boolean;\n readonly nonGhostTarget?: T.MoveTarget;\n readonly pressureTarget?: T.MoveTarget;\n readonly sleepUsable?: boolean;\n readonly smartTarget?: boolean;\n readonly spreadModifier?: number;\n readonly tracksTarget?: boolean;\n readonly willCrit?: boolean;\n\n readonly hasCrashDamage?: boolean;\n readonly hasSheerForce?: boolean;\n readonly isConfusionSelfHit?: boolean;\n readonly noMetronome?: T.MoveName[];\n readonly noSketch?: boolean;\n readonly stallingMove?: boolean;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `move: ${this.name}`;\n this.effectType = 'Move';\n this.kind = 'Move';\n\n this.type = getString(data.type) as T.TypeName;\n this.basePower = Number(data.basePower);\n this.critRatio = Number(data.critRatio) || 1;\n this.secondary = data.secondary || null;\n this.secondaries = data.secondaries?.length\n ? data.secondaries : this.secondary\n ? [this.secondary]\n : null;\n this.hasSheerForce = !!(data.hasSheerForce && !this.secondaries);\n this.priority = Number(data.priority) || 0;\n this.ignoreImmunity =\n (data.ignoreImmunity !== undefined ? data.ignoreImmunity : data.category === 'Status');\n this.pp = Number(data.pp);\n this.isZ = data.isZ || false;\n this.isMax = data.isMax || false;\n this.flags = data.flags || {};\n this.selfSwitch =\n (typeof data.selfSwitch === 'string'\n ? (data.selfSwitch as 'copyvolatile' | 'shedtail')\n : data.selfSwitch) ||\n undefined;\n this.pressureTarget = data.pressureTarget || undefined;\n this.nonGhostTarget = data.nonGhostTarget || undefined;\n this.ignoreAbility = data.ignoreAbility || false;\n this.volatileStatus =\n typeof data.volatileStatus === 'string' ? (data.volatileStatus as T.ID) : undefined;\n\n if (this.category !== 'Status' && !this.maxMove && this.id !== 'struggle') {\n this.maxMove = {basePower: 1};\n if (this.isMax || this.isZ) {\n // already initialized to 1\n } else if (!this.basePower) {\n this.maxMove.basePower = 100;\n } else if (['Fighting', 'Poison'].includes(this.type)) {\n if (this.basePower >= 150) {\n this.maxMove.basePower = 100;\n } else if (this.basePower >= 110) {\n this.maxMove.basePower = 95;\n } else if (this.basePower >= 75) {\n this.maxMove.basePower = 90;\n } else if (this.basePower >= 65) {\n this.maxMove.basePower = 85;\n } else if (this.basePower >= 55) {\n this.maxMove.basePower = 80;\n } else if (this.basePower >= 45) {\n this.maxMove.basePower = 75;\n } else {\n this.maxMove.basePower = 70;\n }\n } else {\n if (this.basePower >= 150) {\n this.maxMove.basePower = 150;\n } else if (this.basePower >= 110) {\n this.maxMove.basePower = 140;\n } else if (this.basePower >= 75) {\n this.maxMove.basePower = 130;\n } else if (this.basePower >= 65) {\n this.maxMove.basePower = 120;\n } else if (this.basePower >= 55) {\n this.maxMove.basePower = 110;\n } else if (this.basePower >= 45) {\n this.maxMove.basePower = 100;\n } else {\n this.maxMove.basePower = 90;\n }\n }\n }\n if (this.category !== 'Status' && !this.zMove &&\n !this.isZ && !this.isMax && this.id !== 'struggle') {\n let basePower = this.basePower;\n this.zMove = {};\n if (Array.isArray(this.multihit)) basePower *= 3;\n if (!basePower) {\n this.zMove.basePower = 100;\n } else if (basePower >= 140) {\n this.zMove.basePower = 200;\n } else if (basePower >= 130) {\n this.zMove.basePower = 195;\n } else if (basePower >= 120) {\n this.zMove.basePower = 190;\n } else if (basePower >= 110) {\n this.zMove.basePower = 185;\n } else if (basePower >= 100) {\n this.zMove.basePower = 180;\n } else if (basePower >= 90) {\n this.zMove.basePower = 175;\n } else if (basePower >= 80) {\n this.zMove.basePower = 160;\n } else if (basePower >= 70) {\n this.zMove.basePower = 140;\n } else if (basePower >= 60) {\n this.zMove.basePower = 120;\n } else {\n this.zMove.basePower = 100;\n }\n }\n if (!this.gen) {\n // special handling for gen8 gmax moves (all of them have num 1000 but they are part of gen8)\n if (this.num >= 827 && !this.isMax) {\n this.gen = 9;\n } else if (this.num >= 743) {\n this.gen = 8;\n } else if (this.num >= 622) {\n this.gen = 7;\n } else if (this.num >= 560) {\n this.gen = 6;\n } else if (this.num >= 468) {\n this.gen = 5;\n } else if (this.num >= 355) {\n this.gen = 4;\n } else if (this.num >= 252) {\n this.gen = 3;\n } else if (this.num >= 166) {\n this.gen = 2;\n } else if (this.num >= 1) {\n this.gen = 1;\n }\n }\n }\n}\n\nclass DexMoves implements T.DexTable<Move> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Move },\n all: undefined as ReadonlyArray<Move> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Move {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Move {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let move = this.caches.get[id];\n if (move) return move;\n\n if (id.startsWith('hiddenpower')) {\n id = /([a-z]*)([0-9]*)/.exec(id)![1] as T.ID;\n }\n\n const data = this.dex.data.Moves[id];\n if (id && data) {\n move = new Move(data);\n if (id.substr(0, 11) === 'hiddenpower') {\n id = /([a-z]*)([0-9]*)/.exec(id)![1] as T.ID;\n } else if (id.substr(0, 6) === 'return' && id.length > 6) {\n id = 'return' as T.ID;\n (move as any).basePower = Number(id.slice(6));\n } else if (id.substr(0, 11) === 'frustration' && id.length > 11) {\n id = 'frustration' as T.ID;\n (move as any).basePower = Number(id.slice(11));\n }\n if (this.dex.gen <= 3 && data.category !== 'Status') {\n (move as any).category = getGen3Category(data.type);\n }\n if (move.gen > this.dex.gen) (move as any).isNonstandard = 'Future';\n } else {\n move = new Move({id, name: id, exists: false});\n }\n\n if (move.exists) this.caches.get[id] = move;\n return move;\n }\n\n all(): readonly Move[] {\n if (this.caches.all) return this.caches.all;\n const moves = [];\n for (const id in this.dex.data.Moves) {\n moves.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = moves);\n }\n}\n\nexport class Nature extends BasicEffect<T.NatureName> implements T.Nature {\n readonly effectType: 'Nature';\n readonly kind: 'Nature';\n readonly plus?: Exclude<T.StatID, 'hp'>;\n readonly minus?: Exclude<T.StatID, 'hp'>;\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `nature: ${this.name}`;\n this.effectType = 'Nature';\n this.kind = 'Nature';\n this.gen = 3;\n this.plus = data.plus || undefined;\n this.minus = data.minus || undefined;\n }\n}\n\nclass DexNatures implements T.DexTable<Nature> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Nature },\n all: undefined as ReadonlyArray<Nature> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Nature {\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Nature {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let nature = this.caches.get[id];\n if (nature) return nature;\n\n const data = this.dex.data.Natures[id];\n if (id && data) {\n nature = new Nature(data);\n if (nature.gen > this.dex.gen) nature.isNonstandard = 'Future';\n } else {\n nature = new Nature({name: id, exists: false});\n }\n\n if (nature.exists) this.caches.get[id] = nature;\n return nature;\n }\n\n all(): readonly Nature[] {\n if (this.caches.all) return this.caches.all;\n const natures = [];\n for (const id in this.dex.data.Natures) {\n natures.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = natures);\n }\n}\n\nexport class Species extends BasicEffect<T.SpeciesName> implements T.Species {\n readonly effectType: 'Pokemon';\n readonly kind: 'Species';\n\n readonly baseStats: T.StatsTable;\n readonly bst: number;\n readonly baseSpecies: T.SpeciesName;\n readonly baseForme: T.FormeName | '';\n readonly forme: T.FormeName | '';\n readonly abilities: T.SpeciesAbility<T.AbilityName | ''>;\n readonly types: [T.TypeName] | [T.TypeName, T.TypeName];\n readonly prevo?: T.SpeciesName | '';\n readonly evos?: T.SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups: T.EggGroup[];\n readonly canHatch: boolean;\n readonly weightkg: number;\n readonly weighthg: number;\n readonly tags: T.SpeciesTag[];\n readonly unreleasedHidden: boolean | 'Past';\n readonly maleOnlyHidden: boolean;\n readonly changesFrom?: T.SpeciesName;\n readonly tier: T.Tier.Singles | T.Tier.Other | 'Illegal';\n readonly doublesTier: T.Tier.Doubles | 'Illegal';\n\n readonly cosmeticFormes?: T.SpeciesName[];\n readonly otherFormes?: T.SpeciesName[];\n readonly formeOrder?: T.SpeciesName[];\n readonly genderRatio: { M: number; F: number };\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: T.SpeciesName | T.SpeciesName[];\n readonly canGigantamax?: T.MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: T.AbilityName;\n readonly requiredItem?: T.ItemName;\n readonly requiredItems?: T.ItemName[];\n readonly requiredMove?: T.MoveName;\n readonly gender?: T.GenderName;\n readonly maxHP?: number;\n readonly evoMove?: T.MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: T.EvoType;\n readonly condition?: Partial<Condition>;\n\n constructor(data: AnyObject) {\n super(data);\n data = this;\n\n this.fullname = `pokemon: ${data.name as string}`;\n this.effectType = 'Pokemon';\n this.kind = 'Species';\n\n this.baseSpecies = data.baseSpecies || data.name;\n this.forme = data.forme || '';\n this.baseForme = data.baseForme || '';\n this.abilities = data.abilities || {0: ''};\n this.types = data.types || ['???'];\n this.prevo = data.prevo || '';\n this.tier = data.tier || '';\n this.doublesTier = data.doublesTier || '';\n this.evos = data.evos || [];\n this.nfe = !!this.evos?.length;\n this.eggGroups = data.eggGroups || [];\n this.canHatch = data.canHatch || false;\n this.genderRatio = data.genderRatio || (this.gender === 'M' ? {M: 1, F: 0}\n : this.gender === 'F' ? {M: 0, F: 1}\n : this.gender === 'N' ? {M: 0, F: 0}\n : {M: 0.5, F: 0.5});\n this.requiredItems =\n this.requiredItems || (this.requiredItem ? [this.requiredItem] : undefined);\n this.baseStats = data.baseStats || {hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0};\n this.bst = this.baseStats.hp + this.baseStats.atk + this.baseStats.def +\n this.baseStats.spa + this.baseStats.spd + this.baseStats.spe;\n this.weightkg = data.weightkg || 0;\n this.weighthg = this.weightkg * 10;\n this.tags = data.tags || [];\n this.unreleasedHidden = data.unreleasedHidden || false;\n this.maleOnlyHidden = !!data.maleOnlyHidden;\n this.isMega = !!(this.forme && ['Mega', 'Mega-X', 'Mega-Y'].includes(this.forme)) || undefined;\n this.gmaxUnreleased = !!data.gmaxUnreleased;\n this.cannotDynamax = !!data.cannotDynamax;\n this.battleOnly = data.battleOnly || (this.isMega ? this.baseSpecies : undefined);\n this.changesFrom = data.changesFrom ||\n (this.battleOnly !== this.baseSpecies ? this.battleOnly : this.baseSpecies);\n if (Array.isArray(data.changesFrom)) this.changesFrom = data.changesFrom[0]; // BUG\n\n if (!this.gen && data.num >= 1) {\n if (this.num >= 906 || this.forme.includes('Paldea')) {\n this.gen = 9;\n } else if (this.num >= 810 || ['Gmax', 'Galar', 'Galar-Zen', 'Hisui'].includes(this.forme)) {\n this.gen = 8;\n } else if (data.num >= 722 || this.forme.startsWith('Alola') || this.forme === 'Starter') {\n this.gen = 7;\n } else if (this.forme === 'Primal') {\n this.gen = 6;\n this.isPrimal = true;\n this.battleOnly = this.baseSpecies;\n } else if (data.num >= 650 || this.isMega) {\n this.gen = 6;\n } else if (data.num >= 494) {\n this.gen = 5;\n } else if (data.num >= 387) {\n this.gen = 4;\n } else if (data.num >= 252) {\n this.gen = 3;\n } else if (data.num >= 152) {\n this.gen = 2;\n } else {\n this.gen = 1;\n }\n }\n }\n}\n\ntype Mutable<T> = {-readonly [P in keyof T]: T[P]};\n\nclass DexSpecies implements T.DexTable<Species> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Species },\n all: undefined as ReadonlyArray<Species> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Species {\n name = name.trim();\n let id = toID(name);\n if (id === 'nidoran' && name.endsWith('♀')) {\n id = 'nidoranf' as T.ID;\n } else if (id === 'nidoran' && name.endsWith('♂')) {\n id = 'nidoranm' as T.ID;\n }\n return this.getByID(id);\n }\n\n getByID(id: T.ID): Species {\n let species: Mutable<Species> | undefined = this.caches.get[id];\n if (species) return species;\n\n const alias = this.dex.data.Aliases[id];\n if (alias) {\n const data = this.dex.data.FormatsData[id];\n if (data) {\n // special event ID, like Rockruff-Dusk\n const baseId = toID(alias);\n species = new Species({\n ...this.dex.data.Species[baseId],\n ...this.dex.data.FormatsData[id],\n name: id,\n });\n species.abilities = {0: species.abilities['S']!};\n } else {\n species = this.get(alias);\n if (species.cosmeticFormes) {\n for (const forme of species.cosmeticFormes) {\n if (toID(forme) === id) {\n species = new Species({\n ...species,\n name: forme,\n id,\n forme: forme.slice(species.name.length + 1),\n baseForme: '',\n baseSpecies: species.name,\n otherFormes: null,\n cosmeticFormes: null,\n });\n break;\n }\n }\n }\n }\n\n if (species?.exists) this.caches.get[id] = species;\n return species;\n }\n\n let data = this.dex.data.Species[id];\n if (id && !data) {\n let aliasTo = '';\n const formeNames: {[k: string]: string[]} = {\n alola: ['a', 'alola', 'alolan'],\n galar: ['g', 'galar', 'galarian'],\n hisui: ['h', 'hisui', 'hisuian'],\n paldea: ['p', 'paldea', 'paldean'],\n mega: ['m', 'mega'],\n primal: ['p', 'primal'],\n };\n for (const forme in formeNames) {\n let pokeName = '';\n for (const i of formeNames[forme]) {\n if (id.startsWith(i)) {\n pokeName = id.slice(i.length);\n } else if (id.endsWith(i)) {\n pokeName = id.slice(0, -i.length);\n }\n }\n if (this.dex.data.Aliases.hasOwnProperty(pokeName)) {\n pokeName = toID(this.dex.data.Aliases[pokeName]);\n }\n if (this.dex.data.Species[pokeName + forme]) {\n aliasTo = pokeName + forme;\n break;\n }\n }\n if (aliasTo) {\n species = this.get(aliasTo);\n if (species.exists) {\n this.caches.get[id] = species;\n return species;\n }\n }\n }\n\n data = this.dex.data.Species[id];\n\n if (id && data) {\n const tags = data.baseSpecies && this.dex.data.Species[toID(data.baseSpecies)].tags;\n species = new Species({tags, ...data, ...this.dex.data.FormatsData[id]});\n if (!species.tier && !species.doublesTier && species.baseSpecies !== species.name) {\n if (species.baseSpecies === 'Mimikyu') {\n (species as any).tier =\n this.dex.data.FormatsData[toID(species.baseSpecies)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[toID(species.baseSpecies)].doublesTier || 'Illegal';\n } else if (species.id.endsWith('totem')) {\n (species as any).tier =\n this.dex.data.FormatsData[species.id.slice(0, -5)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[species.id.slice(0, -5)].doublesTier || 'Illegal';\n } else if (species.battleOnly) {\n (species as any).tier =\n this.dex.data.FormatsData[toID(species.battleOnly)].tier || 'Illegal';\n (species as any).doublesTier =\n this.dex.data.FormatsData[toID(species.battleOnly)].doublesTier || 'Illegal';\n } else {\n const baseFormatsData = this.dex.data.FormatsData[toID(species.baseSpecies)];\n if (!baseFormatsData) {\n throw new Error(`${species.baseSpecies} has no formats-data entry`);\n }\n (species as any).tier = baseFormatsData.tier || 'Illegal';\n (species as any).doublesTier = baseFormatsData.doublesTier || 'Illegal';\n }\n }\n if (!species.tier) species.tier = 'Illegal';\n if (!species.doublesTier) species.doublesTier = species.tier as any;\n if (species.gen > this.dex.gen) {\n species.tier = 'Illegal';\n species.doublesTier = 'Illegal';\n species.isNonstandard = 'Future';\n }\n species.nfe = !!(species.evos?.length && this.get(species.evos[0]).gen <= this.dex.gen);\n species.canHatch = species.canHatch ||\n (!['Ditto', 'Undiscovered'].includes(\n species.eggGroups[0]\n ) && !species.prevo && species.name !== 'Manaphy');\n if (this.dex.gen === 1) species.bst -= species.baseStats.spd;\n if (this.dex.gen < 5) delete species.abilities['H'];\n } else {\n species = new Species({\n id, name: id,\n exists: false, tier: 'Illegal', doublesTier: 'Illegal', isNonstandard: 'Custom',\n });\n }\n\n if (species.exists) this.caches.get[id] = species;\n return species;\n }\n\n all(): readonly Species[] {\n if (this.caches.all) return this.caches.all;\n const species = [];\n for (const id in this.dex.data.Species) {\n species.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = species);\n }\n}\n\nexport class Learnset implements T.Learnset {\n readonly effectType: 'Learnset';\n readonly kind: 'Learnset';\n readonly learnset?: { [moveid: string]: T.MoveSource[] };\n readonly eventOnly: boolean;\n readonly eventData?: T.EventInfo[];\n readonly encounters?: T.EventInfo[];\n readonly exists: boolean;\n\n constructor(data: AnyObject) {\n this.effectType = 'Learnset';\n this.kind = 'Learnset';\n this.learnset = data.learnset || undefined;\n this.eventOnly = !!data.eventOnly;\n this.eventData = data.eventData || undefined;\n this.encounters = data.encounters || undefined;\n this.exists = data.exists ?? true;\n }\n}\n\nclass DexLearnsets {\n readonly dex: ModdedDex;\n readonly cache = Object.create(null) as { [id: string]: Learnset };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n async get(name: string): Promise<Learnset> {\n return this.getByID(toID(name));\n }\n\n async getByID(id: T.ID): Promise<Learnset> {\n let learnset = this.cache[id];\n if (learnset) return learnset;\n\n if (!DATA.Learnsets) {\n try {\n DATA.Learnsets = (await import('./data/learnsets.json')).default as Data<T.LearnsetData>;\n } catch (err) {\n // @ts-ignore If we're being used via a <script> tag we depend on Learnsets being required\n DATA.Learnsets = (window as any).pkmn?.learnsets as Data<T.LearnsetData>;\n if (!DATA.Learnsets) throw new Error('Learnsets have not been included!');\n }\n }\n this.dex.load('Learnsets', this.dex.modData);\n this.dex.modData = undefined;\n\n const data = this.dex.data.Learnsets![id];\n if (id && data) {\n learnset = new Learnset(data);\n } else {\n learnset = new Learnset({exists: false});\n }\n if (learnset.exists) this.cache[id] = learnset;\n return learnset;\n }\n}\n\nexport class Type implements T.Type {\n readonly id: T.ID;\n readonly name: T.TypeName;\n readonly effectType: 'Type';\n readonly kind: 'Type';\n readonly exists: boolean;\n readonly gen: T.GenerationNum;\n readonly isNonstandard: T.Nonstandard | null;\n readonly damageTaken: { [t in Exclude<T.TypeName, '???'>]: number } & { [key: string]: number };\n readonly HPivs: Partial<T.StatsTable>;\n readonly HPdvs: Partial<T.StatsTable>;\n\n constructor(data: AnyObject) {\n this.exists = true;\n Object.assign(this, data);\n\n this.effectType = 'Type';\n this.kind = 'Type';\n this.id = data.id;\n this.name = data.name;\n this.exists = !!(this.exists && this.id);\n this.gen = data.gen || 0;\n this.isNonstandard = data.isNonstandard || null;\n this.damageTaken = data.damageTaken || {};\n this.HPivs = data.HPivs || {};\n this.HPdvs = data.HPdvs || {};\n }\n\n toString() {\n return this.name;\n }\n}\n\nclass DexTypes implements T.DexTable<Type> {\n readonly dex: ModdedDex;\n readonly caches = {\n get: Object.create(null) as { [id: string]: Type },\n all: undefined as ReadonlyArray<Type> | undefined,\n names: undefined as ReadonlyArray<string> | undefined,\n };\n\n constructor(dex: ModdedDex) {\n this.dex = dex;\n }\n\n get(name: string): Type {\n if (name && typeof name !== 'string') return name;\n return this.getByID(toID(name));\n }\n\n getByID(id: T.ID): Type {\n const alias = this.dex.data.Aliases[id];\n if (alias) id = toID(alias);\n\n let type = this.caches.get[id];\n if (type) return type;\n\n const typeName = id.charAt(0).toUpperCase() + id.substr(1) as Exclude<T.TypeName, '???'>;\n const data = this.dex.data.Types[id];\n if (typeName && data) {\n type = new Type({name: typeName, id, ...data});\n } else {\n type = new Type({name: typeName, id, exists: false});\n }\n\n if (type.exists) this.caches.get[id] = type;\n return type;\n }\n\n names(): readonly string[] {\n if (this.caches.names) return this.caches.names;\n this.caches.names = this.all().filter(type => !type.isNonstandard).map(type => type.name);\n return this.caches.names;\n }\n\n isName(name: string): boolean {\n const id = name.toLowerCase();\n const typeName = id.charAt(0).toUpperCase() + id.substr(1);\n return name === typeName && this.dex.data.Types.hasOwnProperty(id);\n }\n\n all(): readonly Type[] {\n if (this.caches.all) return this.caches.all;\n const types = [];\n for (const id in this.dex.data.Types) {\n types.push(this.getByID(id as T.ID));\n }\n return (this.caches.all = types);\n }\n}\n\nconst STATS: readonly T.StatID[] = ['hp', 'atk', 'def', 'spa', 'spd', 'spe'];\n\nclass DexStats {\n readonly shortNames: {readonly [k in T.StatID]: string};\n readonly mediumNames: {readonly [k in T.StatID]: string};\n readonly names: {readonly [k in T.StatID]: string};\n\n constructor(dex: ModdedDex) {\n if (dex.gen !== 1) {\n this.shortNames = {\n __proto__: null,\n hp: 'HP', atk: 'Atk', def: 'Def',\n spa: 'SpA', spd: 'SpD', spe: 'Spe',\n } as any;\n this.mediumNames = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Sp. Atk', spd: 'Sp. Def', spe: 'Speed',\n } as any;\n this.names = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special Attack', spd: 'Special Defense', spe: 'Speed',\n } as any;\n } else {\n this.shortNames = {\n __proto__: null,\n hp: 'HP', atk: 'Atk', def: 'Def',\n spa: 'Spc', spd: '[SpD]', spe: 'Spe',\n } as any;\n this.mediumNames = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special', spd: '[Sp. Def]', spe: 'Speed',\n } as any;\n this.names = {\n __proto__: null,\n hp: 'HP', atk: 'Attack', def: 'Defense',\n spa: 'Special', spd: '[Special Defense]', spe: 'Speed',\n } as any;\n }\n }\n\n ids(): typeof STATS {\n return STATS;\n }\n}\n\n// #endregion\n\n// #region Dex\n\ntype Data<T> = { 9: { [id: string]: T } } & {\n [num in Exclude<T.GenerationNum, 9>]?: { [id: string]: { inherit?: boolean } & T.DeepPartial<T> }\n};\n\nconst DATA = {\n Abilities: AbilitiesJSON as Data<T.AbilityData>,\n Aliases: AliasesJSON as { [id: string]: string },\n Conditions: ConditionsJSON as Data<T.ConditionData>,\n Items: ItemsJSON as Data<T.ItemData>,\n Moves: MovesJSON as unknown as Data<T.MoveData>,\n Species: SpeciesJSON as Data<T.SpeciesData>,\n Natures: NaturesJSON as Data<T.NatureData>,\n Learnsets: null! as Data<T.LearnsetData>,\n Types: TypesJSON as Data<T.TypeData>,\n FormatsData: FormatsDataJSON as Data<FormatData>,\n};\n\nconst HP_TYPES: T.HPTypeName[] = [\n 'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel',\n 'Fire', 'Water', 'Grass', 'Electric', 'Psychic', 'Ice', 'Dragon', 'Dark',\n];\n\nconst GEN_IDS = ['gen1', 'gen2', 'gen3', 'gen4', 'gen5', 'gen6', 'gen7', 'gen8', 'gen9'] as const;\ntype GenID = typeof GEN_IDS[number];\nconst CURRENT_GEN_ID: GenID = GEN_IDS[8];\n\nconst dexes: { [mod: string]: ModdedDex } = Object.create(null);\n\nexport type ModData = T.DeepPartial<ModdedDex['data']> & T.ModData;\n\nexport class ModdedDex implements T.Dex {\n static readonly STATS: ReadonlyArray<T.StatID> = ['hp', 'atk', 'def', 'spa', 'spd', 'spe'];\n\n readonly gen: T.GenerationNum;\n readonly modid: T.ID;\n readonly data!: {\n Abilities: { [id: string]: T.AbilityData };\n Aliases: { [id: string]: string };\n Conditions: { [id: string]: T.ConditionData };\n FormatsData: { [id: string]: FormatData };\n Items: { [id: string]: T.ItemData };\n Learnsets: null | { [id: string]: T.LearnsetData };\n Moves: { [id: string]: T.MoveData };\n Natures: { [id: string]: T.NatureData };\n Species: { [id: string]: T.SpeciesData };\n Types: { [id: string]: T.TypeData };\n };\n\n readonly abilities: DexAbilities;\n readonly conditions: DexConditions;\n readonly items: DexItems;\n readonly learnsets: DexLearnsets;\n readonly moves: DexMoves;\n readonly natures: DexNatures;\n readonly species: DexSpecies;\n readonly stats: DexStats;\n readonly types: DexTypes;\n\n /* private */ modData?: ModData = undefined;\n\n constructor(modid = CURRENT_GEN_ID as GenID | T.ID, modData?: ModData) {\n const isGen = (GEN_IDS as unknown as Array<GenID | T.ID>).includes(modid);\n if (!isGen && !modData) throw new Error(`Must provide mod data with mod '${modid}'`);\n this.modid = modid as T.ID;\n this.gen = parseInt((modData?.Scripts?.inherit ?? modid).slice(3)) as T.GenerationNum || 9;\n this.loadData(modData);\n\n this.abilities = new DexAbilities(this);\n this.conditions = new DexConditions(this);\n this.items = new DexItems(this);\n this.learnsets = new DexLearnsets(this);\n this.moves = new DexMoves(this);\n this.natures = new DexNatures(this);\n this.species = new DexSpecies(this);\n this.stats = new DexStats(this);\n this.types = new DexTypes(this);\n }\n\n mod(genid: GenID): ModdedDex;\n mod(modid: T.ID, modData: ModData): ModdedDex;\n mod(modid: GenID | T.ID, modData?: ModData) {\n if (modid in dexes) return modData ? new ModdedDex(modid, modData) : dexes[modid];\n return (dexes[modid] = new ModdedDex(modid as T.ID, modData));\n }\n\n forGen(gen: number) {\n if (gen < 1 || gen > 9) throw new Error(`Unsupported gen ${gen}`);\n return this.mod(`gen${gen}` as GenID);\n }\n\n getImmunity(\n source: { type: string } | string,\n target: { getTypes: () => string[] } | { types: string[] } | string[] | string\n ): boolean {\n const sourceType: string = typeof source !== 'string' ? source.type : source;\n // @ts-ignore\n const targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n if (Array.isArray(targetTyping)) {\n for (const type of targetTyping) {\n if (!this.getImmunity(sourceType, type)) return false;\n }\n return true;\n }\n const typeData = this.types.get(targetTyping as Exclude<T.TypeName, '???'>);\n if (typeData && typeData.damageTaken[sourceType] === 3) return false;\n return true;\n }\n\n getEffectiveness(\n source: { type: string } | string,\n target: { getTypes: () => string[] } | { types: string[] } | string[] | string\n ): number {\n const sourceType: string = typeof source !== 'string' ? source.type : source;\n // @ts-ignore\n const targetTyping: string[] | string = target.getTypes?.() || target.types || target;\n let totalTypeMod = 0;\n if (Array.isArray(targetTyping)) {\n for (const type of targetTyping) {\n totalTypeMod += this.getEffectiveness(sourceType, type);\n }\n return totalTypeMod;\n }\n const typeData = this.types.get(targetTyping as Exclude<T.TypeName, '???'>);\n if (!typeData) return 0;\n switch (typeData.damageTaken[sourceType]) {\n case 1: return 1; // super-effective\n case 2: return -1; // resist\n // in case of weird situations like Gravity, immunity is handled elsewhere\n default: return 0;\n }\n }\n\n getHiddenPower(ivs: T.StatsTable) {\n const tr = (num: number, bits = 0) => {\n if (bits) return (num >>> 0) % (2 ** bits);\n return num >>> 0;\n };\n const stats = {hp: 31, atk: 31, def: 31, spe: 31, spa: 31, spd: 31};\n if (this.gen <= 2) {\n // Gen 2 specific Hidden Power check. IVs are still treated 0-31 so we get them 0-15\n const atkDV = tr(ivs.atk / 2);\n const defDV = tr(ivs.def / 2);\n const speDV = tr(ivs.spe / 2);\n const spcDV = tr(ivs.spa / 2);\n return {\n type: HP_TYPES[4 * (atkDV % 4) + (defDV % 4)],\n power: tr(\n (5 * ((spcDV >> 3) +\n (2 * (speDV >> 3)) +\n (4 * (defDV >> 3)) +\n (8 * (atkDV >> 3))) +\n (spcDV % 4)) / 2 + 31\n ),\n };\n } else {\n // Hidden Power check for Gen 3 onwards\n let hpTypeX = 0;\n let hpPowerX = 0;\n let i = 1;\n for (const s in stats) {\n hpTypeX += i * (ivs[s as T.StatID] % 2);\n hpPowerX += i * (tr(ivs[s as T.StatID] / 2) % 2);\n i *= 2;\n }\n return {\n type: HP_TYPES[tr(hpTypeX * 15 / 63)],\n // After Gen 6, Hidden Power is always 60 base power\n power: (this.gen && this.gen < 6) ? tr(hpPowerX * 40 / 63) + 30 : 60,\n };\n }\n }\n\n includeModData() {\n return this;\n }\n\n includeData() {\n return this;\n }\n\n includeFormats() {\n return this;\n }\n\n loadData(modData?: ModData) {\n if (this.data) return this.data;\n (this.data as any) = {} as ModdedDex['data'];\n\n for (const t in DATA) {\n const type = t as keyof typeof DATA;\n if (type === 'Learnsets') {\n this.modData = modData;\n continue; // async\n }\n if (type === 'Aliases') {\n (this.data as any)[type] = DATA[type];\n continue;\n }\n this.load(type, modData);\n }\n return this.data;\n }\n\n load(type: Exclude<keyof ModdedDex['data'], 'Aliases'>, modData?: ModData) {\n if (this.data[type]) return;\n\n const d = modData ? modData[type] : DATA[type][this.gen];\n if (d !== this.data[type]) this.data[type] = ({...d, ...this.data[type]}) as any;\n\n if (this.modid === CURRENT_GEN_ID) return;\n\n const parentDex = modData?.Scripts?.inherit\n ? this.mod(modData.Scripts.inherit)\n : this.forGen(modData ? this.gen : this.gen + 1 as T.GenerationNum);\n if (type === 'Learnsets') parentDex.load('Learnsets');\n\n const parentDataType = parentDex.data[type];\n const childDataType = this.data[type] || (this.data[type] = {} as any);\n for (const e in parentDataType) {\n const entry = e as keyof typeof parentDataType;\n if (childDataType[entry] === null) {\n // null means don't inherit\n delete childDataType[entry];\n } else if (!(entry in childDataType)) {\n // If it doesn't exist it's inherited from the parent data\n if (type === 'Species') {\n // Species entries can be modified too many different ways\n // e.g. inheriting different formats-data/learnsets\n childDataType[entry] = deepClone(parentDataType[entry]);\n } else {\n childDataType[entry] = parentDataType[entry];\n }\n } else if (childDataType[entry]?.inherit) {\n // {inherit: true} can be used to modify only parts of the parent data,\n // instead of overwriting entirely\n delete childDataType[entry].inherit;\n // Merge parent into children entry, preserving existing childs' properties.\n for (const key in parentDataType[entry]) {\n if (key in childDataType[entry]) continue;\n (childDataType[entry])[key] = (parentDataType[entry] as any)[key];\n }\n }\n }\n }\n}\n\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\nfunction getGen3Category(type: T.TypeName) {\n return SPECIAL.includes(type) ? 'Special' : 'Physical';\n}\n\nfunction deepClone(obj: any): any {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Array.isArray(obj)) return obj.map(prop => deepClone(prop));\n const clone = Object.create(Object.getPrototypeOf(obj));\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone(obj[key]);\n }\n return clone;\n}\n\n// #endregion\n\ndexes[CURRENT_GEN_ID] = new ModdedDex(CURRENT_GEN_ID);\nexport const Dex = dexes[CURRENT_GEN_ID];\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n // BasicEffect,\n // Condition,\n // Ability,\n // Item,\n // Move,\n // Species,\n EventInfo,\n // Learnset,\n // Type,\n // Nature,\n GenID,\n // Dex,\n} from '@pkmn/dex-types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","names":["data","tr"]}