From 5566a8b5e844a4d853acf79a43bf94c579bdb9ac Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 15 Sep 2024 15:19:54 +0300 Subject: [PATCH 01/18] clicking on the minimap moves the camera --- Assets/Scripts/Gui/activeGameState.lua | 9 ++++++++ Assets/Scripts/Gui/main.lua | 3 ++- CMakeLists.txt | 2 +- concreteGuiManager.cpp | 4 ++++ concreteGuiManager.h | 3 ++- minimapButton.cpp | 31 ++++++++++++++++++++++++++ minimapButton.h | 22 ++++++++++++++++++ 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 minimapButton.cpp create mode 100644 minimapButton.h diff --git a/Assets/Scripts/Gui/activeGameState.lua b/Assets/Scripts/Gui/activeGameState.lua index 07aa28c..3db570f 100644 --- a/Assets/Scripts/Gui/activeGameState.lua +++ b/Assets/Scripts/Gui/activeGameState.lua @@ -2,6 +2,7 @@ res = graphics.resolution Size = {x = 70, y = 70} sz = 210 s = 40 +minimapSize = {x = 200, y = 200} resTextScale = {x = .5, y = .5} resIconBasePath = 'Icons/Resources/' pointerTex = 'pointer.png' @@ -9,6 +10,14 @@ attackTex = 'attack.png' garrisonTex = 'garrison.png' gui = { + { + guiType = GuiType.BUTTON, + buttonType = ButtonType.MINIMAP, + name = 'minimap', + pos = {x = res.x - minimapSize.x, y = 0, z = 0}, + size = minimapSize, + color = {x = .5, y = .5, z = .5, w = 1} + }, { guiType = GuiType.TEXT, name = 'refineds', diff --git a/Assets/Scripts/Gui/main.lua b/Assets/Scripts/Gui/main.lua index bf9ba09..9075486 100644 --- a/Assets/Scripts/Gui/main.lua +++ b/Assets/Scripts/Gui/main.lua @@ -37,7 +37,8 @@ ButtonType = { PLAYER_TRADE = 33, TRADING_SCREEN = 34, TRADE_OFFER = 35, - RESOURCE_AMMOUNT = 36 + RESOURCE_AMMOUNT = 36, + MINIMAP = 37 } ListboxType = { diff --git a/CMakeLists.txt b/CMakeLists.txt index a6b8bf0..a7a592d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ set(OPTIONS_BUTTONS optionsButton.cpp tabButton.cpp okButton.cpp defaultsButton. set(TRADING_BUTTONS playerTradeButton.cpp tradingScreenButton.cpp offerButton.cpp resourceAmmountButton.cpp) set(MENU_BUTTONS mainMenuButton.cpp singlePlayerButton.cpp exitButton.cpp backButton.cpp playButton.cpp) set(MAP_EDITOR_BUTTONS mapEditorButton.cpp newMapButton.cpp loadMapButton.cpp exportButton.cpp) -set(BUTTONS statsButton.cpp activeStateButton.cpp ${TRADING_BUTTONS} ${OPTIONS_BUTTONS} ${MENU_BUTTONS} ${MAP_EDITOR_BUTTONS} ${UNIT_BUTTONS}) +set(BUTTONS statsButton.cpp activeStateButton.cpp minimapButton.cpp ${TRADING_BUTTONS} ${OPTIONS_BUTTONS} ${MENU_BUTTONS} ${MAP_EDITOR_BUTTONS} ${UNIT_BUTTONS}) set(LISTBOXES skyboxTextureListbox.cpp landTextureListbox.cpp gameObjectListbox.cpp) set(GUI tooltip.cpp concreteGuiManager.cpp ${BUTTONS} ${LISTBOXES}) diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index dd7e8c6..cd1c837 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -31,6 +31,7 @@ #include "tradingScreenButton.h" #include "offerButton.h" #include "resourceAmmountButton.h" +#include "minimapButton.h" namespace battleship{ using namespace std; @@ -261,6 +262,9 @@ namespace battleship{ case RESOURCE_AMMOUNT: button = new ResourceAmmountButton(pos, size, name, (int)guiTable["ammount"], (int)guiTable["trigger"], imagePath); break; + case MINIMAP: + button = new MinimapButton(pos, size, ""); + break; } int typeArr[2]{(int)GuiElementType::BUTTON, (int)type}; diff --git a/concreteGuiManager.h b/concreteGuiManager.h index bc6c8e4..36b3340 100644 --- a/concreteGuiManager.h +++ b/concreteGuiManager.h @@ -51,7 +51,8 @@ namespace battleship{ PLAYER_TRADE, TRADING_SCREEN, TRADE_OFFER, - RESOURCE_AMMOUNT + RESOURCE_AMMOUNT, + MINIMAP }; enum ListboxType { CONTROLS, diff --git a/minimapButton.cpp b/minimapButton.cpp new file mode 100644 index 0000000..c8a4f1d --- /dev/null +++ b/minimapButton.cpp @@ -0,0 +1,31 @@ +#include "minimapButton.h" +#include "map.h" + +#include + +namespace battleship{ + using namespace vb01; + using namespace std; + + MinimapButton::MinimapButton(Vector3 pos, Vector2 size, string ip) : Button(pos, size, "minimap", "", -1, true, ip){ + content = new Node(); + rectNode->attachChild(content); + } + + MinimapButton::~MinimapButton(){ + } + + void MinimapButton::update(){ + Button::update(); + } + + void MinimapButton::onClick(){ + Vector2 clickPos = getCursorPos(); + float posXRatio = (clickPos.x - pos.x) / size.x; + float posYRatio = (clickPos.y - pos.y) / size.y; + + Camera *cam = Root::getSingleton()->getCamera(); + Vector3 mapSize = Map::getSingleton()->getMapSize(); + cam->setPosition(Vector3(mapSize.x * (-.5 + posXRatio), cam->getPosition().y, mapSize.z * (-.5 + posYRatio))); + } +} diff --git a/minimapButton.h b/minimapButton.h new file mode 100644 index 0000000..1f12ca9 --- /dev/null +++ b/minimapButton.h @@ -0,0 +1,22 @@ +#ifndef MINIMAP_BUTTON_H +#define MINIMAP_BUTTON_H + +#include + +namespace vb01{ + class Node; +} + +namespace battleship{ + class MinimapButton : public vb01Gui::Button{ + public: + MinimapButton(vb01::Vector3, vb01::Vector2, std::string); + ~MinimapButton(); + void onClick(); + void update(); + private: + vb01::Node *content = nullptr; + }; +} + +#endif From 7ca58f95b6c2b77a90f2d0818c88254d98aceca1 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 15 Sep 2024 17:01:23 +0300 Subject: [PATCH 02/18] exportable and readable minimap images --- concreteGuiManager.cpp | 7 +++++-- map.cpp | 5 ++++- mapEditorAppState.cpp | 26 ++++++++++++++++++++++++++ mapEditorAppState.h | 1 + 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index cd1c837..563b87b 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -56,6 +56,7 @@ namespace battleship{ //TODO refactor player difficulty and faction listbox selection //TODO remove hardcoded font path values + //TODO use configurable map path values Button* ConcreteGuiManager::parseButton(int guiId){ sol::state_view SOL_LUA_STATE = generateView(); sol::table guiTable = SOL_LUA_STATE["gui"][guiId + 1]; @@ -262,9 +263,11 @@ namespace battleship{ case RESOURCE_AMMOUNT: button = new ResourceAmmountButton(pos, size, name, (int)guiTable["ammount"], (int)guiTable["trigger"], imagePath); break; - case MINIMAP: - button = new MinimapButton(pos, size, ""); + case MINIMAP:{ + string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + Map::getSingleton()->getMapName() + "/minimap.jpg"; + button = new MinimapButton(pos, size, minimapPath); break; + } } int typeArr[2]{(int)GuiElementType::BUTTON, (int)type}; diff --git a/map.cpp b/map.cpp index b8224d9..b2042ad 100755 --- a/map.cpp +++ b/map.cpp @@ -314,7 +314,10 @@ namespace battleship{ preprareScene(); if(!empty){ - SOL_LUA_STATE.script_file(path + "Models/Maps/" + mapName + "/" + mapName + ".lua"); + string mapDir = path + "Models/Maps/" + mapName + "/"; + AssetManager::getSingleton()->load(mapDir + "minimap.jpg"); + + SOL_LUA_STATE.script_file(mapDir + mapName + ".lua"); sol::optional lightsOpt = SOL_LUA_STATE[mapTable]["lights"]; if(lightsOpt != sol::nullopt) diff --git a/mapEditorAppState.cpp b/mapEditorAppState.cpp index 1fba0f7..5731ed6 100644 --- a/mapEditorAppState.cpp +++ b/mapEditorAppState.cpp @@ -19,6 +19,9 @@ #include #include +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "external/vb01/external/stb/stb_image_write.h" + #include #include @@ -62,6 +65,8 @@ namespace battleship{ } else{ int numPlayers = map->getNumSpawnPoints(); + int numVerts = 3 * map->getNodeParent()->getChild(0)->getMesh(0)->getMeshBase().numTris; + oldLandmassVertHeights = new float[numVerts]; for(int i = 0; i < numPlayers; i++) game->addPlayer(new Player(0, 0, 0, Vector3(1, 1, 1))); @@ -390,6 +395,26 @@ namespace battleship{ return cells; } + void MapEditorAppState::MapEditor::generateMinimap(string mapFolder){ + Vector3 mapSize = map->getMapSize(), cellSize = map->getCellSize(); + int width = int(mapSize.x / cellSize.x); + int height = int(mapSize.z / cellSize.z); + int numChannels = 3; + int size = width * height * numChannels; + int cellId = 0; + + u8 *imgData = new u8[size]; + + for(u8 *p = imgData; p != imgData + size; p+= numChannels, cellId++){ + Vector3 color = (map->getCells()[cellId].type == Map::Cell::Type::WATER ? Vector3::VEC_K : Vector3::VEC_J); + *p = color.x * 255.f; + *(p + 1) = color.y * 255.f; + *(p + 2) = color.z * 255.f; + } + + stbi_write_jpg(string(mapFolder + "minimap.jpg").c_str(), width, height, numChannels, imgData, 100); + } + void MapEditorAppState::MapEditor::generateMapScript(){ int numWaterBodies = map->getNodeParent()->getNumChildren() - 1; vector players = Game::getSingleton()->getPlayers(); @@ -544,6 +569,7 @@ namespace battleship{ copy_file(assetsPath + DEFAULT_TEXTURE, mapFolder + map->getMapName() + ".jpg"); generateLandmassXml(); + generateMinimap(mapFolder); generateMapScript(); } diff --git a/mapEditorAppState.h b/mapEditorAppState.h index c89c965..5674eea 100644 --- a/mapEditorAppState.h +++ b/mapEditorAppState.h @@ -60,6 +60,7 @@ namespace battleship{ void toggleSelection(vb01::Node*, bool); std::vector generateMapCells(); void generateLandmassXml(); + void generateMinimap(std::string); void generateMapScript(); void prepareTerrainObject(vb01::u32**, Map::Cell*, int[3], float, bool); From 8f322d8b2a238769d8b586a69519df3a4ec8bdbf Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 19 Sep 2024 19:46:44 +0300 Subject: [PATCH 03/18] transfered old minimap image data --- activeGameState.cpp | 11 +++++++++++ activeGameState.h | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/activeGameState.cpp b/activeGameState.cpp index 5d01910..054de0d 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include @@ -43,6 +45,15 @@ namespace battleship{ initDragbox(); mainPlayer = Game::getSingleton()->getPlayer(playerId); + + string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + Map::getSingleton()->getMapName() + "/minimap.jpg"; + ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(minimapPath); + int imgSize = asset->width * asset->height * asset->numChannels; + + oldImageData = new u8[imgSize]; + + for(int i = 0; i < imgSize; i++) + oldImageData[i] = asset->image[i]; } ActiveGameState::~ActiveGameState() { diff --git a/activeGameState.h b/activeGameState.h index 9036086..0f94ed5 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -6,6 +6,8 @@ #include "map.h" #include "unit.h" +#include + namespace vb01{ class Node; class Texture; @@ -32,6 +34,7 @@ namespace battleship{ inline std::vector getButtons(){return buttons;} inline Player* getPlayer(){return mainPlayer;} inline std::vector& getUnitGroup(int i){return unitGroups[i];} + inline u8 *getOldMinimapImage(){return oldImageData;} private: enum CursorState{ NORMAL, @@ -74,6 +77,7 @@ namespace battleship{ vb01::s64 lastLeftMouseClicked = 0; vb01::Node *cursorNode = nullptr; vb01::Texture *pointerTex = nullptr, *attackTex = nullptr, *garrisonTex = nullptr; + vb01::u8 *oldImageData = nullptr; }; } From 55b0233aad69cda5e495fe7163a38d7fbede78dd Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 19 Sep 2024 19:47:06 +0300 Subject: [PATCH 04/18] rendering fog of war and units on the minimap --- minimapButton.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/minimapButton.cpp b/minimapButton.cpp index c8a4f1d..617847e 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -1,7 +1,18 @@ #include "minimapButton.h" +#include "activeGameState.h" +#include "game.h" #include "map.h" +#include + #include +#include +#include +#include +#include + +#include +#include namespace battleship{ using namespace vb01; @@ -17,6 +28,89 @@ namespace battleship{ void MinimapButton::update(){ Button::update(); + + Material *mat = rectNode->getMesh(0)->getMaterial(); + Texture *tex = ((Material::TextureUniform*)mat->getUniform("diffuseMap"))->value; + ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(imagePath); + int width = asset->width, height = asset->height, numChannels = asset->numChannels; + + Vector3 mapSize = Map::getSingleton()->getMapSize(); + vector> unitMinimapPos; + + for(Player *pl : Game::getSingleton()->getPlayers()) + for(Unit *un : pl->getUnits()){ + Vector2 coords = Vector2( + int(un->getPos().x / mapSize.x * width) - .5 * width, + int(un->getPos().z / mapSize.z * height) - .5 * height + ); + + unitMinimapPos.push_back(make_pair(un, coords)); + } + + ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE); + Player *mainPlayer = activeState->getPlayer(); + vector units = mainPlayer->getUnits(); + + int size = width * height * numChannels; + int pxId = 0, numIter = 0; + + u8 *oldImageData = activeState->getOldMinimapImage(); + + for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ + Vector2 coords = Vector2( + numIter % asset->width - .5 * asset->width, + numIter / asset->width - .5 * asset->height + ); + float losFactor = .6, pxCol[3]{ + losFactor * oldImageData[pxId + 0], + losFactor * oldImageData[pxId + 1], + losFactor * oldImageData[pxId + 2] + }; + + for(pair unitPair : unitMinimapPos){ + if(unitPair.first->getPlayer() == mainPlayer && unitPair.second == coords){ + Vector3 plCol = mainPlayer->getColor(); + pxCol[0] = plCol.x * 255; + pxCol[1] = plCol.y * 255; + pxCol[2] = plCol.z * 255; + break; + } + + float minimapLos = unitPair.first->getLineOfSight() / mapSize.x * width; + + if(unitPair.first->getPlayer() == mainPlayer && coords.getDistanceFrom(unitPair.second) < minimapLos){ + bool foreignUnit = false; + Player *pl = nullptr; + + for(pair up : unitMinimapPos) + if(up.first->getPlayer() != mainPlayer && up.second == coords){ + foreignUnit = true; + pl = up.first->getPlayer(); + break; + } + + if(foreignUnit){ + Vector3 plCol = pl->getColor(); + pxCol[0] = plCol.x * 255; + pxCol[1] = plCol.y * 255; + pxCol[2] = plCol.z * 255; + } + else{ + pxCol[0] = oldImageData[pxId + 0]; + pxCol[1] = oldImageData[pxId + 1]; + pxCol[2] = oldImageData[pxId + 2]; + } + + break; + } + } + + *p = pxCol[0]; + *(p + 1) = pxCol[1]; + *(p + 2) = pxCol[2]; + } + + tex->loadImageData(asset); } void MinimapButton::onClick(){ From f41f49c1f680b5ef81c423f4d66130af16cd89e7 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 20 Sep 2024 20:00:25 +0300 Subject: [PATCH 05/18] corrected pixel positions --- minimapButton.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/minimapButton.cpp b/minimapButton.cpp index 617847e..724a3d6 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -40,8 +40,8 @@ namespace battleship{ for(Player *pl : Game::getSingleton()->getPlayers()) for(Unit *un : pl->getUnits()){ Vector2 coords = Vector2( - int(un->getPos().x / mapSize.x * width) - .5 * width, - int(un->getPos().z / mapSize.z * height) - .5 * height + int(un->getPos().x / mapSize.x * width), + int(un->getPos().z / mapSize.z * height) ); unitMinimapPos.push_back(make_pair(un, coords)); @@ -58,7 +58,7 @@ namespace battleship{ for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ Vector2 coords = Vector2( - numIter % asset->width - .5 * asset->width, + -(numIter % asset->width - .5 * asset->width), numIter / asset->width - .5 * asset->height ); float losFactor = .6, pxCol[3]{ @@ -115,8 +115,8 @@ namespace battleship{ void MinimapButton::onClick(){ Vector2 clickPos = getCursorPos(); - float posXRatio = (clickPos.x - pos.x) / size.x; - float posYRatio = (clickPos.y - pos.y) / size.y; + float posXRatio = 1. - (clickPos.x - pos.x) / size.x; + float posYRatio = 1. - (clickPos.y - pos.y) / size.y; Camera *cam = Root::getSingleton()->getCamera(); Vector3 mapSize = Map::getSingleton()->getMapSize(); From bcca1400557340d9715b3162fb3cf942816d605e Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 20 Sep 2024 20:31:30 +0300 Subject: [PATCH 06/18] corrected foreign unit minimap display --- minimapButton.cpp | 20 +++++++++++--------- minimapButton.h | 1 - 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/minimapButton.cpp b/minimapButton.cpp index 724a3d6..bf5f23c 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -18,13 +18,9 @@ namespace battleship{ using namespace vb01; using namespace std; - MinimapButton::MinimapButton(Vector3 pos, Vector2 size, string ip) : Button(pos, size, "minimap", "", -1, true, ip){ - content = new Node(); - rectNode->attachChild(content); - } + MinimapButton::MinimapButton(Vector3 pos, Vector2 size, string ip) : Button(pos, size, "minimap", "", -1, true, ip){} - MinimapButton::~MinimapButton(){ - } + MinimapButton::~MinimapButton(){} void MinimapButton::update(){ Button::update(); @@ -55,6 +51,7 @@ namespace battleship{ int pxId = 0, numIter = 0; u8 *oldImageData = activeState->getOldMinimapImage(); + int unitPxRadius = 1; for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ Vector2 coords = Vector2( @@ -68,7 +65,9 @@ namespace battleship{ }; for(pair unitPair : unitMinimapPos){ - if(unitPair.first->getPlayer() == mainPlayer && unitPair.second == coords){ + Vector2 coordDiff = unitPair.second - coords; + + if(unitPair.first->getPlayer() == mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ Vector3 plCol = mainPlayer->getColor(); pxCol[0] = plCol.x * 255; pxCol[1] = plCol.y * 255; @@ -82,12 +81,15 @@ namespace battleship{ bool foreignUnit = false; Player *pl = nullptr; - for(pair up : unitMinimapPos) - if(up.first->getPlayer() != mainPlayer && up.second == coords){ + for(pair up : unitMinimapPos){ + Vector2 coordDiff = up.second - coords; + + if(up.first->getPlayer() != mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ foreignUnit = true; pl = up.first->getPlayer(); break; } + } if(foreignUnit){ Vector3 plCol = pl->getColor(); diff --git a/minimapButton.h b/minimapButton.h index 1f12ca9..e9eafee 100644 --- a/minimapButton.h +++ b/minimapButton.h @@ -15,7 +15,6 @@ namespace battleship{ void onClick(); void update(); private: - vb01::Node *content = nullptr; }; } From 0be5a7fb0af12fe7e4e160f8909d817384f7ec0d Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 22 Sep 2024 14:46:29 +0300 Subject: [PATCH 07/18] moved old minimap image data refactored map data loading --- activeGameState.cpp | 9 ----- activeGameState.h | 2 - map.cpp | 87 ++++++++++++++++++++++++++----------------- map.h | 9 ++++- mapEditorAppState.cpp | 22 ++++++----- mapEditorAppState.h | 4 +- minimapButton.cpp | 5 ++- 7 files changed, 76 insertions(+), 62 deletions(-) diff --git a/activeGameState.cpp b/activeGameState.cpp index 054de0d..08d5c74 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -45,15 +45,6 @@ namespace battleship{ initDragbox(); mainPlayer = Game::getSingleton()->getPlayer(playerId); - - string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + Map::getSingleton()->getMapName() + "/minimap.jpg"; - ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(minimapPath); - int imgSize = asset->width * asset->height * asset->numChannels; - - oldImageData = new u8[imgSize]; - - for(int i = 0; i < imgSize; i++) - oldImageData[i] = asset->image[i]; } ActiveGameState::~ActiveGameState() { diff --git a/activeGameState.h b/activeGameState.h index 0f94ed5..b6dd726 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -34,7 +34,6 @@ namespace battleship{ inline std::vector getButtons(){return buttons;} inline Player* getPlayer(){return mainPlayer;} inline std::vector& getUnitGroup(int i){return unitGroups[i];} - inline u8 *getOldMinimapImage(){return oldImageData;} private: enum CursorState{ NORMAL, @@ -77,7 +76,6 @@ namespace battleship{ vb01::s64 lastLeftMouseClicked = 0; vb01::Node *cursorNode = nullptr; vb01::Texture *pointerTex = nullptr, *attackTex = nullptr, *garrisonTex = nullptr; - vb01::u8 *oldImageData = nullptr; }; } diff --git a/map.cpp b/map.cpp index b2042ad..dd14bb6 100755 --- a/map.cpp +++ b/map.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -239,7 +240,7 @@ namespace battleship{ } } - void Map::preprareScene(){ + void Map::preprareScene(bool empty){ Root *root = Root::getSingleton(); Node *rootNode = root->getRootNode(); string libPath = root->getLibPath(); @@ -263,6 +264,15 @@ namespace battleship{ cam->setPosition(Vector3(1, 1, 1) * configData::CAMERA_DISTANCE); cam->lookAt(Vector3(-1, -1, -1).norm(), Vector3(-1, 1, -1).norm()); + if(empty){ + Light *light = new Light(Light::Type::AMBIENT); + light->setColor(Vector3::VEC_IJK * .9); + + Node *node = new Node(); + node->addLight(light); + Root::getSingleton()->getRootNode()->attachChild(node); + lights.push_back(node); + } } //TODO implement toggleable cell rendering @@ -303,49 +313,54 @@ namespace battleship{ } } - //TODO implement map size calculation when exporting maps - void Map::load(string mapName, bool empty) { + void Map::loadMinimap(){ + AssetManager *am = AssetManager::getSingleton(); + string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + mapName + "/minimap.jpg"; + + am->load(minimapPath); + ImageAsset *asset = (ImageAsset*)am->getAsset(minimapPath); + int imgSize = asset->width * asset->height * asset->numChannels; + oldImageData = new u8[imgSize]; + + for(int i = 0; i < imgSize; i++) + oldImageData[i] = asset->image[i]; + } + + void Map::load(string mapName){ this->mapName = mapName; Pathfinder::getSingleton()->setImpassibleNodeVal(u16(0 - 1)); string path = GameManager::getSingleton()->getPath(); + sol::state_view SOL_LUA_STATE = generateView(); + SOL_LUA_STATE.script_file(path + "Models/Maps/" + mapName + "/" + mapName + ".lua"); + + preprareScene(false); + loadMinimap(); + loadSpawnPoints(); + loadSkybox(); + loadCells(); + loadTerrainObject(-1); + + sol::optional lightsOpt = SOL_LUA_STATE[mapTable]["lights"]; - preprareScene(); + if(lightsOpt != sol::nullopt) + loadLights(); - if(!empty){ - string mapDir = path + "Models/Maps/" + mapName + "/"; - AssetManager::getSingleton()->load(mapDir + "minimap.jpg"); - - SOL_LUA_STATE.script_file(mapDir + mapName + ".lua"); - sol::optional lightsOpt = SOL_LUA_STATE[mapTable]["lights"]; - - if(lightsOpt != sol::nullopt) - loadLights(); - - loadSpawnPoints(); - loadSkybox(); - loadCells(); - loadTerrainObject(-1); - - sol::table sizeTable = SOL_LUA_STATE[mapTable]["size"]; - mapSize = Vector3(sizeTable["x"], sizeTable["y"], sizeTable["z"]); - int numWaterbodies = SOL_LUA_STATE[mapTable]["numWaterBodies"]; - - for(int i = 0; i < numWaterbodies; i++) - loadTerrainObject(i); - } - else{ - Light *light = new Light(Light::Type::AMBIENT); - light->setColor(Vector3::VEC_IJK * .9); - - Node *node = new Node(); - node->addLight(light); - Root::getSingleton()->getRootNode()->attachChild(node); - lights.push_back(node); - } + sol::table sizeTable = SOL_LUA_STATE[mapTable]["size"]; + mapSize = Vector3(sizeTable["x"], sizeTable["y"], sizeTable["z"]); + int numWaterbodies = SOL_LUA_STATE[mapTable]["numWaterBodies"]; + + for(int i = 0; i < numWaterbodies; i++) + loadTerrainObject(i); } + void Map::create(string mapName){ + this->mapName = mapName; + addSpawnPoint(Vector3::VEC_ZERO); + preprareScene(true); + } + //TODO unload skybox assets void Map::unloadSkybox(){ Root::getSingleton()->removeSkybox(); @@ -404,6 +419,8 @@ namespace battleship{ } void Map::unload(){ + delete[] oldImageData; + unloadSkybox(); unloadLights(); unloadCells(); diff --git a/map.h b/map.h index bacf47c..6b4980c 100755 --- a/map.h +++ b/map.h @@ -45,7 +45,8 @@ namespace battleship{ ~Map(){} static std::vector generateAdjacentNodeEdges(int, int, int, int, int); void update(); - void load(std::string, bool = false); + void load(std::string); + void create(std::string); void unload(); std::vector raycastTerrain(vb01::Vector3, vb01::Vector3, bool); int getCellId(vb01::Vector3, bool = true); @@ -56,11 +57,13 @@ namespace battleship{ inline vb01::Vector3 getCellSize(){return CELL_SIZE;} inline int getNumSpawnPoints(){return spawnPoints.size();} inline vb01::Vector3 getSpawnPoint(int i){return spawnPoints[i];} + inline void setMapSize(vb01::Vector3 s){this->mapSize = s;} inline vb01::Vector3 getMapSize(){return mapSize;} inline void addSpawnPoint(vb01::Vector3 sp){spawnPoints.push_back(sp);} inline std::vector& getCells(){return cells;} inline vb01::Node* getLight(int i){return lights[i];} inline std::vector getLights(){return lights;} + inline vb01::u8* getOldMinimapImage(){return oldImageData;} private: std::string mapTable = "map"; vb01::Node *terrainNode = nullptr, *cellNode = nullptr; @@ -70,9 +73,11 @@ namespace battleship{ std::vector spawnPoints; std::vector cells; std::vector lights; + vb01::u8 *oldImageData = nullptr; Map(){} - void preprareScene(); + void loadMinimap(); + void preprareScene(bool); void loadSpawnPoints(); void loadLights(); void loadSkybox(); diff --git a/mapEditorAppState.cpp b/mapEditorAppState.cpp index 5731ed6..6e88995 100644 --- a/mapEditorAppState.cpp +++ b/mapEditorAppState.cpp @@ -55,15 +55,17 @@ namespace battleship{ assetManager->load(basePath + DEFAULT_TEXTURE); map = Map::getSingleton(); - map->load(name, newMap); Game *game = Game::getSingleton(); if(newMap){ game->addPlayer(new Player(0, 0, 0, Vector3(1, 1, 1))); - map->addSpawnPoint(Vector3::VEC_ZERO); + map->setMapSize(Vector3(size.x, 0, size.y)); + map->create(name); generatePlane(size); } else{ + map->load(name); + int numPlayers = map->getNumSpawnPoints(); int numVerts = 3 * map->getNodeParent()->getChild(0)->getMesh(0)->getMeshBase().numTris; oldLandmassVertHeights = new float[numVerts]; @@ -395,7 +397,7 @@ namespace battleship{ return cells; } - void MapEditorAppState::MapEditor::generateMinimap(string mapFolder){ + void MapEditorAppState::MapEditor::generateMinimap(string mapFolder, vector &cells){ Vector3 mapSize = map->getMapSize(), cellSize = map->getCellSize(); int width = int(mapSize.x / cellSize.x); int height = int(mapSize.z / cellSize.z); @@ -406,7 +408,7 @@ namespace battleship{ u8 *imgData = new u8[size]; for(u8 *p = imgData; p != imgData + size; p+= numChannels, cellId++){ - Vector3 color = (map->getCells()[cellId].type == Map::Cell::Type::WATER ? Vector3::VEC_K : Vector3::VEC_J); + Vector3 color = (cells[cellId].type == Map::Cell::Type::WATER ? Vector3::VEC_K : Vector3::VEC_J); *p = color.x * 255.f; *(p + 1) = color.y * 255.f; *(p + 2) = color.z * 255.f; @@ -415,11 +417,10 @@ namespace battleship{ stbi_write_jpg(string(mapFolder + "minimap.jpg").c_str(), width, height, numChannels, imgData, 100); } - void MapEditorAppState::MapEditor::generateMapScript(){ + void MapEditorAppState::MapEditor::generateMapScript(vector &cells){ int numWaterBodies = map->getNodeParent()->getNumChildren() - 1; vector players = Game::getSingleton()->getPlayers(); - Vector3 mapSize = map->getMapSize(); string mapScript = "map = {\nlights = {\n"; for(Node *light : map->getLights()){ @@ -434,8 +435,9 @@ namespace battleship{ mapScript += ", color = {x = " + to_string(color.x) + ", y = " + to_string(color.y) + ", z = " + to_string(color.z) + "}},"; } + Vector3 mapSize = map->getMapSize(); mapScript += "}\nnumWaterBodies = " + to_string(numWaterBodies) + ",\n"; - mapScript += "size = {x = " + to_string(mapSize.x) + ", y = 100, z = " + to_string(mapSize.z) + "},\n"; + mapScript += "size = {x = " + to_string(mapSize.x) + ", y = " + to_string(mapSize.y) + ", z = " + to_string(mapSize.z) + "},\n"; mapScript += "impassibleNodeValue = " + to_string(IMPASS_NODE_VAL) + ",\n"; mapScript += "numPlayers = " + to_string(players.size()) + ",\n"; @@ -499,7 +501,6 @@ namespace battleship{ mapScript += "}\n"; } - vector cells = generateMapCells(); mapScript += "},\nnumCells = " + to_string(cells.size()) + ",\n"; mapScript += "cells = {\n"; @@ -568,9 +569,10 @@ namespace battleship{ create_directory(mapFolder); copy_file(assetsPath + DEFAULT_TEXTURE, mapFolder + map->getMapName() + ".jpg"); + vector cells = generateMapCells(); generateLandmassXml(); - generateMinimap(mapFolder); - generateMapScript(); + generateMapScript(cells); + generateMinimap(mapFolder, cells); } void MapEditorAppState::MapEditor::togglePush(bool push){ diff --git a/mapEditorAppState.h b/mapEditorAppState.h index 5674eea..72f9bf5 100644 --- a/mapEditorAppState.h +++ b/mapEditorAppState.h @@ -60,8 +60,8 @@ namespace battleship{ void toggleSelection(vb01::Node*, bool); std::vector generateMapCells(); void generateLandmassXml(); - void generateMinimap(std::string); - void generateMapScript(); + void generateMinimap(std::string, std::vector&); + void generateMapScript(std::vector&); void prepareTerrainObject(vb01::u32**, Map::Cell*, int[3], float, bool); Map *map; diff --git a/minimapButton.cpp b/minimapButton.cpp index bf5f23c..7e285b2 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -30,7 +30,8 @@ namespace battleship{ ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(imagePath); int width = asset->width, height = asset->height, numChannels = asset->numChannels; - Vector3 mapSize = Map::getSingleton()->getMapSize(); + Map *map = Map::getSingleton(); + Vector3 mapSize = map->getMapSize(); vector> unitMinimapPos; for(Player *pl : Game::getSingleton()->getPlayers()) @@ -50,7 +51,7 @@ namespace battleship{ int size = width * height * numChannels; int pxId = 0, numIter = 0; - u8 *oldImageData = activeState->getOldMinimapImage(); + u8 *oldImageData = map->getOldMinimapImage(); int unitPxRadius = 1; for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ From afa4fe31eeaf5f00433e4fa9fe6c8e1015692002 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 22 Sep 2024 15:26:32 +0300 Subject: [PATCH 08/18] rendering height data in minimaps --- map.h | 3 +++ mapEditorAppState.cpp | 24 +++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/map.h b/map.h index 6b4980c..c8b2ce8 100755 --- a/map.h +++ b/map.h @@ -64,6 +64,8 @@ namespace battleship{ inline vb01::Node* getLight(int i){return lights[i];} inline std::vector getLights(){return lights;} inline vb01::u8* getOldMinimapImage(){return oldImageData;} + inline float getBaseHeight(){return baseHeight;} + inline void setBaseHeight(float bh){this->baseHeight = bh;} private: std::string mapTable = "map"; vb01::Node *terrainNode = nullptr, *cellNode = nullptr; @@ -72,6 +74,7 @@ namespace battleship{ vb01::Vector3 CELL_SIZE = vb01::Vector3(7, 7, 7), mapSize; std::vector spawnPoints; std::vector cells; + float baseHeight; std::vector lights; vb01::u8 *oldImageData = nullptr; diff --git a/mapEditorAppState.cpp b/mapEditorAppState.cpp index 6e88995..1900032 100644 --- a/mapEditorAppState.cpp +++ b/mapEditorAppState.cpp @@ -191,6 +191,20 @@ namespace battleship{ } mesh->updateVerts(meshData); + + int minId = 0, maxId = 0; + + for(int i = 0; i < numVerts; i++){ + if(verts[i].pos->y < verts[minId].pos->y) + minId = i; + + if(verts[i].pos->y > verts[maxId].pos->y) + maxId = i; + } + + Vector3 mapSize = map->getMapSize(); + map->setBaseHeight(verts[minId].pos->y); + map->setMapSize(Vector3(mapSize.x, verts[maxId].pos->y - verts[minId].pos->y, mapSize.z)); } void MapEditorAppState::MapEditor::generatePlane(Vector2 size){ @@ -404,14 +418,18 @@ namespace battleship{ int numChannels = 3; int size = width * height * numChannels; int cellId = 0; + float baseHeight = map->getBaseHeight(); u8 *imgData = new u8[size]; for(u8 *p = imgData; p != imgData + size; p+= numChannels, cellId++){ + float min = .6, max = 1.; + float heightFactor = min + (max - min) * (cells[cellId].pos.y - baseHeight) / mapSize.y; Vector3 color = (cells[cellId].type == Map::Cell::Type::WATER ? Vector3::VEC_K : Vector3::VEC_J); - *p = color.x * 255.f; - *(p + 1) = color.y * 255.f; - *(p + 2) = color.z * 255.f; + + *p = color.x * heightFactor * 255.f; + *(p + 1) = color.y * heightFactor * 255.f; + *(p + 2) = color.z * heightFactor * 255.f; } stbi_write_jpg(string(mapFolder + "minimap.jpg").c_str(), width, height, numChannels, imgData, 100); From ceac0bfc8a621dd1b44a37ea2be75a0fbb162ea0 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 23 Sep 2024 20:49:58 +0300 Subject: [PATCH 09/18] moved main minimap functionality to dedicated Minimap class --- Assets/Scripts/Gui/activeGameState.lua | 2 +- inGameAppState.cpp | 1 + map.cpp | 174 ++++++++++++++++++++++--- map.h | 24 +++- minimapButton.cpp | 98 -------------- minimapButton.h | 5 +- 6 files changed, 179 insertions(+), 125 deletions(-) diff --git a/Assets/Scripts/Gui/activeGameState.lua b/Assets/Scripts/Gui/activeGameState.lua index 3db570f..9e7ce9d 100644 --- a/Assets/Scripts/Gui/activeGameState.lua +++ b/Assets/Scripts/Gui/activeGameState.lua @@ -14,7 +14,7 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.MINIMAP, name = 'minimap', - pos = {x = res.x - minimapSize.x, y = 0, z = 0}, + pos = {x = res.x - minimapSize.x, y = 0, z = .9}, size = minimapSize, color = {x = .5, y = .5, z = .5, w = 1} }, diff --git a/inGameAppState.cpp b/inGameAppState.cpp index c69a406..d05c086 100755 --- a/inGameAppState.cpp +++ b/inGameAppState.cpp @@ -100,6 +100,7 @@ namespace battleship{ void InGameAppState::update() { Game::getSingleton()->update(); + Map::getSingleton()->update(); } void InGameAppState::onAction(int bind, bool isPressed) { diff --git a/map.cpp b/map.cpp index dd14bb6..bbe16ec 100755 --- a/map.cpp +++ b/map.cpp @@ -6,25 +6,171 @@ #include #include +#include + #include +#include #include "map.h" #include "game.h" #include "player.h" #include "gameObject.h" -#include "gameObjectFactory.h" #include "pathfinder.h" #include "gameManager.h" #include "defConfigs.h" +#include "activeGameState.h" +#include "concreteGuiManager.h" +#include "gameObjectFactory.h" -using namespace std; -using namespace vb01; -using namespace gameBase; namespace battleship{ + using namespace std; + using namespace vb01; + using namespace vb01Gui; + using namespace gameBase; using namespace configData; - Map *map = nullptr; + static Map *map = nullptr; + static Map::Minimap *minimap = nullptr; + + Map::Minimap* Map::Minimap::getSingleton(){ + if(!minimap) minimap = new Map::Minimap(); + + return minimap; + } + + Map::Minimap::Minimap(){ + Root *root = Root::getSingleton(); + + Material *mat = new Material(root->getLibPath() + "gui"); + mat->addBoolUniform("lightingEnabled", false); + mat->addBoolUniform("texturingEnabled", false); + mat->addVec4Uniform("diffuseColor", Vector4(0, 0, 0, 1)); + + Quad *mesh = new Quad(Vector3(50, 50, 0), false); + mesh->setMaterial(mat); + mesh->setWireframe(true); + + camFrame = new Node(); + camFrame->attachMesh(mesh); + root->getGuiNode()->attachChild(camFrame); + } + + void Map::Minimap::updateImage(Button *minimapButton){ + string imagePath = GameManager::getSingleton()->getPath() + "Models/Maps/" + Map::getSingleton()->getMapName() + "/minimap.jpg"; + ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(imagePath); + int width = asset->width, height = asset->height, numChannels = asset->numChannels; + + Vector3 mapSize = Map::getSingleton()->getMapSize(); + vector> unitMinimapPos; + + for(Player *pl : Game::getSingleton()->getPlayers()) + for(Unit *un : pl->getUnits()){ + Vector2 coords = Vector2( + int(un->getPos().x / mapSize.x * width), + int(un->getPos().z / mapSize.z * height) + ); + + unitMinimapPos.push_back(make_pair(un, coords)); + } + + ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE); + Player *mainPlayer = activeState->getPlayer(); + vector units = mainPlayer->getUnits(); + + int size = width * height * numChannels, unitPxRadius = 1; + int pxId = 0, numIter = 0; + + for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ + Vector2 coords = Vector2( + -(numIter % asset->width - .5 * asset->width), + numIter / asset->width - .5 * asset->height + ); + float losFactor = .6, pxCol[3]{ + losFactor * oldImageData[pxId + 0], + losFactor * oldImageData[pxId + 1], + losFactor * oldImageData[pxId + 2] + }; + + for(pair unitPair : unitMinimapPos){ + Vector2 coordDiff = unitPair.second - coords; + + if(unitPair.first->getPlayer() == mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ + Vector3 plCol = mainPlayer->getColor(); + pxCol[0] = plCol.x * 255; + pxCol[1] = plCol.y * 255; + pxCol[2] = plCol.z * 255; + break; + } + + float minimapLos = unitPair.first->getLineOfSight() / mapSize.x * width; + + if(unitPair.first->getPlayer() == mainPlayer && coords.getDistanceFrom(unitPair.second) < minimapLos){ + bool foreignUnit = false; + Player *pl = nullptr; + + for(pair up : unitMinimapPos){ + Vector2 coordDiff = up.second - coords; + + if(up.first->getPlayer() != mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ + foreignUnit = true; + pl = up.first->getPlayer(); + break; + } + } + + if(foreignUnit){ + Vector3 plCol = pl->getColor(); + pxCol[0] = plCol.x * 255; + pxCol[1] = plCol.y * 255; + pxCol[2] = plCol.z * 255; + } + else{ + pxCol[0] = oldImageData[pxId + 0]; + pxCol[1] = oldImageData[pxId + 1]; + pxCol[2] = oldImageData[pxId + 2]; + } + + break; + } + } + + *p = pxCol[0]; + *(p + 1) = pxCol[1]; + *(p + 2) = pxCol[2]; + } + + Node *rectNode = minimapButton->getRectNode(); + Material *mat = rectNode->getMesh(0)->getMaterial(); + Texture *tex = ((Material::TextureUniform*)mat->getUniform("diffuseMap"))->value; + tex->loadImageData(asset); + } + + void Map::Minimap::updateCamFrame(Button *minimapButton){ + } + + void Map::Minimap::update(){ + Button *mb = ConcreteGuiManager::getSingleton()->getButton("minimap"); + updateImage(mb); + updateCamFrame(mb); + } + + void Map::Minimap::load(){ + AssetManager *am = AssetManager::getSingleton(); + string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + Map::getSingleton()->getMapName() + "/minimap.jpg"; + + am->load(minimapPath); + ImageAsset *asset = (ImageAsset*)am->getAsset(minimapPath); + int imgSize = asset->width * asset->height * asset->numChannels; + oldImageData = new u8[imgSize]; + + for(int i = 0; i < imgSize; i++) + oldImageData[i] = asset->image[i]; + } + + void Map::Minimap::unload(){ + delete[] oldImageData; + } Map* Map::getSingleton(){ if(!map) @@ -65,6 +211,7 @@ namespace battleship{ } void Map::update(){ + Minimap::getSingleton()->update(); } void Map::loadSkybox(){ @@ -313,19 +460,6 @@ namespace battleship{ } } - void Map::loadMinimap(){ - AssetManager *am = AssetManager::getSingleton(); - string minimapPath = GameManager::getSingleton()->getPath() + "Models/Maps/" + mapName + "/minimap.jpg"; - - am->load(minimapPath); - ImageAsset *asset = (ImageAsset*)am->getAsset(minimapPath); - int imgSize = asset->width * asset->height * asset->numChannels; - oldImageData = new u8[imgSize]; - - for(int i = 0; i < imgSize; i++) - oldImageData[i] = asset->image[i]; - } - void Map::load(string mapName){ this->mapName = mapName; @@ -336,7 +470,7 @@ namespace battleship{ SOL_LUA_STATE.script_file(path + "Models/Maps/" + mapName + "/" + mapName + ".lua"); preprareScene(false); - loadMinimap(); + Minimap::getSingleton()->load(); loadSpawnPoints(); loadSkybox(); loadCells(); @@ -419,7 +553,7 @@ namespace battleship{ } void Map::unload(){ - delete[] oldImageData; + Minimap::getSingleton()->unload(); unloadSkybox(); unloadLights(); diff --git a/map.h b/map.h index c8b2ce8..7bf7329 100755 --- a/map.h +++ b/map.h @@ -14,6 +14,10 @@ namespace vb01{ class Node; } +namespace vb01Gui{ + class Button; +} + namespace battleship{ class Player; class Unit; @@ -41,6 +45,23 @@ namespace battleship{ Cell(vb01::Vector3 p, Type t, std::vector e = std::vector{}, std::vector uc = std::vector{}): pos(p), type(t), edges(e), underWaterCellIds(uc){} }; + class Minimap{ + public: + static Minimap* getSingleton(); + ~Minimap(){} + void update(); + void load(); + void unload(); + inline vb01::u8* getOldMinimapImage(){return oldImageData;} + private: + Minimap(); + void updateCamFrame(vb01Gui::Button*); + void updateImage(vb01Gui::Button*); + + vb01::u8 *oldImageData = nullptr; + vb01::Node *camFrame = nullptr; + }; + static Map* getSingleton(); ~Map(){} static std::vector generateAdjacentNodeEdges(int, int, int, int, int); @@ -63,7 +84,6 @@ namespace battleship{ inline std::vector& getCells(){return cells;} inline vb01::Node* getLight(int i){return lights[i];} inline std::vector getLights(){return lights;} - inline vb01::u8* getOldMinimapImage(){return oldImageData;} inline float getBaseHeight(){return baseHeight;} inline void setBaseHeight(float bh){this->baseHeight = bh;} private: @@ -76,10 +96,8 @@ namespace battleship{ std::vector cells; float baseHeight; std::vector lights; - vb01::u8 *oldImageData = nullptr; Map(){} - void loadMinimap(); void preprareScene(bool); void loadSpawnPoints(); void loadLights(); diff --git a/minimapButton.cpp b/minimapButton.cpp index 7e285b2..e282a24 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -18,104 +18,6 @@ namespace battleship{ using namespace vb01; using namespace std; - MinimapButton::MinimapButton(Vector3 pos, Vector2 size, string ip) : Button(pos, size, "minimap", "", -1, true, ip){} - - MinimapButton::~MinimapButton(){} - - void MinimapButton::update(){ - Button::update(); - - Material *mat = rectNode->getMesh(0)->getMaterial(); - Texture *tex = ((Material::TextureUniform*)mat->getUniform("diffuseMap"))->value; - ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(imagePath); - int width = asset->width, height = asset->height, numChannels = asset->numChannels; - - Map *map = Map::getSingleton(); - Vector3 mapSize = map->getMapSize(); - vector> unitMinimapPos; - - for(Player *pl : Game::getSingleton()->getPlayers()) - for(Unit *un : pl->getUnits()){ - Vector2 coords = Vector2( - int(un->getPos().x / mapSize.x * width), - int(un->getPos().z / mapSize.z * height) - ); - - unitMinimapPos.push_back(make_pair(un, coords)); - } - - ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE); - Player *mainPlayer = activeState->getPlayer(); - vector units = mainPlayer->getUnits(); - - int size = width * height * numChannels; - int pxId = 0, numIter = 0; - - u8 *oldImageData = map->getOldMinimapImage(); - int unitPxRadius = 1; - - for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ - Vector2 coords = Vector2( - -(numIter % asset->width - .5 * asset->width), - numIter / asset->width - .5 * asset->height - ); - float losFactor = .6, pxCol[3]{ - losFactor * oldImageData[pxId + 0], - losFactor * oldImageData[pxId + 1], - losFactor * oldImageData[pxId + 2] - }; - - for(pair unitPair : unitMinimapPos){ - Vector2 coordDiff = unitPair.second - coords; - - if(unitPair.first->getPlayer() == mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ - Vector3 plCol = mainPlayer->getColor(); - pxCol[0] = plCol.x * 255; - pxCol[1] = plCol.y * 255; - pxCol[2] = plCol.z * 255; - break; - } - - float minimapLos = unitPair.first->getLineOfSight() / mapSize.x * width; - - if(unitPair.first->getPlayer() == mainPlayer && coords.getDistanceFrom(unitPair.second) < minimapLos){ - bool foreignUnit = false; - Player *pl = nullptr; - - for(pair up : unitMinimapPos){ - Vector2 coordDiff = up.second - coords; - - if(up.first->getPlayer() != mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ - foreignUnit = true; - pl = up.first->getPlayer(); - break; - } - } - - if(foreignUnit){ - Vector3 plCol = pl->getColor(); - pxCol[0] = plCol.x * 255; - pxCol[1] = plCol.y * 255; - pxCol[2] = plCol.z * 255; - } - else{ - pxCol[0] = oldImageData[pxId + 0]; - pxCol[1] = oldImageData[pxId + 1]; - pxCol[2] = oldImageData[pxId + 2]; - } - - break; - } - } - - *p = pxCol[0]; - *(p + 1) = pxCol[1]; - *(p + 2) = pxCol[2]; - } - - tex->loadImageData(asset); - } - void MinimapButton::onClick(){ Vector2 clickPos = getCursorPos(); float posXRatio = 1. - (clickPos.x - pos.x) / size.x; diff --git a/minimapButton.h b/minimapButton.h index e9eafee..92f0802 100644 --- a/minimapButton.h +++ b/minimapButton.h @@ -10,10 +10,9 @@ namespace vb01{ namespace battleship{ class MinimapButton : public vb01Gui::Button{ public: - MinimapButton(vb01::Vector3, vb01::Vector2, std::string); - ~MinimapButton(); + MinimapButton(vb01::Vector3 pos, vb01::Vector2 size, std::string ip) : vb01Gui::Button(pos, size, "minimap", "", -1, true, ip){} + ~MinimapButton(){} void onClick(); - void update(); private: }; } From c41d9f863fb49315e0adf45022ec3ec00db2c457 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 25 Sep 2024 20:37:41 +0300 Subject: [PATCH 10/18] resource deposit icon placement on the minimap --- Assets/Scripts/Gui/activeGameState.lua | 3 +- map.cpp | 55 ++++++++++++++++++++------ map.h | 3 +- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Assets/Scripts/Gui/activeGameState.lua b/Assets/Scripts/Gui/activeGameState.lua index 9e7ce9d..ea65374 100644 --- a/Assets/Scripts/Gui/activeGameState.lua +++ b/Assets/Scripts/Gui/activeGameState.lua @@ -3,6 +3,7 @@ Size = {x = 70, y = 70} sz = 210 s = 40 minimapSize = {x = 200, y = 200} +minimapPos = {x = res.x - minimapSize.x, y = 0, z = .9} resTextScale = {x = .5, y = .5} resIconBasePath = 'Icons/Resources/' pointerTex = 'pointer.png' @@ -14,7 +15,7 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.MINIMAP, name = 'minimap', - pos = {x = res.x - minimapSize.x, y = 0, z = .9}, + pos = minimapPos, size = minimapSize, color = {x = .5, y = .5, z = .5, w = 1} }, diff --git a/map.cpp b/map.cpp index bbe16ec..086e45c 100755 --- a/map.cpp +++ b/map.cpp @@ -18,6 +18,7 @@ #include "pathfinder.h" #include "gameManager.h" #include "defConfigs.h" +#include "resourceDeposit.h" #include "activeGameState.h" #include "concreteGuiManager.h" #include "gameObjectFactory.h" @@ -39,21 +40,50 @@ namespace battleship{ return minimap; } + //TODO remove icon path literal Map::Minimap::Minimap(){ Root *root = Root::getSingleton(); + string path = GameManager::getSingleton()->getPath(), iconPath = path + "Textures/Icons/Resources/refinedsMinimap.png", p[]{iconPath}; + ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(iconPath); + Vector3 iconSize = Vector3(asset->width, asset->height, 0); + Texture *tex = new Texture(p, 1, false); + Material *mat = new Material(root->getLibPath() + "gui"); - mat->addBoolUniform("lightingEnabled", false); - mat->addBoolUniform("texturingEnabled", false); - mat->addVec4Uniform("diffuseColor", Vector4(0, 0, 0, 1)); + mat->addBoolUniform("texturingEnabled", true); + mat->addTexUniform("diffuseMap", tex, false); - Quad *mesh = new Quad(Vector3(50, 50, 0), false); - mesh->setMaterial(mat); - mesh->setWireframe(true); + sol::state_view SOL_LUA_VIEW = generateView(); + SOL_LUA_VIEW.script_file(path + "Scripts/Gui/activeGameState.lua"); + sol::table posTbl = SOL_LUA_VIEW["minimapPos"], sizeTbl = SOL_LUA_VIEW["minimapSize"]; + Vector2 minimapSize = Vector2(sizeTbl["x"], sizeTbl["y"]); + Vector3 minimapPos = Vector3(posTbl["x"], posTbl["y"], posTbl["z"]); - camFrame = new Node(); - camFrame->attachMesh(mesh); - root->getGuiNode()->attachChild(camFrame); + for(Player *pl : Game::getSingleton()->getPlayers()) + for(ResourceDeposit *rd : pl->getResourceDeposits()){ + Vector3 pos = rd->getPos(), mapSize = Map::getSingleton()->getMapSize(); + Vector2 iconPos = Vector2( + minimapSize.x * (pos.x + .5 * mapSize.x) / mapSize.x, + minimapSize.y * (pos.z + .5 * mapSize.z) / mapSize.z + ); + + Quad *quad = new Quad(iconSize, false); + quad->setMaterial(mat); + + Node *node = new Node(minimapPos + Vector3(iconPos.x, iconPos.y, .1) - .5 * iconSize); + node->attachMesh(quad); + depositIcons.push_back(node); + root->getGuiNode()->attachChild(node); + } + } + + Map::Minimap::~Minimap(){ + for(Node *node : depositIcons){ + Root::getSingleton()->getGuiNode()->dettachChild(node); + delete node; + } + + depositIcons.clear(); } void Map::Minimap::updateImage(Button *minimapButton){ @@ -152,7 +182,6 @@ namespace battleship{ void Map::Minimap::update(){ Button *mb = ConcreteGuiManager::getSingleton()->getButton("minimap"); updateImage(mb); - updateCamFrame(mb); } void Map::Minimap::load(){ @@ -331,6 +360,7 @@ namespace battleship{ } } + //TODO move minimap loading elsewhere void Map::loadPlayerGameObjects(){ AssetManager *assetManager = AssetManager::getSingleton(); string path = GameManager::getSingleton()->getPath(); @@ -340,7 +370,6 @@ namespace battleship{ string vfxPrefix = SOL_LUA_VIEW["vfxPrefix"], gameObjPrefix = SOL_LUA_VIEW["gameObjPrefix"]; assetManager->load(path + vfxPrefix, true); assetManager->load(path + gameObjPrefix, true); - assetManager->load(path + "Textures/", true); string playerInd = "players"; SOL_LUA_VIEW.script("numPlayers = #" + mapTable + "." + playerInd); @@ -385,6 +414,8 @@ namespace battleship{ player->addUnit(GameObjectFactory::createUnit(player, id, pos, rot, buildStatus)); } } + + Minimap::getSingleton()->load(); } void Map::preprareScene(bool empty){ @@ -465,12 +496,12 @@ namespace battleship{ Pathfinder::getSingleton()->setImpassibleNodeVal(u16(0 - 1)); string path = GameManager::getSingleton()->getPath(); + AssetManager::getSingleton()->load(path + "Textures/", true); sol::state_view SOL_LUA_STATE = generateView(); SOL_LUA_STATE.script_file(path + "Models/Maps/" + mapName + "/" + mapName + ".lua"); preprareScene(false); - Minimap::getSingleton()->load(); loadSpawnPoints(); loadSkybox(); loadCells(); diff --git a/map.h b/map.h index 7bf7329..e48a88f 100755 --- a/map.h +++ b/map.h @@ -48,7 +48,7 @@ namespace battleship{ class Minimap{ public: static Minimap* getSingleton(); - ~Minimap(){} + ~Minimap(); void update(); void load(); void unload(); @@ -60,6 +60,7 @@ namespace battleship{ vb01::u8 *oldImageData = nullptr; vb01::Node *camFrame = nullptr; + std::vector depositIcons; }; static Map* getSingleton(); From eab534d305bac2a732fdaa6fe34621902f8633a9 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 25 Sep 2024 20:59:35 +0300 Subject: [PATCH 11/18] camera icon on the minimap --- map.cpp | 80 +++++++++++++++++++++++++++++++++++---------------------- map.h | 2 ++ 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/map.cpp b/map.cpp index 086e45c..1e65566 100755 --- a/map.cpp +++ b/map.cpp @@ -42,39 +42,14 @@ namespace battleship{ //TODO remove icon path literal Map::Minimap::Minimap(){ - Root *root = Root::getSingleton(); - - string path = GameManager::getSingleton()->getPath(), iconPath = path + "Textures/Icons/Resources/refinedsMinimap.png", p[]{iconPath}; - ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(iconPath); - Vector3 iconSize = Vector3(asset->width, asset->height, 0); - Texture *tex = new Texture(p, 1, false); - - Material *mat = new Material(root->getLibPath() + "gui"); - mat->addBoolUniform("texturingEnabled", true); - mat->addTexUniform("diffuseMap", tex, false); - - sol::state_view SOL_LUA_VIEW = generateView(); - SOL_LUA_VIEW.script_file(path + "Scripts/Gui/activeGameState.lua"); - sol::table posTbl = SOL_LUA_VIEW["minimapPos"], sizeTbl = SOL_LUA_VIEW["minimapSize"]; - Vector2 minimapSize = Vector2(sizeTbl["x"], sizeTbl["y"]); - Vector3 minimapPos = Vector3(posTbl["x"], posTbl["y"], posTbl["z"]); + string basePath = GameManager::getSingleton()->getPath() + "Textures/Icons/"; + string iconPath = basePath + "Resources/refinedsMinimap.png"; for(Player *pl : Game::getSingleton()->getPlayers()) - for(ResourceDeposit *rd : pl->getResourceDeposits()){ - Vector3 pos = rd->getPos(), mapSize = Map::getSingleton()->getMapSize(); - Vector2 iconPos = Vector2( - minimapSize.x * (pos.x + .5 * mapSize.x) / mapSize.x, - minimapSize.y * (pos.z + .5 * mapSize.z) / mapSize.z - ); + for(ResourceDeposit *rd : pl->getResourceDeposits()) + depositIcons.push_back(initIcon(rd->getPos(), basePath + "Resources/refinedsMinimap.png")); - Quad *quad = new Quad(iconSize, false); - quad->setMaterial(mat); - - Node *node = new Node(minimapPos + Vector3(iconPos.x, iconPos.y, .1) - .5 * iconSize); - node->attachMesh(quad); - depositIcons.push_back(node); - root->getGuiNode()->attachChild(node); - } + camIcon = initIcon(Root::getSingleton()->getCamera()->getPosition(), basePath + "Resources/refinedsMinimap.png"); } Map::Minimap::~Minimap(){ @@ -84,6 +59,41 @@ namespace battleship{ } depositIcons.clear(); + + delete camIcon; + } + + Node* Map::Minimap::initIcon(Vector3 posOnMap, string iconPath){ + string p[]{iconPath}; + ImageAsset *asset = (ImageAsset*)AssetManager::getSingleton()->getAsset(iconPath); + Vector3 iconSize = Vector3(asset->width, asset->height, 0); + Texture *tex = new Texture(p, 1, false); + + Root *root = Root::getSingleton(); + Material *mat = new Material(root->getLibPath() + "gui"); + mat->addBoolUniform("texturingEnabled", true); + mat->addTexUniform("diffuseMap", tex, false); + + sol::state_view SOL_LUA_VIEW = generateView(); + SOL_LUA_VIEW.script_file(GameManager::getSingleton()->getPath() + "Scripts/Gui/activeGameState.lua"); + sol::table posTbl = SOL_LUA_VIEW["minimapPos"], sizeTbl = SOL_LUA_VIEW["minimapSize"]; + Vector2 minimapSize = Vector2(sizeTbl["x"], sizeTbl["y"]); + Vector3 minimapPos = Vector3(posTbl["x"], posTbl["y"], posTbl["z"]); + + Vector3 mapSize = Map::getSingleton()->getMapSize(); + Vector2 iconPos = Vector2( + minimapSize.x * (posOnMap.x + .5 * mapSize.x) / mapSize.x, + minimapSize.y * (posOnMap.z + .5 * mapSize.z) / mapSize.z + ); + + Quad *quad = new Quad(iconSize, false); + quad->setMaterial(mat); + + Node *node = new Node(minimapPos + Vector3(iconPos.x, iconPos.y, .1) - .5 * iconSize); + node->attachMesh(quad); + root->getGuiNode()->attachChild(node); + + return node; } void Map::Minimap::updateImage(Button *minimapButton){ @@ -177,11 +187,21 @@ namespace battleship{ } void Map::Minimap::updateCamFrame(Button *minimapButton){ + Vector3 camPos = Root::getSingleton()->getCamera()->getPosition(); + Vector3 mapSize = Map::getSingleton()->getMapSize(); + Vector2 minimapSize = minimapButton->getSize(); + Vector2 iconPos = Vector2( + minimapSize.x * (camPos.x + .5 * mapSize.x) / mapSize.x, + minimapSize.y * (camPos.z + .5 * mapSize.z) / mapSize.z + ); + + camIcon->setPosition(minimapButton->getPos() + Vector3(iconPos.x, iconPos.y, .1)); } void Map::Minimap::update(){ Button *mb = ConcreteGuiManager::getSingleton()->getButton("minimap"); updateImage(mb); + updateCamFrame(mb); } void Map::Minimap::load(){ diff --git a/map.h b/map.h index e48a88f..1348358 100755 --- a/map.h +++ b/map.h @@ -55,12 +55,14 @@ namespace battleship{ inline vb01::u8* getOldMinimapImage(){return oldImageData;} private: Minimap(); + vb01::Node* initIcon(vb01::Vector3, std::string); void updateCamFrame(vb01Gui::Button*); void updateImage(vb01Gui::Button*); vb01::u8 *oldImageData = nullptr; vb01::Node *camFrame = nullptr; std::vector depositIcons; + vb01::Node* camIcon = nullptr; }; static Map* getSingleton(); From ab06ead0d51d8bea1d893753d4ce2a62b5b2c0d9 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 26 Sep 2024 19:42:22 +0300 Subject: [PATCH 12/18] corrected minimap coordinate placement --- inGameAppState.cpp | 2 +- map.cpp | 4 ++-- minimapButton.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/inGameAppState.cpp b/inGameAppState.cpp index d05c086..47a028e 100755 --- a/inGameAppState.cpp +++ b/inGameAppState.cpp @@ -80,7 +80,7 @@ namespace battleship{ Camera *cam = Root::getSingleton()->getCamera(); cam->setPosition(Map::getSingleton()->getSpawnPoint(playerId - 1) + Vector3(1, 1, 1) * configData::CAMERA_DISTANCE); - cam->lookAt(Vector3(0, -1, 1).norm(), Vector3(0, 1, 1).norm()); + cam->lookAt(Vector3(0, -1, -1).norm(), Vector3(0, 1, -1).norm()); mainPlayer = Game::getSingleton()->getPlayer(playerId); diff --git a/map.cpp b/map.cpp index 1e65566..a216b0a 100755 --- a/map.cpp +++ b/map.cpp @@ -123,8 +123,8 @@ namespace battleship{ for(u8 *p = asset->image; p != asset->image + size; p += numChannels, pxId += numChannels, numIter++){ Vector2 coords = Vector2( - -(numIter % asset->width - .5 * asset->width), - numIter / asset->width - .5 * asset->height + numIter % asset->width - .5 * asset->width, + -(numIter / asset->width - .5 * asset->height) ); float losFactor = .6, pxCol[3]{ losFactor * oldImageData[pxId + 0], diff --git a/minimapButton.cpp b/minimapButton.cpp index e282a24..7949da1 100644 --- a/minimapButton.cpp +++ b/minimapButton.cpp @@ -20,8 +20,8 @@ namespace battleship{ void MinimapButton::onClick(){ Vector2 clickPos = getCursorPos(); - float posXRatio = 1. - (clickPos.x - pos.x) / size.x; - float posYRatio = 1. - (clickPos.y - pos.y) / size.y; + float posXRatio = (clickPos.x - pos.x) / size.x; + float posYRatio = (clickPos.y - pos.y) / size.y; Camera *cam = Root::getSingleton()->getCamera(); Vector3 mapSize = Map::getSingleton()->getMapSize(); From cfb70a5571e739e43c72f32a048830d5c5f8790e Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 26 Sep 2024 20:03:09 +0300 Subject: [PATCH 13/18] minimap icons for the camera and resource deposits --- Assets/Textures/Icons/Minimap/eye.png | Bin 0 -> 331 bytes Assets/Textures/Icons/Minimap/eye.svg | 261 +++++++++++++++++++++ Assets/Textures/Icons/Minimap/refineds.png | Bin 0 -> 4344 bytes map.cpp | 14 +- 4 files changed, 269 insertions(+), 6 deletions(-) create mode 100644 Assets/Textures/Icons/Minimap/eye.png create mode 100644 Assets/Textures/Icons/Minimap/eye.svg create mode 100644 Assets/Textures/Icons/Minimap/refineds.png diff --git a/Assets/Textures/Icons/Minimap/eye.png b/Assets/Textures/Icons/Minimap/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..e47dd7db2383f5d01276ee6d8aa1352d8f499570 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^AT}!p8<4C?sm%aVoCO|{#Xve2gcBu-SBjA4B?o`c$UHFKg0k3{~6re z+{6wYI<)BByLZn%efs(P^XK1xK79E2`uOqV%l-WPq(EvIHgDeC^!4l4AK$-!|G#bf zoBuw3J^!7Y%l~(F-T(jj^XLC>-@g5_X3d&>hF7m%Jq0NO0V|s`K&=d5EG;wb|IeTQ z|Nr{+>;L7;m!C0h-MTgT@87?dfC?DG!}J(<`SKaKxFZ;o9sfIekpWPJMI!GmhB z8yy@RIM%LRoBZO%i*-ki{CKcq$B&n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Textures/Icons/Minimap/refineds.png b/Assets/Textures/Icons/Minimap/refineds.png new file mode 100644 index 0000000000000000000000000000000000000000..327bc1e773ca733400c203320e0a2049ca820d00 GIT binary patch literal 4344 zcmeHKYiu0V6`mz_b}@A#*C7u#m|;j$Lztb}+1ba8ys?ef*lXC}+G{YWX+4iS>ydYN z)-$vAI)Ua3RvLXz_iX#o-X6P-sz%?JfUk@I77rN7^ zEuusscVn*Hs-pmN5Bjapz74XaW3@6zq22EU`8#>JALNR>j%DL< z+=LZFzXuuv@*?O5ps7#f_WA?J*5k529Sbn*Q5a41^^s^3&bU3a+ZzOXnqhgG;~78B z&^+zoeO}n#@#2(67Si`Wcryn6ZBc7$nIjU z1*7kAGfn=Lv#D`!r{$7soK%%ToQluw)VoBE6$T= zk4N6GYy8qp9{%aSp1fE-GB)zu;AL#z50&Tta_c-G&&7?3tCV?l zCl_ga(|GLsiMOv0R-C$eXw3NhC2ogf_0z$(zIA5h2)_61;o|qkP6`k8w_Y$VbpPDl z@Z}#fzkWyCbBp_yN^fF+%V#GA@#WLU8=bHI@;4<9me$9j2OhiQjQq@Ji{l5|(ZTgs zm&`Z*{U>Hv-Gy(eyQgNetFX1dY3r_vQU0#Q&1U)aD+>pIysf?Hca0r?Z>ugWlZO}H zaK5p=>yra3Ux*wJo*usty!}_z9ZNbtT>k0UN8M%L+xXS8BOjc*(RkbL@fAmhhKTxO zAN$kY=ZE@3AM4Jg>lnGE=et$p9lvmnoVxVFE7g}4U;07UwS$=_&p7eu(Z&(X`NXld zO|J}xM$Vr(`}&5iwc}%sy;t-j=bkcGKoVxvSew}veSnv=q+5_R5xKL;v~^-wWmPsU zNL|RpMHE+4A>#7j8w9S(A>v_Ql#ZrrQK#ClPDd^4*2JWBT@oh~RjZ3CvpfJKktyKW zWFlqo*$`pl@*rE&6oK0+W><)4gG8#;bcC~R)=iUjS+$2DRu|!wx~%Zc;rsFsFbWZ! zrkUm`s<*e--RpI0dYtlb97oX%#V{mjkVaq16tZN>xYL5jVT6$(>1x_kwG?h)3Zj-V zLj(cq_=JDSbTm2%pEB|+03TFVNK+m+O(m1mbPL0*>j99wLtkrQ#QM^RYDR{Z(Ir&Z zgHq<5(;;MO(mtKh6LvVVM4<#qf~o<#dS+~CUAajMi-NeCOxspK_6$u^Ri?t^? zD09;w9@JIHN+B`bD+@{nsDR=V0}AIS6`7?;mgQ(tu#geW_&uCNdj+4*hLR=zK21*w zaGYvVh$AYUirWho;e1U~Bt$T7dTORAA(#pngop>!R3tljmA2X%&5Yi3EL<`d{p7x4$EIb4Q#0plP0)RaavGBDz5=>2xX<8ygOqSirJ!4P_oZ2JjVxh1JnNW~FUk9@jL%&T9M3Xm;c#wW@o?O_qgihh|C z{oVj6vQoes^fD65h%?a*O)+}~9o58vN8k$5)BcIVE9`^1Yo>N@C$dff2qS5ZWc(9^ zv3bI%e87}dGbSRgr2dPON?T!Ckpa8h92768h16s*%yVXyop12TpT#%013=GhGAn-P z=$fNzRt(Hac`m!==$aJ+vr?YRuKycdMN_X+CUDmf9UbNa(c##YH8tXK>fgetPath() + "Textures/Icons/"; - string iconPath = basePath + "Resources/refinedsMinimap.png"; + sol::state_view SOL_STATE_VIEW = generateView(); + SOL_STATE_VIEW.script_file(GameManager::getSingleton()->getPath() + "Scripts/Gui/activeGameState.lua"); + + string refIconFile = SOL_STATE_VIEW["refIcon"]; + string basePath = GameManager::getSingleton()->getPath() + "Textures/Icons/Minimap/"; for(Player *pl : Game::getSingleton()->getPlayers()) for(ResourceDeposit *rd : pl->getResourceDeposits()) - depositIcons.push_back(initIcon(rd->getPos(), basePath + "Resources/refinedsMinimap.png")); + depositIcons.push_back(initIcon(rd->getPos(), basePath + refIconFile)); - camIcon = initIcon(Root::getSingleton()->getCamera()->getPosition(), basePath + "Resources/refinedsMinimap.png"); + string camIconFile = SOL_STATE_VIEW["eyeIcon"]; + camIcon = initIcon(Root::getSingleton()->getCamera()->getPosition(), basePath + camIconFile); } Map::Minimap::~Minimap(){ @@ -75,7 +78,6 @@ namespace battleship{ mat->addTexUniform("diffuseMap", tex, false); sol::state_view SOL_LUA_VIEW = generateView(); - SOL_LUA_VIEW.script_file(GameManager::getSingleton()->getPath() + "Scripts/Gui/activeGameState.lua"); sol::table posTbl = SOL_LUA_VIEW["minimapPos"], sizeTbl = SOL_LUA_VIEW["minimapSize"]; Vector2 minimapSize = Vector2(sizeTbl["x"], sizeTbl["y"]); Vector3 minimapPos = Vector3(posTbl["x"], posTbl["y"], posTbl["z"]); From 042c6ed5e0f3e14d0b16b9ddf56e31123ad63aa9 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 26 Sep 2024 20:04:59 +0300 Subject: [PATCH 14/18] added missing file --- Assets/Scripts/Gui/activeGameState.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/Scripts/Gui/activeGameState.lua b/Assets/Scripts/Gui/activeGameState.lua index ea65374..ff32bd7 100644 --- a/Assets/Scripts/Gui/activeGameState.lua +++ b/Assets/Scripts/Gui/activeGameState.lua @@ -2,8 +2,12 @@ res = graphics.resolution Size = {x = 70, y = 70} sz = 210 s = 40 + +eyeIcon = 'eye.png' +refIcon = 'refineds.png' minimapSize = {x = 200, y = 200} minimapPos = {x = res.x - minimapSize.x, y = 0, z = .9} + resTextScale = {x = .5, y = .5} resIconBasePath = 'Icons/Resources/' pointerTex = 'pointer.png' From b205e45e0df665f49b3e9db96acd4762dfb28e87 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 27 Sep 2024 17:30:00 +0300 Subject: [PATCH 15/18] updated vb01 --- external/vb01 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/vb01 b/external/vb01 index 63990e0..793b049 160000 --- a/external/vb01 +++ b/external/vb01 @@ -1 +1 @@ -Subproject commit 63990e0ef015c32977e2b42e3d22aa91d77953a5 +Subproject commit 793b0492169256acaf2b26dde3ff4f3c6d60c332 From aced28c3328be3762e1f26236ed6c5cfb2f8103b Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 27 Sep 2024 17:54:40 +0300 Subject: [PATCH 16/18] bugfix for overlapping unit fields of view --- map.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/map.cpp b/map.cpp index 9eb5090..f752da0 100755 --- a/map.cpp +++ b/map.cpp @@ -135,16 +135,6 @@ namespace battleship{ }; for(pair unitPair : unitMinimapPos){ - Vector2 coordDiff = unitPair.second - coords; - - if(unitPair.first->getPlayer() == mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ - Vector3 plCol = mainPlayer->getColor(); - pxCol[0] = plCol.x * 255; - pxCol[1] = plCol.y * 255; - pxCol[2] = plCol.z * 255; - break; - } - float minimapLos = unitPair.first->getLineOfSight() / mapSize.x * width; if(unitPair.first->getPlayer() == mainPlayer && coords.getDistanceFrom(unitPair.second) < minimapLos){ @@ -177,6 +167,18 @@ namespace battleship{ } } + for(pair unitPair : unitMinimapPos){ + Vector2 coordDiff = unitPair.second - coords; + + if(unitPair.first->getPlayer() == mainPlayer && fabs(coordDiff.x) <= unitPxRadius && fabs(coordDiff.y) <= unitPxRadius){ + Vector3 plCol = mainPlayer->getColor(); + pxCol[0] = plCol.x * 255; + pxCol[1] = plCol.y * 255; + pxCol[2] = plCol.z * 255; + break; + } + } + *p = pxCol[0]; *(p + 1) = pxCol[1]; *(p + 2) = pxCol[2]; From 2e6c54e44860650f996c3b58438a21f9ccc24c10 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 27 Sep 2024 18:16:18 +0300 Subject: [PATCH 17/18] bugfixes for crashing when pausing the game or selecting engineers --- activeStateButton.cpp | 2 +- activeStateButton.h | 2 +- concreteGuiManager.cpp | 2 +- map.cpp | 2 ++ minimapButton.h | 6 +++--- playerTradeButton.cpp | 2 +- tradingScreenButton.cpp | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/activeStateButton.cpp b/activeStateButton.cpp index 2a25bbb..275feec 100644 --- a/activeStateButton.cpp +++ b/activeStateButton.cpp @@ -18,7 +18,7 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - ActiveStateButton::ActiveStateButton(Vector3 pos, Vector2 size, string gs, string name, int trigger, string imagePath) : Button(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, true, imagePath), guiScreen(gs){ + ActiveStateButton::ActiveStateButton(Vector3 pos, Vector2 size, string gs, string name, string fontPath, int trigger, string imagePath) : Button(pos, size, name, fontPath, trigger, true, imagePath), guiScreen(gs){ StateManager *stateManager = GameManager::getSingleton()->getStateManager(); ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); diff --git a/activeStateButton.h b/activeStateButton.h index 2def462..48a7c14 100644 --- a/activeStateButton.h +++ b/activeStateButton.h @@ -6,7 +6,7 @@ namespace battleship{ class ActiveStateButton : public vb01Gui::Button{ public: - ActiveStateButton(vb01::Vector3, vb01::Vector2, std::string, std::string, int = -1, std::string = ""); + ActiveStateButton(vb01::Vector3, vb01::Vector2, std::string, std::string, std::string, int = -1, std::string = ""); void onClick(); private: std::string guiScreen = ""; diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index 563b87b..d8c950a 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -243,7 +243,7 @@ namespace battleship{ break; case ACTIVE_GAME_STATE: guiScreen = guiTable["guiScreen"]; - button = new ActiveStateButton(pos, size, guiScreen, name, (int)guiTable["trigger"], imagePath); + button = new ActiveStateButton(pos, size, guiScreen, name, fontBasePath + "batang.ttf", (int)guiTable["trigger"], imagePath); break; case PLAYER_TRADE: guiScreen = guiTable["guiScreen"]; diff --git a/map.cpp b/map.cpp index f752da0..79a94af 100755 --- a/map.cpp +++ b/map.cpp @@ -203,6 +203,8 @@ namespace battleship{ } void Map::Minimap::update(){ + if(!GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE)) return; + Button *mb = ConcreteGuiManager::getSingleton()->getButton("minimap"); updateImage(mb); updateCamFrame(mb); diff --git a/minimapButton.h b/minimapButton.h index 92f0802..bd6a402 100644 --- a/minimapButton.h +++ b/minimapButton.h @@ -1,16 +1,16 @@ #ifndef MINIMAP_BUTTON_H #define MINIMAP_BUTTON_H -#include +#include "activeStateButton.h" namespace vb01{ class Node; } namespace battleship{ - class MinimapButton : public vb01Gui::Button{ + class MinimapButton : public ActiveStateButton{ public: - MinimapButton(vb01::Vector3 pos, vb01::Vector2 size, std::string ip) : vb01Gui::Button(pos, size, "minimap", "", -1, true, ip){} + MinimapButton(vb01::Vector3 pos, vb01::Vector2 size, std::string ip) : ActiveStateButton(pos, size, "", "minimap", "", -1, ip){} ~MinimapButton(){} void onClick(); private: diff --git a/playerTradeButton.cpp b/playerTradeButton.cpp index b04e05a..2b6ce8b 100644 --- a/playerTradeButton.cpp +++ b/playerTradeButton.cpp @@ -13,7 +13,7 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - PlayerTradeButton::PlayerTradeButton(Vector3 pos, Vector2 size, string gs, string name, int trigger, string imagePath) : ActiveStateButton(pos, size, gs, name, trigger, imagePath){} + PlayerTradeButton::PlayerTradeButton(Vector3 pos, Vector2 size, string gs, string name, int trigger, string imagePath) : ActiveStateButton(pos, size, gs, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath){} void PlayerTradeButton::onClick(){ ActiveStateButton::onClick(); diff --git a/tradingScreenButton.cpp b/tradingScreenButton.cpp index 4a2fb95..09059f8 100644 --- a/tradingScreenButton.cpp +++ b/tradingScreenButton.cpp @@ -18,7 +18,7 @@ namespace battleship{ using namespace gameBase; TradingScreenButton::TradingScreenButton(Vector3 pos, Vector2 size, Listbox *lb, int plId, string gs, string name, int trigger, string imagePath) : - ActiveStateButton(pos, size, gs, name, trigger, imagePath), + ActiveStateButton(pos, size, gs, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath), listbox(lb), playerId(plId) {} From 8f4e5918c182c93011f82392c489b055a18371c2 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Fri, 27 Sep 2024 18:18:02 +0300 Subject: [PATCH 18/18] updated maps --- Assets/Models/Maps/111/minimap.jpg | Bin 0 -> 7040 bytes Assets/Models/Maps/222/minimap.jpg | Bin 0 -> 632 bytes Assets/Models/Maps/aaa/aaa.jpg | Bin 0 -> 50119 bytes Assets/Models/Maps/aaa/aaa.lua | 4004 + Assets/Models/Maps/aaa/aaa.xml | 122418 +++++++++++++++ Assets/Models/Maps/aaa/minimap.jpg | Bin 0 -> 1761 bytes Assets/Models/Maps/water/minimap.jpg | Bin 0 -> 7040 bytes Assets/Models/Maps/water/water.lua | 7 +- Assets/Scripts/GameObjects/Units/unitData.lua | 8 +- 9 files changed, 126431 insertions(+), 6 deletions(-) create mode 100644 Assets/Models/Maps/111/minimap.jpg create mode 100644 Assets/Models/Maps/222/minimap.jpg create mode 100755 Assets/Models/Maps/aaa/aaa.jpg create mode 100644 Assets/Models/Maps/aaa/aaa.lua create mode 100644 Assets/Models/Maps/aaa/aaa.xml create mode 100644 Assets/Models/Maps/aaa/minimap.jpg create mode 100644 Assets/Models/Maps/water/minimap.jpg diff --git a/Assets/Models/Maps/111/minimap.jpg b/Assets/Models/Maps/111/minimap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7faeb1f2547f596a7a16a179ccad90c7e0f2af5 GIT binary patch literal 7040 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 Q0;UEo1`P%X#r*#!02hzCng9R* literal 0 HcmV?d00001 diff --git a/Assets/Models/Maps/aaa/aaa.jpg b/Assets/Models/Maps/aaa/aaa.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a1451cce86fca9adc6bb3a41365ac05a09fb586a GIT binary patch literal 50119 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Models/Maps/aaa/minimap.jpg b/Assets/Models/Maps/aaa/minimap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7adee8ca9b78142b6a71ce16afb91e2bffd4e7ab GIT binary patch literal 1761 zcmc)IdpOf;902g&E^5{dO|gS6v-pK%g{9)8Y__K@wrP}Lj;Ll-gN!o}TmPdHUyk-{*b4&-=XZAK%aS`)ZzQ`T;#M zfkXfx5CDK^7oh0{lC-D)IW&&|eFWeFxWFL#08}3W(}!s4AlI}t>U^sV_$MGx7+h!0 zT!b!io*n>&z+g}~Oh*R}*S<{9-T`oZ9fK8iTjnhG^q;#j0);!3b`^nfy;W^UYaKIR zw?Fc||tJYj~!>sqKN1xL_9xbZBGyW`OmKO) ziAR)dbIbRl`LMS(2Pa1Ff0|Old4KafZtBlh)vUwiiK7!?FUU3(*yc}yy!&m;oWUw8 z-&h$D;-nZ#Fz?M9y$KRukPXsFw!xn=LXVe{{7$s&@tn53PJwPNiIl&YUz)ksrgi&) z(De-NA9UPe8}a2+A)Q4buSgHaP|w`(RpGN=ASjJP4f{`Q3~+%a`E=@v%!)yq-{6!(eup zgm>)X5of^;LwBD1_~jl@|F$X7w=zP`6+>7YpTvQ9Xpp?mwp?J9liw9W1E2H zMN{$*tQ&r2^{V*3;2{c?5#RavG5$F=CSvTyM*N_)vW6?RcDc*G-5}|?9^S(9Ul`z9Oqy42O z5`pkooCraAcl!$cp+E!hpA0x#PCx9b?->?wZpyiCM{->+KCf%3Y}$08`2{XIcYQii zcggtZfuCFx79obqN_`*VLwgz*i*18HgJK!i^Vr_ZY!OI!Q>@@|JE|o8er7joyM5P2 ze^R>^_#9`BD>&{g?0r*JSPOFG*$$@_;C0ST;)Wdeyt^>Lk+*lXw!IG;y5N?$^4d zkx^JcrO+i;9T$=%YjVg@{Q5Z3C6%#R2rb!h0i{jctbR3g$$t%E zlfzQYIRvQGz|NaqGoYp@L}a`4=lM~zYX2fdbVzHGg^e#)YT30#@wJOOzz-*gru%Q+ CrPp)- literal 0 HcmV?d00001 diff --git a/Assets/Models/Maps/water/minimap.jpg b/Assets/Models/Maps/water/minimap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7faeb1f2547f596a7a16a179ccad90c7e0f2af5 GIT binary patch literal 7040 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