diff --git a/CMakeLists.txt b/CMakeLists.txt index fb0f43972..be871596c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,7 +255,8 @@ if(ENABLE_CUDA) Simulator/Edges/Neuro/AllSpikingSynapses_d.cpp Simulator/Edges/Neuro/AllSTDPSynapses_d.cpp Simulator/Edges/Neuro/AllDSSynapses_d.cpp - Simulator/Edges/Neuro/AllDynamicSTDPSynapses_d.cpp) + Simulator/Edges/Neuro/AllDynamicSTDPSynapses_d.cpp + Simulator/Edges/NG911/All911Edges_d.cpp) set_source_files_properties(${cuda_EdgesSources} PROPERTIES LANGUAGE CUDA) set(cuda_VerticesSources @@ -263,7 +264,8 @@ if(ENABLE_CUDA) Simulator/Vertices/Neuro/AllLIFNeurons_d.cpp Simulator/Vertices/Neuro/AllIZHNeurons_d.cpp Simulator/Vertices/Neuro/AllIFNeurons_d.cpp - Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp) + Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp + Simulator/Vertices/NG911/All911Vertices_d.cpp) set_source_files_properties(${cuda_VerticesSources} PROPERTIES LANGUAGE CUDA) endif() @@ -295,6 +297,7 @@ else() list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllIZHNeurons_d.cpp") list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllIFNeurons_d.cpp") list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp") + list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/NG911/All911Vertices_d.cpp") add_library(Vertices STATIC ${Vertices_Source}) @@ -313,6 +316,7 @@ else() list(REMOVE_ITEM Edges_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Edges/Neuro/AllSTDPSynapses_d.cpp") list(REMOVE_ITEM Edges_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Edges/Neuro/AllDSSynapses_d.cpp") list(REMOVE_ITEM Edges_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Edges/Neuro/AllDynamicSTDPSynapses_d.cpp") + list(REMOVE_ITEM Edges_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Edges/NG911/All911Edges_d.cpp") add_library(Edges STATIC ${Edges_Source}) diff --git a/Simulator/Connections/NG911/Connections911.cpp b/Simulator/Connections/NG911/Connections911.cpp index a478d4b1e..a32162969 100644 --- a/Simulator/Connections/NG911/Connections911.cpp +++ b/Simulator/Connections/NG911/Connections911.cpp @@ -96,52 +96,6 @@ bool Connections911::updateConnections() } -/// Finds the outgoing edge from the given vertex to the Responder closest to -/// the emergency call location -BGSIZE Connections911::getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx) -{ - All911Edges &edges911 = dynamic_cast(*edges_); - - vertexType requiredType; - if (call.type == "Law") - requiredType = vertexType::LAW; - else if (call.type == "EMS") - requiredType = vertexType::EMS; - else if (call.type == "Fire") - requiredType = vertexType::FIRE; - - // loop over the outgoing edges looking for the responder with the shortest - // Euclidean distance to the call's location. - BGSIZE startOutEdg = synapseIndexMap_->outgoingEdgeBegin_[vertexIdx]; - BGSIZE outEdgCount = synapseIndexMap_->outgoingEdgeCount_[vertexIdx]; - Layout911 &layout911 - = dynamic_cast(Simulator::getInstance().getModel().getLayout()); - - BGSIZE resp, respEdge; - double minDistance = numeric_limits::max(); - for (BGSIZE eIdxMap = startOutEdg; eIdxMap < startOutEdg + outEdgCount; ++eIdxMap) { - BGSIZE outEdg = synapseIndexMap_->outgoingEdgeIndexMap_[eIdxMap]; - assert(edges911.inUse_[outEdg]); // Edge must be in use - - BGSIZE dstVertex = edges911.destVertexIndex_[outEdg]; - if (layout911.vertexTypeMap_[dstVertex] == requiredType) { - double distance = layout911.getDistance(dstVertex, call.x, call.y); - - if (distance < minDistance) { - minDistance = distance; - resp = dstVertex; - respEdge = outEdg; - } - } - } - - // We must have found the closest responder of the right type - assert(minDistance < numeric_limits::max()); - assert(layout911.vertexTypeMap_[resp] == requiredType); - return respEdge; -} - - /// Randomly delete 1 PSAP and rewire all the edges around it. bool Connections911::erasePSAP(AllVertices &vertices, Layout &layout) { diff --git a/Simulator/Connections/NG911/Connections911.h b/Simulator/Connections/NG911/Connections911.h index cfb4be2dd..16b8c4947 100644 --- a/Simulator/Connections/NG911/Connections911.h +++ b/Simulator/Connections/NG911/Connections911.h @@ -79,14 +79,6 @@ class Connections911 : public Connections { /// @return true if successful, false otherwise. virtual bool updateConnections() override; - /// Finds the outgoing edge from the given vertex to the Responder closest to - /// the emergency call location - /// - /// @param call The call that needs a Responder - /// @param vertexIdx The index of the vertex serving the call (A PSAP) - /// @return The index of the outgoing edge to the closest Responder - BGSIZE getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx); - /// Returns the complete list of all deleted or added edges as a string. /// @return xml representation of all deleted or added edges string changedEdgesToXML(bool added); diff --git a/Simulator/Core/FunctionNodes/GenericFunctionNode.h b/Simulator/Core/FunctionNodes/GenericFunctionNode.h index 7f149890b..ab0c79c42 100644 --- a/Simulator/Core/FunctionNodes/GenericFunctionNode.h +++ b/Simulator/Core/FunctionNodes/GenericFunctionNode.h @@ -23,7 +23,13 @@ class GenericFunctionNode : public IFunctionNode { ~GenericFunctionNode() = default; /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. - bool invokeFunction(const Operations &operation) const override; + virtual bool invokeFunction(const Operations &operation) const override; + + /// TODO: Remove when IFunctionNode supports functions with non-empty signatures + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, uint64_t arg2) const + { + return false; + } private: std::function function_; ///< Stored function. diff --git a/Simulator/Core/FunctionNodes/IFunctionNode.h b/Simulator/Core/FunctionNodes/IFunctionNode.h index dca3629aa..ff9f887f2 100644 --- a/Simulator/Core/FunctionNodes/IFunctionNode.h +++ b/Simulator/Core/FunctionNodes/IFunctionNode.h @@ -10,6 +10,7 @@ #pragma once #include "Operations.h" +#include ///for uint64_t using namespace std; @@ -18,9 +19,14 @@ class IFunctionNode { /// Destructor. virtual ~IFunctionNode() = default; + /// TODO: Need to refactor to allow for passing in arguments. Otherwise, FunctionNode classes can not support + /// non-empty signatures. /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. virtual bool invokeFunction(const Operations &operation) const = 0; + /// Invokes the stored function using the two arguments as input + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, uint64_t arg2) const = 0; + protected: /// The operation type of the stored function. Operations operationType_; diff --git a/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp new file mode 100644 index 000000000..d851295f0 --- /dev/null +++ b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp @@ -0,0 +1,33 @@ +/** + * @file TwoUint64ArgFunctionNode.cpp + * + * @ingroup Simulator/Core/FunctionNodes + * + * @brief Stores a function with two uint64_t args to invoke. Used by operation manager to store functions to defined by an operation type. + * + * Function Signature supported : void (uint64_t,uint64_t) + * + */ + +#include "TwoUint64ArgFunctionNode.h" +#include "Operations.h" +#include + +/// Constructor, Function Signature: void (uint64_t, uint64_t) +TwoUint64ArgFunctionNode::TwoUint64ArgFunctionNode( + const Operations &operation, const std::function &func) +{ + operationType_ = operation; + function_ = func; +} + +/// Invokes the stored function if the sent operation type matches the operation type the function is stored as. +bool TwoUint64ArgFunctionNode::invokeFunction(const Operations &operation, uint64_t arg1, + uint64_t arg2) const +{ + if (operation == operationType_) { + __invoke(function_, arg1, arg2); + return true; + } + return false; +} \ No newline at end of file diff --git a/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h new file mode 100644 index 000000000..d1ff8336f --- /dev/null +++ b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h @@ -0,0 +1,38 @@ +/** + * @file TwoUint64ArgFunctionNode.h + * + * @ingroup Simulator/Core/FunctionNodes + * + * @brief Stores a function with two uint64_t args to invoke. Used by operation manager to store functions to defined by an operation type. + * + */ + +#pragma once + +#include "IFunctionNode.h" +#include + +using namespace std; + +class TwoUint64ArgFunctionNode : public IFunctionNode { +public: + /// Constructor, Function Signature: void () + TwoUint64ArgFunctionNode(const Operations &operationType, + const std::function &function); + + /// Destructor + ~TwoUint64ArgFunctionNode() = default; + + /// TODO: Remove when IFunctionNode supports functions with non-empty signatures + virtual bool invokeFunction(const Operations &operation) const + { + return false; + } + + /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, + uint64_t arg2) const override; + +private: + std::function function_; ///< Stored function. +}; diff --git a/Simulator/Core/GPUModel.cpp b/Simulator/Core/GPUModel.cpp index d78fdbc24..364ba0a9c 100644 --- a/Simulator/Core/GPUModel.cpp +++ b/Simulator/Core/GPUModel.cpp @@ -12,6 +12,7 @@ #include "AllVertices.h" #include "Connections.h" #include "Global.h" +#include "MersenneTwister_d.h" #include "OperationManager.h" #ifdef VALIDATION_MODE @@ -52,12 +53,15 @@ GPUModel::GPUModel() : void GPUModel::allocDeviceStruct() { // Allocate memory for random noise array - int numVertices = Simulator::getInstance().getTotalVertices(); - BGSIZE randNoise_d_size = numVertices * sizeof(float); // size of random noise array + int numVerticesNeedingNoise = layout_->getVertices().getNumberOfVerticesNeedingDeviceNoise(); + int numberOfNoiseElements = roundUpNumberOfNoiseElements(numVerticesNeedingNoise); + LOG4CPLUS_DEBUG(fileLogger_, + "Number of elements allocated for noise: " << numberOfNoiseElements); + BGSIZE randNoise_d_size = numberOfNoiseElements * sizeof(float); // size of random noise array HANDLE_ERROR(cudaMalloc((void **)&randNoise_d, randNoise_d_size)); // Allocate synapse inverse map in device memory - allocEdgeIndexMap(numVertices); + allocEdgeIndexMap(Simulator::getInstance().getTotalVertices()); } /// Copies device memories to host memories and deallocates them. @@ -91,9 +95,20 @@ void GPUModel::setupSim() int rng_blocks = 25; //# of blocks the kernel will use int rng_nPerRng = 4; //# of iterations per thread (thread granularity, # of rands generated per thread) - int rng_mt_rng_count = Simulator::getInstance().getTotalVertices() - / rng_nPerRng; //# of threads to generate for numVertices rand #s + int numVerticesNeedingNoise = layout_->getVertices().getNumberOfVerticesNeedingDeviceNoise(); + int numberOfNoiseElements = roundUpNumberOfNoiseElements(numVerticesNeedingNoise); + int rng_mt_rng_count + = numberOfNoiseElements / rng_nPerRng; //# of threads to generate for numVertices rand #s + assert(rng_mt_rng_count <= MT_RNG_COUNT); int rng_threads = rng_mt_rng_count / rng_blocks; //# threads per block needed + LOG4CPLUS_DEBUG(fileLogger_, "initMTGPU state: " << endl + << "Noise seed: " + << Simulator::getInstance().getNoiseRngSeed() + << endl + << "RNG_blocks: " << rng_blocks << endl + << "RNG_threads: " << rng_threads << endl + << "RNG_nPerRng: " << rng_nPerRng << endl + << "Count: " << rng_mt_rng_count); initMTGPU(Simulator::getInstance().getNoiseRngSeed(), rng_blocks, rng_threads, rng_nPerRng, rng_mt_rng_count); @@ -165,7 +180,6 @@ void GPUModel::advance() cudaLapTime(t_gpu_rndGeneration); cudaStartTimer(); #endif // PERFORMANCE_METRICS - // display running info to console // Advance vertices -------------> vertices.advanceVertices(edges, allVerticesDevice_, allEdgesDevice_, randNoise_d, @@ -217,7 +231,6 @@ void GPUModel::advance() cudaLapTime(t_gpu_advanceSynapses); cudaStartTimer(); #endif // PERFORMANCE_METRICS - // integrate the inputs of the vertices vertices.integrateVertexInputs(allVerticesDevice_, edgeIndexMapDevice_, allEdgesDevice_); @@ -342,4 +355,16 @@ AllVerticesDeviceProperties *&GPUModel::getAllVerticesDevice() AllEdgesDeviceProperties *&GPUModel::getAllEdgesDevice() { return allEdgesDevice_; +} + +int GPUModel::roundUpNumberOfNoiseElements(int input) +{ + // MersenneTwister requires the number of elements to be 100 or more and a multiple of 100 + // To deal with this, we take the input and round it up to the nearest multiple of 100. + assert(input > 0); + // Already a multiple of 100 so return + if (input % 100 == 0) + return input; + // Return the next highest multiple of 100 + return ((input + 99) / 100) * 100; } \ No newline at end of file diff --git a/Simulator/Core/GPUModel.h b/Simulator/Core/GPUModel.h index 0a9562e40..01fdcace3 100644 --- a/Simulator/Core/GPUModel.h +++ b/Simulator/Core/GPUModel.h @@ -112,6 +112,10 @@ class GPUModel : public Model { /// Deallocates device memories. virtual void deleteDeviceStruct(); + /// Takes the input and returns a rounded up number of elements to + /// use for generating device noise. + int roundUpNumberOfNoiseElements(int input); + /// Pointer to device random noise array. float *randNoise_d; diff --git a/Simulator/Core/OperationManager.cpp b/Simulator/Core/OperationManager.cpp index 7cd1222b4..87a14afa7 100644 --- a/Simulator/Core/OperationManager.cpp +++ b/Simulator/Core/OperationManager.cpp @@ -13,6 +13,7 @@ #include "OperationManager.h" #include "GenericFunctionNode.h" +#include "TwoUint64ArgFunctionNode.h" #include #include #include @@ -40,6 +41,22 @@ void OperationManager::registerOperation(const Operations &operation, } } +/// @brief Handles function signature: void (uint64_t,uint64_t). +/// @param operation The Operation type that will use the input function. +/// @param function The function invoked for the operation. Takes in two arguments of type uint64_t +void OperationManager::registerOperation(const Operations &operation, + const function &function) +{ + try { + functionList_.push_back( + unique_ptr(new TwoUint64ArgFunctionNode(operation, function))); + } catch (exception e) { + LOG4CPLUS_FATAL(logger_, string(e.what()) + + ". Push back failed in OperationManager::registerOperation"); + throw runtime_error(string(e.what()) + " in OperationManager::registerOperation"); + } +} + /// Takes in a operation type and invokes all registered functions that are classified as that operation type. void OperationManager::executeOperation(const Operations &operation) const { @@ -47,6 +64,21 @@ void OperationManager::executeOperation(const Operations &operation) const if (functionList_.size() > 0) { for (auto i = functionList_.begin(); i != functionList_.end(); ++i) { (*i)->invokeFunction(operation); + //TODO: Throw fatal if false + } + } +} + +/// Take in a operation type and invokes all registered functions that are classified as that operation type using the input arguments. +void OperationManager::executeOperation(const Operations &operation, uint64_t arg1, + uint64_t arg2) const +{ + LOG4CPLUS_INFO(logger_, "Executing operation " + operationToString(operation)); + /// TODO: Should we check anything about arg1 and arg2 before passing to the invoke??? + if (functionList_.size() > 0) { + for (auto i = functionList_.begin(); i != functionList_.end(); ++i) { + (*i)->invokeFunction(operation, arg1, arg2); + //TODO: Throw fatal if false } } } @@ -73,6 +105,8 @@ string OperationManager::operationToString(const Operations &operation) const return "copyFromGPU"; case Operations::allocateGPU: return "allocateGPU"; + case Operations::loadEpochInputs: + return "loadEpochInputs"; default: return "Operation isn't in OperationManager::operationToString()"; } diff --git a/Simulator/Core/OperationManager.h b/Simulator/Core/OperationManager.h index e85b00993..94c9eae98 100644 --- a/Simulator/Core/OperationManager.h +++ b/Simulator/Core/OperationManager.h @@ -35,9 +35,16 @@ class OperationManager { /// Handles function signature: void () void registerOperation(const Operations &operation, const function &function); + /// Handles function signature: void (uint64_t,uint64_t) + void registerOperation(const Operations &operation, + const function &function); + /// Takes in a operation type and invokes all registered functions that are classified as that operation type. void executeOperation(const Operations &operation) const; + /// Take in a operation type and invokes all registered functions that are classified as that operation type using the input arguments. + void executeOperation(const Operations &operation, uint64_t arg1, uint64_t arg2) const; + /// Takes in the operation enum and returns the enum as a string. Used for debugging purposes. string operationToString(const Operations &operation) const; diff --git a/Simulator/Core/Operations.h b/Simulator/Core/Operations.h index 27b5c4ff2..112cfaba3 100644 --- a/Simulator/Core/Operations.h +++ b/Simulator/Core/Operations.h @@ -22,5 +22,6 @@ enum class Operations { copyToGPU, copyFromGPU, allocateGPU, - registerHistoryVariables + registerHistoryVariables, + loadEpochInputs }; \ No newline at end of file diff --git a/Simulator/Core/Simulator.cpp b/Simulator/Core/Simulator.cpp index e4a42d9df..5cd575612 100644 --- a/Simulator/Core/Simulator.cpp +++ b/Simulator/Core/Simulator.cpp @@ -188,7 +188,8 @@ void Simulator::advanceEpoch(int currentEpoch) const uint64_t count = 0; // Compute step number at end of this simulation epoch uint64_t endStep = g_simulationStep + static_cast(epochDuration_ / deltaT_); - model_->getLayout().getVertices().loadEpochInputs(g_simulationStep, endStep); + OperationManager::getInstance().executeOperation(Operations::loadEpochInputs, g_simulationStep, + endStep); // DEBUG_MID(model->logSimStep();) // Generic model debug call uint64_t onePercent = (epochDuration_ / deltaT_) * numEpochs_ * 0.01; while (g_simulationStep < endStep) { diff --git a/Simulator/Edges/AllEdges.h b/Simulator/Edges/AllEdges.h index 69f9e8f7c..ccc49308a 100644 --- a/Simulator/Edges/AllEdges.h +++ b/Simulator/Edges/AllEdges.h @@ -143,17 +143,6 @@ class AllEdges { /// Set some parameters used for advanceEdgesDevice. virtual void setAdvanceEdgesDeviceParams() = 0; - /// TODO: Clean up this comment to remove synapses reference since this is neuro-specific - /// Set edge class ID defined by enumClassSynapses for the caller's Edge class. - /// The class ID will be set to classSynapses_d in device memory, - /// and the classSynapses_d will be referred to call a device function for the - /// particular edge class. - /// Because we cannot use virtual function (Polymorphism) in device functions, - /// we use this scheme. - /// Note: we used to use a function pointer; however, it caused the growth_cuda crash - /// (see issue#137). - virtual void setEdgeClassID() = 0; - /// Prints GPU edgesProps data. /// /// @param allEdgesDeviceProps GPU address of the corresponding AllEdgesDeviceProperties struct on device memory. diff --git a/Simulator/Edges/NG911/All911Edges.cpp b/Simulator/Edges/NG911/All911Edges.cpp index 905416675..51eb5558b 100644 --- a/Simulator/Edges/NG911/All911Edges.cpp +++ b/Simulator/Edges/NG911/All911Edges.cpp @@ -21,11 +21,9 @@ void All911Edges::setupEdges() BGSIZE maxTotalEdges = maxEdgesPerVertex_ * countVertices_; if (maxTotalEdges > 0) { - isAvailable_ = make_unique(maxTotalEdges); - fill_n(isAvailable_.get(), maxTotalEdges, true); + isAvailable_.assign(maxTotalEdges, true); - isRedial_ = make_unique(maxTotalEdges); - fill_n(isRedial_.get(), maxTotalEdges, false); + isRedial_.assign(maxTotalEdges, false); call_.resize(maxTotalEdges); } diff --git a/Simulator/Edges/NG911/All911Edges.h b/Simulator/Edges/NG911/All911Edges.h index 505972266..31ed01453 100644 --- a/Simulator/Edges/NG911/All911Edges.h +++ b/Simulator/Edges/NG911/All911Edges.h @@ -29,7 +29,7 @@ #include "AllEdges.h" -struct All911EdgeDeviceProperties; +struct All911EdgesDeviceProperties; class All911Edges : public AllEdges { public: @@ -65,20 +65,55 @@ class All911Edges : public AllEdges { // GPU functionality for 911 simulation is unimplemented. // These signatures are required to make the class non-abstract public: - virtual void allocEdgeDeviceStruct() {}; + virtual void allocEdgeDeviceStruct() override; virtual void allocEdgeDeviceStruct(void **allEdgesDevice, int numVertices, - int maxEdgesPerVertex) {}; - virtual void deleteEdgeDeviceStruct() {}; - virtual void copyEdgeHostToDevice() {}; - virtual void copyEdgeHostToDevice(void *allEdgesDevice, int numVertices, int maxEdgesPerVertex) { - }; - virtual void copyEdgeDeviceToHost() {}; - virtual void copyDeviceEdgeCountsToHost(void *allEdgesDevice) {}; + int maxEdgesPerVertex) override; + virtual void deleteEdgeDeviceStruct() override; + virtual void copyEdgeHostToDevice() override; + virtual void copyEdgeHostToDevice(void *allEdgesDevice, int numVertices, + int maxEdgesPerVertex) override; + virtual void copyEdgeDeviceToHost() override; + virtual void copyDeviceEdgeCountsToHost(void *allEdgesDevice) override; virtual void advanceEdges(void *allEdgesDevice, void *allVerticesDevice, - void *edgeIndexMapDevice) {}; - virtual void setAdvanceEdgesDeviceParams() {}; - virtual void setEdgeClassID() {}; - virtual void printGPUEdgesProps(void *allEdgesDeviceProps) const {}; + void *edgeIndexMapDevice) override; + virtual void setAdvanceEdgesDeviceParams() override; + virtual void printGPUEdgesProps(void *allEdgesDeviceProps) const override; + +protected: + /// Allocate GPU memories to store all edges' states, + /// and copy them from host to GPU memory. + /// (Helper function of allocEdgeDeviceStruct) + /// + /// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct + /// on device memory. + /// @param numVertices Number of vertices. + /// @param maxEdgesPerVertex Maximum number of edges per vertex. + void allocDeviceStruct(All911EdgesDeviceProperties &allEdgesDevice, int numVertices, + int maxEdgesPerVertex); + + /// Delete GPU memories. + /// (Helper function of deleteEdgeDeviceStruct) + /// + /// @param allEdgesDeviceProps GPU address of the All911EdgesDeviceProperties struct + /// on device memory. + void deleteDeviceStruct(All911EdgesDeviceProperties &allEdgesDeviceProps); + + /// Copy all edges' data from host to device. + /// (Helper function of copyEdgeHostToDevice) + /// + /// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct on device memory. + /// @param allEdgesDeviceProps CPU address of the All911EdgesDeviceProperties struct on host memory. + /// @param numVertices Number of vertices. + /// @param maxEdgesPerVertex Maximum number of edges per vertex. + void copyHostToDevice(void *allEdgesDevice, All911EdgesDeviceProperties &allEdgesDeviceProps, + int numVertices, int maxEdgesPerVertex); + + /// Copy all edge data from device to host. + /// (Helper function of copyEdgeDeviceToHost) + /// + /// @param allEdgesProperties GPU address of the All911EdgesDeviceProperties struct + /// on device memory. + void copyDeviceToHost(All911EdgesDeviceProperties &allEdgesDeviceProps); #else // !defined(USE_GPU) public: @@ -98,13 +133,47 @@ class All911Edges : public AllEdges { virtual void advanceEdge(BGSIZE iEdg, AllVertices &vertices) override {}; #endif +public: + /// If edge has a call or not. Store 1 (true) or 0 (false) + vector isAvailable_; - /// If edge has a call or not - unique_ptr isAvailable_; - - /// If the call in the edge is a redial - unique_ptr isRedial_; + /// If the call in the edge is a redial. Store 1 (true) or 0 (false) + vector isRedial_; /// The call information per edge vector call_; -}; \ No newline at end of file +}; + +#if defined(USE_GPU) +struct All911EdgesDeviceProperties : public AllEdgesDeviceProperties { + /// If edge has a call or not. Store 1 (true) or 0 (false) + unsigned char *isAvailable_; + + /// If the call in the edge is a redial. Store 1 (true) or 0 (false) + unsigned char *isRedial_; + + /// The call information per edge + // + // The vertexId where the input event happened + int *vertexId_; + + // The start of the event since the beggining of + // the simulation in timesteps matches g_simulationStep type + uint64_t *time_; + + // The duration of the event in timesteps + int *duration_; + + // Event location + BGFLOAT *x_; + BGFLOAT *y_; + + // Patience time: How long a customer is willing to wait in the queue + int *patience_; + + // On Site Time: Time spent by a responder at the site of the incident + int *onSiteTime_; + // Use int type instead of string to make using on GPU easier + int *responderType_; +}; +#endif //defined(USE_GPU) \ No newline at end of file diff --git a/Simulator/Edges/NG911/All911Edges_d.cpp b/Simulator/Edges/NG911/All911Edges_d.cpp new file mode 100644 index 000000000..757c91556 --- /dev/null +++ b/Simulator/Edges/NG911/All911Edges_d.cpp @@ -0,0 +1,580 @@ +/** + * @file All911Edges_d.cpp + * + * @ingroup Simulator/Edges/NG911 + * + * @brief Specialization of the AllEdges class for the NG911 network + */ + +#include "All911Edges.h" +#include "Book.h" +#include "GPUModel.h" + +/// Allocate GPU memories to store all edge states, +/// and copy them from host to GPU memory. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::allocEdgeDeviceStruct() +{ + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void **allEdgesDevice = reinterpret_cast(&(gpuModel->getAllEdgesDevice())); + allocEdgeDeviceStruct(allEdgesDevice, Simulator::getInstance().getTotalVertices(), + Simulator::getInstance().getMaxEdgesPerVertex()); +} + +/// Allocate GPU memories to store all edge states, +/// and copy them from host to GPU memory. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +/// @param numVertices Number of vertices. +/// @param maxEdgesPerVertex Maximum number of edges per vertex. +void All911Edges::allocEdgeDeviceStruct(void **allEdgesDevice, int numVertices, + int maxEdgesPerVertex) +{ + LOG4CPLUS_DEBUG(edgeLogger_, + "Size of 911 edges device: " << sizeof(All911EdgesDeviceProperties)); + LOG4CPLUS_DEBUG(edgeLogger_, "maxTotalEdges: " << maxEdgesPerVertex * numVertices); + LOG4CPLUS_DEBUG(edgeLogger_, "Size of edgetype: " << sizeof(edgeType)); + All911EdgesDeviceProperties allEdges; + allocDeviceStruct(allEdges, numVertices, maxEdgesPerVertex); + HANDLE_ERROR(cudaMalloc(allEdgesDevice, sizeof(All911EdgesDeviceProperties))); + HANDLE_ERROR(cudaMemcpy(*allEdgesDevice, &allEdges, sizeof(All911EdgesDeviceProperties), + cudaMemcpyHostToDevice)); +} + +/// Allocate GPU memories to store all edges' states, +/// and copy them from host to GPU memory. +/// (Helper function of allocEdgeDeviceStruct) +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +/// @param numVertices Number of vertices. +/// @param maxEdgesPerVertex Maximum number of edges per vertex. +void All911Edges::allocDeviceStruct(All911EdgesDeviceProperties &allEdgesDevice, int numVertices, + int maxEdgesPerVertex) +{ + BGSIZE maxTotalEdges = maxEdgesPerVertex * numVertices; + HANDLE_ERROR( + cudaMalloc((void **)&allEdgesDevice.sourceVertexIndex_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.destVertexIndex_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.W_, maxTotalEdges * sizeof(BGFLOAT))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.type_, maxTotalEdges * sizeof(edgeType))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.inUse_, maxTotalEdges * sizeof(unsigned char))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.edgeCounts_, numVertices * sizeof(BGSIZE))); + HANDLE_ERROR( + cudaMalloc((void **)&allEdgesDevice.isAvailable_, maxTotalEdges * sizeof(unsigned char))); + HANDLE_ERROR( + cudaMalloc((void **)&allEdgesDevice.isRedial_, maxTotalEdges * sizeof(unsigned char))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.vertexId_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.time_, maxTotalEdges * sizeof(uint64_t))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.duration_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.x_, maxTotalEdges * sizeof(BGFLOAT))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.y_, maxTotalEdges * sizeof(BGFLOAT))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.patience_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.onSiteTime_, maxTotalEdges * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allEdgesDevice.responderType_, maxTotalEdges * sizeof(int))); +} + +/// Delete GPU memories. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::deleteEdgeDeviceStruct() +{ + All911EdgesDeviceProperties allEdgesDeviceProps; + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void *allEdgesDevice = static_cast(gpuModel->getAllEdgesDevice()); + HANDLE_ERROR(cudaMemcpy(&allEdgesDeviceProps, allEdgesDevice, + sizeof(All911EdgesDeviceProperties), cudaMemcpyDeviceToHost)); + deleteDeviceStruct(allEdgesDeviceProps); + HANDLE_ERROR(cudaFree(allEdgesDevice)); +} + +/// Delete GPU memories. +/// (Helper function of deleteEdgeDeviceStruct) +/// +/// @param allEdgesDeviceProps GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::deleteDeviceStruct(All911EdgesDeviceProperties &allEdgesDeviceProps) +{ + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.sourceVertexIndex_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.destVertexIndex_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.W_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.type_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.inUse_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.edgeCounts_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.isAvailable_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.isRedial_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.vertexId_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.time_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.duration_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.x_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.y_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.patience_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.onSiteTime_)); + HANDLE_ERROR(cudaFree(allEdgesDeviceProps.responderType_)); +} + +/// Copy all edge data from host to device. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::copyEdgeHostToDevice() +{ + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void *allEdgesDevice = static_cast(gpuModel->getAllEdgesDevice()); + copyEdgeHostToDevice(allEdgesDevice, Simulator::getInstance().getTotalVertices(), + Simulator::getInstance().getMaxEdgesPerVertex()); +} + +/// Copy all edge data from host to device. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +/// @param numVertices Number of vertices. +/// @param maxEdgesPerVertex Maximum number of edges per vertex. +void All911Edges::copyEdgeHostToDevice(void *allEdgesDevice, int numVertices, int maxEdgesPerVertex) +{ // copy everything necessary + All911EdgesDeviceProperties allEdgesDeviceProps; + HANDLE_ERROR(cudaMemcpy(&allEdgesDeviceProps, allEdgesDevice, + sizeof(All911EdgesDeviceProperties), cudaMemcpyDeviceToHost)); + copyHostToDevice(allEdgesDevice, allEdgesDeviceProps, numVertices, maxEdgesPerVertex); +} + +/// Copy all edges' data from host to device. +/// (Helper function of copyEdgeHostToDevice) +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct on device memory. +/// @param allEdgesDeviceProps CPU address of the All911EdgesDeviceProperties struct on host memory. +/// @param numVertices Number of vertices. +/// @param maxEdgesPerVertex Maximum number of edges per vertex. +void All911Edges::copyHostToDevice(void *allEdgesDevice, + All911EdgesDeviceProperties &allEdgesDeviceProps, + int numVertices, int maxEdgesPerVertex) +{ + LOG4CPLUS_DEBUG(edgeLogger_, "Copying 911Edges to device"); + BGSIZE maxTotalEdges = maxEdgesPerVertex * numVertices; + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.sourceVertexIndex_, sourceVertexIndex_.data(), + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.destVertexIndex_, destVertexIndex_.data(), + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.W_, W_.data(), maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.type_, type_.data(), + maxTotalEdges * sizeof(edgeType), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.inUse_, inUse_.data(), + maxTotalEdges * sizeof(unsigned char), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.edgeCounts_, edgeCounts_.data(), + numVertices * sizeof(BGSIZE), cudaMemcpyHostToDevice)); + allEdgesDeviceProps.totalEdgeCount_ = totalEdgeCount_; + allEdgesDeviceProps.maxEdgesPerVertex_ = maxEdgesPerVertex_; + allEdgesDeviceProps.countVertices_ = countVertices_; + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.isAvailable_, isAvailable_.data(), + maxTotalEdges * sizeof(unsigned char), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.isRedial_, isRedial_.data(), + maxTotalEdges * sizeof(unsigned char), cudaMemcpyHostToDevice)); + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuVertexId = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuVertexId[i] = call_[i].vertexId; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.vertexId_, cpuVertexId, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuVertexId; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + uint64_t *cpuTime = new uint64_t[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuTime[i] = call_[i].time; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.time_, cpuTime, maxTotalEdges * sizeof(uint64_t), + cudaMemcpyHostToDevice)); + delete[] cpuTime; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuDuration = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuDuration[i] = call_[i].duration; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.duration_, cpuDuration, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuDuration; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuX = new BGFLOAT[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuX[i] = call_[i].x; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.x_, cpuX, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyHostToDevice)); + delete[] cpuX; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuY = new BGFLOAT[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuY[i] = call_[i].y; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.y_, cpuY, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyHostToDevice)); + delete[] cpuY; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuPatience = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuPatience[i] = call_[i].patience; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.patience_, cpuPatience, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuPatience; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuOnSiteTime = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuOnSiteTime[i] = call_[i].onSiteTime; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.onSiteTime_, cpuOnSiteTime, + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + delete[] cpuOnSiteTime; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuResponderType = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + if (call_[i].type == "Law") + cpuResponderType[i] = 7; + else if (call_[i].type == "EMS") + cpuResponderType[i] = 5; + else if (call_[i].type == "Fire") + cpuResponderType[i] = 6; + } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.responderType_, cpuResponderType, + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + delete[] cpuResponderType; + + HANDLE_ERROR(cudaMemcpy(allEdgesDevice, &allEdgesDeviceProps, + sizeof(All911EdgesDeviceProperties), cudaMemcpyHostToDevice)); + // Set countVertices_ to 0 to avoid illegal memory deallocation + // at All911Edges deconstructor. + allEdgesDeviceProps.countVertices_ = 0; +} + + +/// Copy all edge data from device to host. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::copyEdgeDeviceToHost() +{ + // copy everything necessary + All911EdgesDeviceProperties allEdgesDeviceProps; + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void *allEdgesDevice = static_cast(gpuModel->getAllEdgesDevice()); + HANDLE_ERROR(cudaMemcpy(&allEdgesDeviceProps, allEdgesDevice, + sizeof(All911EdgesDeviceProperties), cudaMemcpyDeviceToHost)); + copyDeviceToHost(allEdgesDeviceProps); +} + +/// Copy all edge data from device to host. +/// (Helper function of copyEdgeDeviceToHost) +/// +/// @param allEdgesProperties GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::copyDeviceToHost(All911EdgesDeviceProperties &allEdgesDeviceProps) +{ + int numVertices = Simulator::getInstance().getTotalVertices(); + BGSIZE maxTotalEdges = Simulator::getInstance().getMaxEdgesPerVertex() * numVertices; + HANDLE_ERROR(cudaMemcpy(sourceVertexIndex_.data(), allEdgesDeviceProps.sourceVertexIndex_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(destVertexIndex_.data(), allEdgesDeviceProps.destVertexIndex_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(W_.data(), allEdgesDeviceProps.W_, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(type_.data(), allEdgesDeviceProps.type_, + maxTotalEdges * sizeof(edgeType), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(inUse_.data(), allEdgesDeviceProps.inUse_, + maxTotalEdges * sizeof(unsigned char), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(edgeCounts_.data(), allEdgesDeviceProps.edgeCounts_, + numVertices * sizeof(BGSIZE), cudaMemcpyDeviceToHost)); + totalEdgeCount_ = allEdgesDeviceProps.totalEdgeCount_; + maxEdgesPerVertex_ = allEdgesDeviceProps.maxEdgesPerVertex_; + countVertices_ = allEdgesDeviceProps.countVertices_; + // Set countVertices_ to 0 to avoid illegal memory deallocation + // at All911Edges deconstructor. + allEdgesDeviceProps.countVertices_ = 0; + HANDLE_ERROR(cudaMemcpy(isAvailable_.data(), allEdgesDeviceProps.isAvailable_, + maxTotalEdges * sizeof(unsigned char), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(isRedial_.data(), allEdgesDeviceProps.isRedial_, + maxTotalEdges * sizeof(unsigned char), cudaMemcpyDeviceToHost)); + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuVertexId = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuVertexId, allEdgesDeviceProps.vertexId_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].vertexId = cpuVertexId[i]; + } + delete[] cpuVertexId; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + uint64_t *cpuTime = new uint64_t[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuTime, allEdgesDeviceProps.time_, maxTotalEdges * sizeof(uint64_t), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].time = cpuTime[i]; + } + delete[] cpuTime; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuDuration = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuDuration, allEdgesDeviceProps.duration_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].duration = cpuDuration[i]; + } + delete[] cpuDuration; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuX = new BGFLOAT[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuX, allEdgesDeviceProps.x_, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].x = cpuX[i]; + } + delete[] cpuX; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuY = new BGFLOAT[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuY, allEdgesDeviceProps.y_, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].y = cpuY[i]; + } + delete[] cpuY; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuPatience = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuPatience, allEdgesDeviceProps.patience_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].patience = cpuPatience[i]; + } + delete[] cpuPatience; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuOnSiteTime = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuOnSiteTime, allEdgesDeviceProps.onSiteTime_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].onSiteTime = cpuOnSiteTime[i]; + } + delete[] cpuOnSiteTime; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuResponderType = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuResponderType, allEdgesDeviceProps.responderType_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + if (cpuResponderType[i] == 7) + call_[i].type = "Law"; + else if (cpuResponderType[i] == 5) + call_[i].type = "EMS"; + else if (cpuResponderType[i] == 6) + call_[i].type = "Fire"; + } + delete[] cpuResponderType; +} + +/// Get edge_counts in AllEdges struct on device memory. +/// +/// @param allEdgesDevice GPU address of the All911EdgesDeviceProperties struct +/// on device memory. +void All911Edges::copyDeviceEdgeCountsToHost(void *allEdgesDevice) +{ + All911EdgesDeviceProperties allEdgesDeviceProps; + int vertexCount = Simulator::getInstance().getTotalVertices(); + HANDLE_ERROR(cudaMemcpy(&allEdgesDeviceProps, allEdgesDevice, + sizeof(All911EdgesDeviceProperties), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(edgeCounts_.data(), allEdgesDeviceProps.edgeCounts_, + vertexCount * sizeof(BGSIZE), cudaMemcpyDeviceToHost)); +} + +/// Advance all the edges in the simulation. +/// Update the state of all edges for a time step. +/// +/// @param allEdgesDevice GPU address of the AllEdgesDeviceProperties struct +/// on device memory. +/// @param allVerticesDevice GPU address of the AllVerticesDeviceProperties struct on device memory. +/// @param edgeIndexMapDevice GPU address of the EdgeIndexMap on device memory. +void All911Edges::advanceEdges(void *allEdgesDevice, void *allVerticesDevice, + void *edgeIndexMapDevice) +{ + //Edges are just used to store calls between vertices +} + +void All911Edges::setAdvanceEdgesDeviceParams() +{ + //Advance edges does nothing so no params to set +} + +/// Prints GPU 911EdgesProps data. +/// +/// @param allEdgesDeviceProps GPU address of the corresponding All911EdgesDeviceProperties struct on device memory. +void All911Edges::printGPUEdgesProps(void *allEdgesDeviceProps) const +{ + All911EdgesDeviceProperties allEdgesProps; + BGSIZE size = maxEdgesPerVertex_ * countVertices_; + if (size != 0) { + //allocate print out data members + int *sourceVertexIndexPrint = new int[size]; + int *destVertexIndexPrint = new int[size]; + BGFLOAT *WPrint = new BGFLOAT[size]; + edgeType *typePrint = new edgeType[size]; + // The representation of inUsePrint has been updated from bool to unsigned char + // to store 1 (true) or 0 (false) for the support of serialization operations. See ISSUE-459 + unsigned char *inUsePrint = new unsigned char[size]; + BGSIZE *edgeCountsPrint = new BGSIZE[countVertices_]; + BGSIZE totalEdgeCountPrint; + BGSIZE maxEdgesPerVertexPrint; + int countVerticesPrint; + unsigned char *isAvailablePrint = new unsigned char[size]; + unsigned char *isRedialPrint = new unsigned char[size]; + int *vertexIdPrint = new int[size]; + uint64_t *timePrint = new uint64_t[size]; + int *durationPrint = new int[size]; + BGFLOAT *xPrint = new BGFLOAT[size]; + BGFLOAT *yPrint = new BGFLOAT[size]; + int *patiencePrint = new int[size]; + int *onSiteTimePrint = new int[size]; + int *responderTypePrint = new int[size]; + + //set some array to default values + //TODO: should look into why this is necessary + for (BGSIZE i = 0; i < size; i++) { + inUsePrint[i] = false; + } + + for (int i = 0; i < countVertices_; i++) { + edgeCountsPrint[i] = 0; + } + + // copy everything + HANDLE_ERROR(cudaMemcpy(&allEdgesProps, allEdgesDeviceProps, + sizeof(All911EdgesDeviceProperties), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(sourceVertexIndexPrint, allEdgesProps.sourceVertexIndex_, + size * sizeof(int), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(destVertexIndexPrint, allEdgesProps.destVertexIndex_, + size * sizeof(int), cudaMemcpyDeviceToHost)); + HANDLE_ERROR( + cudaMemcpy(WPrint, allEdgesProps.W_, size * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(typePrint, allEdgesProps.type_, size * sizeof(edgeType), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(inUsePrint, allEdgesProps.inUse_, size * sizeof(unsigned char), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(edgeCountsPrint, allEdgesProps.edgeCounts_, + countVertices_ * sizeof(BGSIZE), cudaMemcpyDeviceToHost)); + totalEdgeCountPrint = allEdgesProps.totalEdgeCount_; + maxEdgesPerVertexPrint = allEdgesProps.maxEdgesPerVertex_; + countVerticesPrint = allEdgesProps.countVertices_; + // Set countVertices_ to 0 to avoid illegal memory deallocation + // at AllSynapsesProps deconstructor. + allEdgesProps.countVertices_ = 0; + HANDLE_ERROR(cudaMemcpy(isAvailablePrint, allEdgesProps.isAvailable_, + size * sizeof(unsigned char), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(isRedialPrint, allEdgesProps.isRedial_, size * sizeof(unsigned char), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(vertexIdPrint, allEdgesProps.vertexId_, size * sizeof(int), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(timePrint, allEdgesProps.time_, size * sizeof(uint64_t), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(durationPrint, allEdgesProps.duration_, size * sizeof(int), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR( + cudaMemcpy(xPrint, allEdgesProps.x_, size * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + HANDLE_ERROR( + cudaMemcpy(yPrint, allEdgesProps.y_, size * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(patiencePrint, allEdgesProps.patience_, size * sizeof(int), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(onSiteTimePrint, allEdgesProps.onSiteTime_, size * sizeof(int), + cudaMemcpyDeviceToHost)); + HANDLE_ERROR(cudaMemcpy(responderTypePrint, allEdgesProps.responderType_, size * sizeof(int), + cudaMemcpyDeviceToHost)); + + //Print everything + for (BGSIZE i = 0; i < size; i++) { + if (WPrint[i] != 0.0) { + cout << "GPU W[" << i << "] = " << WPrint[i]; + cout << " GPU sourceVertexIndex: " << sourceVertexIndexPrint[i]; + cout << " GPU destVertexIndex: " << destVertexIndexPrint[i]; + cout << " GPU type: " << typePrint[i]; + cout << " GPU inUse: " << (inUsePrint[i] == 1 ? "true" : "false"); + cout << " GPU isAvailable: " << (isAvailablePrint[i] == 1 ? "true" : "false"); + cout << " GPU isRedial: " << (isRedialPrint[i] == 1 ? "true" : "false"); + cout << " GPU eventVertexIndex: " << vertexIdPrint[i]; + cout << " GPU eventTime: " << timePrint[i]; + cout << " GPU eventDuration: " << durationPrint[i]; + cout << " GPU eventLocationX: " << xPrint[i]; + cout << " GPU eventLocationY: " << yPrint[i]; + cout << " GPU customerPatience: " << patiencePrint[i]; + cout << " GPU responderOnSiteTime: " << onSiteTimePrint[i]; + cout << " GPU responderType: " << responderTypePrint[i]; + } + } + for (int i = 0; i < countVertices_; i++) { + cout << "GPU edgeCounts:" << "vertex[" << i << "]" << edgeCountsPrint[i] << endl; + } + cout << "GPU totalEdgeCount: " << totalEdgeCountPrint << endl; + cout << "GPU maxEdgesPerVertex: " << maxEdgesPerVertexPrint << endl; + cout << "GPU countVertices: " << countVerticesPrint << endl; + + //Clean up everything + delete[] sourceVertexIndexPrint; + sourceVertexIndexPrint = nullptr; + + delete[] destVertexIndexPrint; + destVertexIndexPrint = nullptr; + + delete[] WPrint; + WPrint = nullptr; + + delete[] typePrint; + typePrint = nullptr; + + delete[] inUsePrint; + inUsePrint = nullptr; + + delete[] edgeCountsPrint; + edgeCountsPrint = nullptr; + + delete[] isAvailablePrint; + isAvailablePrint = nullptr; + + delete[] isRedialPrint; + isRedialPrint = nullptr; + + delete[] vertexIdPrint; + vertexIdPrint = nullptr; + + delete[] timePrint; + timePrint = nullptr; + + delete[] durationPrint; + durationPrint = nullptr; + + delete[] xPrint; + xPrint = nullptr; + + delete[] yPrint; + yPrint = nullptr; + + delete[] patiencePrint; + patiencePrint = nullptr; + + delete[] onSiteTimePrint; + onSiteTimePrint = nullptr; + + delete[] responderTypePrint; + responderTypePrint = nullptr; + } +} \ No newline at end of file diff --git a/Simulator/Edges/Neuro/AllNeuroEdges.h b/Simulator/Edges/Neuro/AllNeuroEdges.h index 86810f6e4..ea32d6121 100644 --- a/Simulator/Edges/Neuro/AllNeuroEdges.h +++ b/Simulator/Edges/Neuro/AllNeuroEdges.h @@ -87,6 +87,19 @@ class AllNeuroEdges : public AllEdges { /// Output weights and srcIndex to xml virtual void outputWeights(int epochNum) = 0; +#if defined(USE_GPU) +public: + /// Set edge class ID defined by enumClassSynapses for the caller's Edge class. + /// The class ID will be set to classSynapses_d in device memory, + /// and the classSynapses_d will be referred to call a device function for the + /// particular edge class. + /// Because we cannot use virtual function (Polymorphism) in device functions, + /// we use this scheme. + /// Note: we used to use a function pointer; however, it caused the growth_cuda crash + /// (see issue#137). + virtual void setEdgeClassID() = 0; +#endif + protected: /// Setup the internal structure of the class (allocate memories and initialize them). /// diff --git a/Simulator/Layouts/NG911/Layout911.cpp b/Simulator/Layouts/NG911/Layout911.cpp index ecee5e478..d024e2ea1 100644 --- a/Simulator/Layouts/NG911/Layout911.cpp +++ b/Simulator/Layouts/NG911/Layout911.cpp @@ -110,7 +110,9 @@ void Layout911::generateVertexTypeMap() << "\tTotal vertices: " << numVertices_ << endl << "\tCaller vertices: " << vTypeCount["CALR"] << endl << "\tPSAP vertices: " << vTypeCount["PSAP"] << endl - << "\tResponder vertices: " << vTypeCount["RESP"] << endl); + << "\tLaw vertices: " << vTypeCount["LAW"] << endl + << "\tFire vertices: " << vTypeCount["FIRE"] << endl + << "\tEMS vertices: " << vTypeCount["EMS"] << endl); LOG4CPLUS_INFO(fileLogger_, "Finished initializing vertex type map"); } diff --git a/Simulator/Recorders/RecordableVector.h b/Simulator/Recorders/RecordableVector.h index 48b705a31..d59a358f0 100644 --- a/Simulator/Recorders/RecordableVector.h +++ b/Simulator/Recorders/RecordableVector.h @@ -93,18 +93,18 @@ template class RecordableVector : public RecordableBase { return dataSeries_; } - /// @brief Gets const pointer to contiguous host memory array - /// @return Const pointer to the first element in host memory + /// @brief Gets pointer to contiguous host memory array + /// @return Pointer to the first element in host memory /// @note Returns nullptr if vector is empty - const T *data() const + T *data() { return dataSeries_.data(); } - /// @brief Gets pointer to contiguous host memory array - /// @return Pointer to the first element in host memory + /// @brief Gets const pointer to contiguous host memory array + /// @return Const pointer to the first element in host memory /// @note Returns nullptr if vector is empty - T *data() + const T *data() const { return dataSeries_.data(); } diff --git a/Simulator/Utils/CircularBuffer.h b/Simulator/Utils/CircularBuffer.h index 8b67de845..ff60faff4 100644 --- a/Simulator/Utils/CircularBuffer.h +++ b/Simulator/Utils/CircularBuffer.h @@ -149,6 +149,39 @@ template class CircularBuffer { return buffer_.size() + front_ - end_; } + std::vector &getBuffer() + { + return buffer_; + } + + /// @brief Accessor for the front index of the circular buffer. + /// @return Returns the front index of the circular buffer. + size_t getFrontIndex() + { + return front_; + } + + /// @brief Accessor for the end index of the circular buffer. + /// @return Returns the end index of the circular buffer. + size_t getEndIndex() + { + return end_; + } + + /// @brief Accessor for the front index of the circular buffer. + /// @return Returns the front index of the circular buffer. + void setFrontIndex(unsigned long front) + { + front_ = front; + } + + /// @brief Accessor for the end index of the circular buffer. + /// @return Returns the end index of the circular buffer. + void setEndIndex(unsigned long end) + { + end_ = end; + } + private: /// Container for holding the buffer elements std::vector buffer_; diff --git a/Simulator/Utils/InputEvent.h b/Simulator/Utils/InputEvent.h index 0841d97a2..cddca79cf 100644 --- a/Simulator/Utils/InputEvent.h +++ b/Simulator/Utils/InputEvent.h @@ -16,6 +16,7 @@ #pragma once +#include "BGTypes.h" #include #include @@ -31,8 +32,8 @@ struct Call : public InputEvent { // The duration of the event in timesteps int duration; // Event location - double x; - double y; + BGFLOAT x; + BGFLOAT y; // Patience time: How long a customer is willing to wait in the queue int patience; // On Site Time: Time spent by a responder at the site of the incident diff --git a/Simulator/Utils/InputManager.h b/Simulator/Utils/InputManager.h index 86c3d52fb..044d45065 100644 --- a/Simulator/Utils/InputManager.h +++ b/Simulator/Utils/InputManager.h @@ -68,6 +68,8 @@ template class InputManager { /// @brief Constructor InputManager() { + // Initial number of events in the manager is zero + totalNumberOfEvents_ = 0; // Get a copy of the file logger to use with log4cplus macros fileLogger_ = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("file")); consoleLogger_ = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("console")); @@ -136,6 +138,7 @@ template class InputManager { // Add the event object to the event map. Map's operator[] creates // and empty queue if it doesn't yet contain this vertex_id. eventsMap_[vertex_id].push(event); + ++totalNumberOfEvents_; } catch (boost::property_tree::ptree_bad_data e) { LOG4CPLUS_FATAL(consoleLogger_, "InputManager failed to read event node: " << e.what()); @@ -188,6 +191,13 @@ template class InputManager { return clockTickUnit_; } + /// @brief Retrieves the total number of events as defined in the input file + /// @return The total number of events in input file + int getTotalNumberOfEvents() + { + return totalNumberOfEvents_; + } + /// @brief Peeks into the event at the front of the vertex queue /// @param vertexId The ID of the vertex /// @throws out_of_range, if vertexId is not found in the map @@ -261,6 +271,9 @@ template class InputManager { int clockTickSize_; string clockTickUnit_; + // Total number of events loaded into the manager + int totalNumberOfEvents_; + log4cplus::Logger fileLogger_; // For logging into a file log4cplus::Logger consoleLogger_; // For logging to console diff --git a/Simulator/Vertices/AllVertices.cpp b/Simulator/Vertices/AllVertices.cpp index b7e43d61e..db82979b7 100644 --- a/Simulator/Vertices/AllVertices.cpp +++ b/Simulator/Vertices/AllVertices.cpp @@ -39,6 +39,12 @@ AllVertices::AllVertices() : size_(0) OperationManager::getInstance().registerOperation(Operations::printParameters, printParametersFunc); + function loadEpochInputsFunc = std::bind( + &AllVertices::loadEpochInputs, this, std::placeholders::_1, std::placeholders::_2); + OperationManager::getInstance().registerOperation(Operations::loadEpochInputs, + loadEpochInputsFunc); + + // Register registerHistoryVariables function as a registerHistoryVariables operation in the OperationManager function registerHistoryVarsFunc = bind(&AllVertices::registerHistoryVariables, this); OperationManager::getInstance().registerOperation(Operations::registerHistoryVariables, @@ -86,7 +92,30 @@ void AllVertices::printParameters() const /// These are inputs occurring in between curStep (inclusive) and /// endStep (exclusive) void AllVertices::loadEpochInputs(uint64_t currentStep, uint64_t endStep) +{ + loadEpochInputsToVertices(currentStep, endStep); +#if defined(USE_GPU) + copyEpochInputsToDevice(); +#endif +} + +void AllVertices::loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) { // This is an empty implementation so that Neural Network simulation works // normally -} \ No newline at end of file + LOG4CPLUS_DEBUG(vertexLogger_, "Calling AllVertices::loadEpochInputsToVertices"); +} + +#if defined(USE_GPU) +void AllVertices::copyEpochInputsToDevice() +{ + // This is an empty implementation so that Neural Network simulation works + // normally + LOG4CPLUS_DEBUG(vertexLogger_, "Calling AllVertices::copyEpochInputsToDevice"); +} + +int AllVertices::getNumberOfVerticesNeedingDeviceNoise() const +{ + return Simulator::getInstance().getTotalVertices(); +} +#endif \ No newline at end of file diff --git a/Simulator/Vertices/AllVertices.h b/Simulator/Vertices/AllVertices.h index 73c013318..2316cf920 100644 --- a/Simulator/Vertices/AllVertices.h +++ b/Simulator/Vertices/AllVertices.h @@ -60,7 +60,15 @@ class AllVertices { /// /// @param curStep The current simulation step /// @param endStep The end of epoch simulation step - virtual void loadEpochInputs(uint64_t currentStep, uint64_t endStep); + void loadEpochInputs(uint64_t currentStep, uint64_t endStep); + + /// Loads all inputs scheduled to occur in the upcoming epoch. + /// These are inputs occurring in between curStep (inclusive) and + /// endStep (exclusive) + /// + /// @param curStep The current simulation step + /// @param endStep The end of epoch simulation step + virtual void loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep); /// Load member variables from configuration file. /// Registered to OperationManager as Operation::loadParameters @@ -116,6 +124,9 @@ class AllVertices { /// virtual void copyFromDevice() = 0; + /// Copies all inputs scheduled to occur in the upcoming epoch onto device. + virtual void copyEpochInputsToDevice(); + /// Update the state of all vertices for a time step /// Notify outgoing edges if vertex has fired. /// @@ -141,6 +152,9 @@ class AllVertices { virtual void integrateVertexInputs(void *allVerticesDevice, EdgeIndexMapDevice *edgeIndexMapDevice, void *allEdgesDevice) = 0; + + /// Get the number of vertices that need device noise + virtual int getNumberOfVerticesNeedingDeviceNoise() const; #else // !defined(USE_GPU) public: /// Update internal state of the indexed vertex (called by every simulation step). diff --git a/Simulator/Vertices/NG911/All911Vertices.cpp b/Simulator/Vertices/NG911/All911Vertices.cpp index bbc9e5fef..705bab50f 100644 --- a/Simulator/Vertices/NG911/All911Vertices.cpp +++ b/Simulator/Vertices/NG911/All911Vertices.cpp @@ -20,6 +20,13 @@ void All911Vertices::setupVertices() AllVertices::setupVertices(); // Resize and fill vectors with 0 + vertexType_.assign(size_, 0); + beginTimeHistory_.resize(size_); + answerTimeHistory_.resize(size_); + endTimeHistory_.resize(size_); + wasAbandonedHistory_.resize(size_); + queueLengthHistory_.resize(size_); + utilizationHistory_.resize(size_); numServers_.assign(size_, 0); busyServers_.assign(size_, 0); numTrunks_.assign(size_, 0); @@ -27,16 +34,11 @@ void All911Vertices::setupVertices() servingCall_.resize(size_); answerTime_.resize(size_); serverCountdown_.resize(size_); + vertexIdToNoiseIndex_.assign(size_, -1); // Resize and fill data structures for recording droppedCalls_.assign(size_, 0); receivedCalls_.assign(size_, 0); - beginTimeHistory_.resize(size_); - answerTimeHistory_.resize(size_); - endTimeHistory_.resize(size_); - wasAbandonedHistory_.resize(size_); - queueLengthHistory_.resize(size_); - utilizationHistory_.resize(size_); // Register call properties with InputManager inputManager_.registerProperty("vertex_id", &Call::vertexId); @@ -53,47 +55,76 @@ void All911Vertices::setupVertices() // Creates all the Vertices and assigns initial data for them. void All911Vertices::createAllVertices(Layout &layout) { - // Calcualte the total number of time-steps for the data structures that - // will record per-step histories + // Read Input Events using the InputManager + inputManager_.readInputs(); + LOG4CPLUS_DEBUG(vertexLogger_, + "Total number of events: " << inputManager_.getTotalNumberOfEvents()); + Simulator &simulator = Simulator::getInstance(); + // For metrics whose entries are recorded for each time step such as queue length history uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); - uint64_t totalTimeSteps = stepsPerEpoch * simulator.getNumEpochs(); - BGFLOAT epochDuration = simulator.getEpochDuration(); - BGFLOAT deltaT = simulator.getDeltaT(); + // For metrics whose entries are recorded for each call such as begin time history + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + LOG4CPLUS_DEBUG(vertexLogger_, "Steps per epoch: " << stepsPerEpoch); + LOG4CPLUS_DEBUG(vertexLogger_, "Max events per epoch: " << maxEventsPerEpoch); - // Loop over all vertices and set the number of servers and trunks, and - // determine the size of the waiting queue. + // Loop over all vertices and set the number of servers and trunks. // We get the information needed from the GraphManager. GraphManager::VertexIterator vi, vi_end; GraphManager &gm = GraphManager::getInstance(); + // Variable to map caller region IDs to 0 to n-1 where n is the number of caller regions. + // This allows caller regions to exist anywhere in the graph file + numberOfVerticesNeedingDeviceNoise_ = 0; for (boost::tie(vi, vi_end) = gm.vertices(); vi != vi_end; ++vi) { assert(*vi < size_); if (gm[*vi].type == "CALR") { - vertexQueues_[*vi].resize(stepsPerEpoch); + vertexType_[*vi] = 3; + vertexIdToNoiseIndex_[*vi] = numberOfVerticesNeedingDeviceNoise_; + numberOfVerticesNeedingDeviceNoise_++; } else { + if (gm[*vi].type == "PSAP") { + vertexType_[*vi] = 4; + } else if (gm[*vi].type == "EMS") { + vertexType_[*vi] = 5; + } else if (gm[*vi].type == "FIRE") { + vertexType_[*vi] = 6; + } else if (gm[*vi].type == "LAW") { + vertexType_[*vi] = 7; + } numServers_[*vi] = gm[*vi].servers; numTrunks_[*vi] = gm[*vi].trunks; // We should not have more servers than trunks assert(numServers_[*vi] <= numTrunks_[*vi]); - - // The waiting queue is of size # trunks. We keep track of the # of busy servers - // to know when there are no more trunks available. - vertexQueues_[*vi].resize(numTrunks_[*vi]); - - // Initialize the data structures for agent availability - servingCall_[*vi].resize(gm[*vi].servers); - answerTime_[*vi].resize(gm[*vi].servers); - serverCountdown_[*vi].assign(gm[*vi].servers, 0); - - // Initialize the data structures for system metrics - queueLengthHistory_[*vi].assign(totalTimeSteps, 0); - utilizationHistory_[*vi].assign(totalTimeSteps, 0); + if (maxNumberOfServers_ < numServers_[*vi]) { + maxNumberOfServers_ = numServers_[*vi]; + } } } - // Read Input Events using the InputManager - inputManager_.readInputs(); + LOG4CPLUS_DEBUG(vertexLogger_, "Number of vertices needing device noise: " + << numberOfVerticesNeedingDeviceNoise_); + LOG4CPLUS_DEBUG(vertexLogger_, "Max number of servers: " << maxNumberOfServers_); + + // Loop over the vertices again to appropriate resize data members such that + // each data member used the same size for all of it's vertices. This is to + // help with mirroring the implementation on the GPU where we need a consistent + // size for all vertices. + for (int vertexId = 0; vertexId < size_; vertexId++) { + // Initialize the data structures for system metrics + beginTimeHistory_[vertexId].resize(maxEventsPerEpoch); + answerTimeHistory_[vertexId].resize(maxEventsPerEpoch); + endTimeHistory_[vertexId].resize(maxEventsPerEpoch); + wasAbandonedHistory_[vertexId].resize(maxEventsPerEpoch); + queueLengthHistory_[vertexId].resize(stepsPerEpoch); + utilizationHistory_[vertexId].resize(stepsPerEpoch); + vertexQueues_[vertexId].resize(stepsPerEpoch); + // Initialize the data structures for agent availability + servingCall_[vertexId].resize(maxNumberOfServers_); + answerTime_[vertexId].resize(maxNumberOfServers_); + serverCountdown_[vertexId].assign(maxNumberOfServers_, 0); + } } @@ -118,8 +149,9 @@ string All911Vertices::toString(int index) const // Loads all inputs scheduled to occur in the upcoming epoch. -void All911Vertices::loadEpochInputs(uint64_t currentStep, uint64_t endStep) +void All911Vertices::loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) { + LOG4CPLUS_DEBUG(fileLogger_, "Calling All911Vertices::loadEpochInputsToVertices"); Simulator &simulator = Simulator::getInstance(); Layout &layout = simulator.getModel().getLayout(); @@ -141,7 +173,7 @@ void All911Vertices::registerHistoryVariables() // Registering the following variables to be recorded recorder.registerVariable("numTrunks", numTrunks_, Recorder::UpdatedType::CONSTANT); recorder.registerVariable("numServers", numServers_, Recorder::UpdatedType::CONSTANT); - recorder.registerVariable("droppedCalls", droppedCalls_, Recorder::UpdatedType::DYNAMIC); + recorder.registerVariable("droppedCalls", droppedCalls_, Recorder::UpdatedType::CONSTANT); recorder.registerVariable("receivedCalls", receivedCalls_, Recorder::UpdatedType::CONSTANT); for (int i = 0; i < beginTimeHistory_.size(); i++) { @@ -219,34 +251,51 @@ void All911Vertices::integrateVertexInputs(AllEdges &edges, EdgeIndexMap &edgeIn for (int edge = start; edge < start + count; ++edge) { int edgeIdx = edgeIndexMap.incomingEdgeIndexMap_[edge]; - if (!all911Edges.inUse_[edgeIdx]) { - continue; - } // Edge isn't in use - if (all911Edges.isAvailable_[edgeIdx]) { - continue; - } // Edge doesn't have a call + if (!all911Edges.inUse_[edgeIdx] || all911Edges.isAvailable_[edgeIdx]) { + continue; // Edge isn't in use and doesn't have a call + } int dst = all911Edges.destVertexIndex_[edgeIdx]; // The destination vertex should be the one pulling the information assert(dst == vertex); CircularBuffer &dstQueue = getQueue(dst); - if (dstQueue.size() >= (dstQueue.capacity() - busyServers(dst))) { + // Compute the size of the destination queue + // Allows us to use larger capacity queues but treat them like they are smaller + // to simplify the mirroring on the GPU. + uint64_t dstQueueSize; + uint64_t queueFrontIndex = dstQueue.getFrontIndex(); + uint64_t queueEndIndex = dstQueue.getEndIndex(); + if (queueFrontIndex >= queueEndIndex) { + dstQueueSize = queueFrontIndex - queueEndIndex; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + dstQueueSize = numTrunks_[dst] + 1 + queueFrontIndex - queueEndIndex; + } + + // Compute the capacity of the destination queue + int dstQueueCapacity = numTrunks_[dst]; + // dstQueueSize can't be negative but we need to be able to compare it to a possible negative waiting queue + // so cast the size to an int for comparison + if ((int)dstQueueSize >= (dstQueueCapacity - busyServers(dst))) { // Call is dropped because there is no space in the waiting queue if (!all911Edges.isRedial_[edgeIdx]) { // Only count the dropped call if it's not a redial droppedCalls(dst)++; // Record that we received a call receivedCalls(dst)++; - LOG4CPLUS_DEBUG(vertexLogger_, - "Call dropped: " << droppedCalls(dst) - << ", time: " << all911Edges.call_[edgeIdx].time - << ", vertex: " << dst - << ", queue size: " << dstQueue.size()); + LOG4CPLUS_DEBUG(vertexLogger_, "Call dropped: " << droppedCalls(dst) << ", time: " + << all911Edges.call_[edgeIdx].time + << ", vertex: " << dst + << ", queue size: " << dstQueueSize); } } else { // Transfer call to destination - dstQueue.put(all911Edges.call_[edgeIdx]); + assert(((queueFrontIndex + 1) % numTrunks_[dst] + 1) != queueEndIndex); + vector &queueBuffer = dstQueue.getBuffer(); + queueBuffer[queueFrontIndex] = all911Edges.call_[edgeIdx]; + uint64_t newFrontIndex = (queueFrontIndex + 1) % (numTrunks_[dst] + 1); + dstQueue.setFrontIndex(newFrontIndex); // Record that we received a call receivedCalls(dst)++; all911Edges.isAvailable_[edgeIdx] = true; @@ -261,9 +310,6 @@ void All911Vertices::advanceVertices(AllEdges &edges, const EdgeIndexMap &edgeIn { Simulator &simulator = Simulator::getInstance(); Layout &layout = simulator.getModel().getLayout(); - uint64_t endEpochStep - = g_simulationStep - + static_cast(simulator.getEpochDuration() / simulator.getDeltaT()); All911Edges &edges911 = dynamic_cast(edges); @@ -286,26 +332,19 @@ void All911Vertices::advanceVertices(AllEdges &edges, const EdgeIndexMap &edgeIn void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, const EdgeIndexMap &edgeIndexMap) { - // There is only one outgoing edge from CALR to a PSAP - BGSIZE start = edgeIndexMap.outgoingEdgeBegin_[vertexIdx]; - BGSIZE edgeIdx = edgeIndexMap.outgoingEdgeIndexMap_[start]; - - // Check for dropped calls, indicated by the edge not being available - if (!edges911.isAvailable_[edgeIdx]) { - // If the call is still there, it means that there was no space in the PSAP's waiting - // queue. Therefore, this is a dropped call. - // If readialing, we assume that it happens immediately and the caller tries until - // getting through. - if (!edges911.isRedial_[edgeIdx] && initRNG.randDblExc() >= redialP_) { - // We only make the edge available if no readialing occurs. - edges911.isAvailable_[edgeIdx] = true; - LOG4CPLUS_DEBUG(vertexLogger_, "Did not redial at time: " << edges911.call_[edgeIdx].time); - } else { - // Keep the edge unavailable but mark it as a redial - edges911.isRedial_[edgeIdx] = true; - } - } + // // There is only one outgoing edge from CALR to a PSAP + BGSIZE edgeIdx = edgeIndexMap.outgoingEdgeIndexMap_[edgeIndexMap.outgoingEdgeBegin_[vertexIdx]]; + + unsigned char makeAvailable = (1 - edges911.isAvailable_[edgeIdx]) + * (1 - edges911.isRedial_[edgeIdx]) + * (unsigned char)(initRNG.randDblExc() >= redialP_); + + edges911.isAvailable_[edgeIdx] |= makeAvailable; + edges911.isRedial_[edgeIdx] |= (1 - edges911.isAvailable_[edgeIdx]) * (1 - makeAvailable); + // We can use CircularBuffer methods because we don't need the caller region queue + // to behave like it only has a capacity of numTrunks_ like we do for other vertices. + // // peek at the next call in the queue optional nextCall = vertexQueues_[vertexIdx].peek(); if (edges911.isAvailable_[edgeIdx] && nextCall && nextCall->time <= g_simulationStep) { @@ -326,32 +365,47 @@ void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, void All911Vertices::advancePSAP(BGSIZE vertexIdx, All911Edges &edges911, const EdgeIndexMap &edgeIndexMap) { + int numberOfServers = numServers_[vertexIdx]; // Loop over all servers and free the ones finishing serving calls - vector availableServers; - for (size_t server = 0; server < serverCountdown_[vertexIdx].size(); ++server) { - if (serverCountdown_[vertexIdx][server] == 0) { - // Server is available to take calls. This check is needed because calls - // could have duration of zero or server has not been assigned a call yet - availableServers.push_back(server); - } else if (--serverCountdown_[vertexIdx][server] == 0) { + int numberOfAvailableServers = 0; + vector + availableServers; // Use vector but treat like array to better mirror on GPU + availableServers.reserve(numberOfServers); + // Initialize to no servers having been assigned a call yet + for (BGSIZE serverIndex = 0; serverIndex < numberOfServers; serverIndex++) { + availableServers[serverIndex] = false; + } + for (size_t server = 0; server < numberOfServers; ++server) { + int countdown = serverCountdown_[vertexIdx][server]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + serverCountdown_[vertexIdx][server] = countdown; + + // Set the available server if it was already available or became available + availableServers[server] = (unsigned char)(countdown == 0); + numberOfAvailableServers += (countdown == 0); + + // If it became zero, the unit responds to the new incident + if ((!countdownWasZero) & (countdown == 0)) { // Server becomes free to take calls // TODO: What about wrap-up time? Call &endingCall = servingCall_[vertexIdx][server]; //Store call metrics - wasAbandonedHistory_[vertexIdx].push_back(false); - beginTimeHistory_[vertexIdx].push_back(endingCall.time); - answerTimeHistory_[vertexIdx].push_back(answerTime_[vertexIdx][server]); - endTimeHistory_[vertexIdx].push_back(g_simulationStep); + wasAbandonedHistory_[vertexIdx].insertEvent(false); + beginTimeHistory_[vertexIdx].insertEvent(endingCall.time); + answerTimeHistory_[vertexIdx].insertEvent(answerTime_[vertexIdx][server]); + endTimeHistory_[vertexIdx].insertEvent(g_simulationStep); LOG4CPLUS_DEBUG(vertexLogger_, "Finishing call, begin time: " << endingCall.time << ", end time: " << g_simulationStep << ", waited: " << answerTime_[vertexIdx][server] - endingCall.time); // Dispatch the Responder closest to the emergency location. - Connections911 &conn911 - = dynamic_cast(Simulator::getInstance().getModel().getConnections()); - BGSIZE respEdge = conn911.getEdgeToClosestResponder(endingCall, vertexIdx); + BGSIZE respEdge = getEdgeToClosestResponder(endingCall, vertexIdx); BGSIZE responder = edges911.destVertexIndex_[respEdge]; LOG4CPLUS_DEBUG(vertexLogger_, "Dispatching Responder: " << responder); @@ -360,54 +414,71 @@ void All911Vertices::advancePSAP(BGSIZE vertexIdx, All911Edges &edges911, endingCall.time = g_simulationStep; edges911.call_[respEdge] = endingCall; edges911.isAvailable_[respEdge] = false; - - // This assumes that the caller doesn't stay in the line until the responder - // arrives on scene. This not true in all instances. - availableServers.push_back(server); } } + // Need the initial number of servers for utilization metric as well as a number of servers that can change + // during the while loop iterations + int currentlyAvailableServers = numberOfAvailableServers; // Assign calls to servers until either no servers are available or // there are no more calls in the waiting queue - size_t serverId = 0; - while (serverId < availableServers.size() && !vertexQueues_[vertexIdx].isEmpty()) { + while (currentlyAvailableServers > 0 && !vertexQueues_[vertexIdx].isEmpty()) { // TODO: calls with duration of zero are being added but because countdown will be zero // they don't show up in the logs - optional call = vertexQueues_[vertexIdx].get(); - assert(call); - - if (call->patience < (g_simulationStep - call->time)) { + // + // Internal CircularBuffer buffer size is capacity + 1 + vector queueBuffer = vertexQueues_[vertexIdx].getBuffer(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + Call call = queueBuffer[queueEnd]; + uint64_t newEndIndex = (queueEnd + 1) % (numTrunks_[vertexIdx] + 1); + vertexQueues_[vertexIdx].setEndIndex(newEndIndex); + + if (call.patience < (g_simulationStep - call.time)) { // If the patience time is less than the waiting time, the call is abandoned - wasAbandonedHistory_[vertexIdx].push_back(true); - beginTimeHistory_[vertexIdx].push_back(call->time); + wasAbandonedHistory_[vertexIdx].insertEvent(true); + beginTimeHistory_[vertexIdx].insertEvent(call.time); // Answer time and end time get zero as sentinel for non-valid values - answerTimeHistory_[vertexIdx].push_back(0); - endTimeHistory_[vertexIdx].push_back(0); + answerTimeHistory_[vertexIdx].insertEvent(0); + endTimeHistory_[vertexIdx].insertEvent(0); LOG4CPLUS_DEBUG(vertexLogger_, "Call was abandoned, Patience: " - << call->patience - << " Ring Time: " << g_simulationStep - call->time); + << call.patience + << " Ring Time: " << g_simulationStep - call.time); } else { // The available server starts serving the call - int availServer = availableServers[serverId]; - servingCall_[vertexIdx][availServer] = call.value(); + int availServer; + for (BGSIZE serverIndex = 0; serverIndex < numberOfServers; serverIndex++) { + if (availableServers[serverIndex] == true) { + // If server is available, have that server serve the call + availServer = serverIndex; + availableServers[serverIndex] = false; + currentlyAvailableServers--; + break; + } + } + servingCall_[vertexIdx][availServer] = call; answerTime_[vertexIdx][availServer] = g_simulationStep; - serverCountdown_[vertexIdx][availServer] = call.value().duration; + serverCountdown_[vertexIdx][availServer] = call.duration; LOG4CPLUS_DEBUG(vertexLogger_, "Serving Call starting at time: " - << call->time << ", sim-step: " << g_simulationStep); - // Next server - ++serverId; + << call.time << ", sim-step: " << g_simulationStep); } } // Update number of busy servers. This is used to check if there is space in the queue - busyServers_[vertexIdx] = numServers_[vertexIdx] - availableServers.size(); + busyServers_[vertexIdx] = numberOfServers - numberOfAvailableServers; // Update queueLength and utilization histories - queueLengthHistory_[vertexIdx].resize(g_simulationStep + 1); - queueLengthHistory_[vertexIdx][g_simulationStep] = vertexQueues_[vertexIdx].size(); - utilizationHistory_[vertexIdx].resize(g_simulationStep + 1); - utilizationHistory_[vertexIdx][g_simulationStep] - = static_cast(busyServers_[vertexIdx]) / numServers_[vertexIdx]; + uint64_t queueSize; + uint64_t queueFront = vertexQueues_[vertexIdx].getFrontIndex(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + if (queueFront >= queueEnd) { + queueSize = queueFront - queueEnd; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + queueSize = numTrunks_[vertexIdx] + 1 + queueFront - queueEnd; + } + queueLengthHistory_[vertexIdx].insertEvent(queueSize); + utilizationHistory_[vertexIdx].insertEvent(static_cast(busyServers_[vertexIdx]) + / numberOfServers); } @@ -419,41 +490,66 @@ void All911Vertices::advanceRESP(BGSIZE vertexIdx, All911Edges &edges911, Layout911 &layout911 = dynamic_cast(layout); // Free the units finishing up with emergency responses - vector availableUnits; - for (size_t unit = 0; unit < serverCountdown_[vertexIdx].size(); ++unit) { - if (serverCountdown_[vertexIdx][unit] == 0) { - // Unit is available - availableUnits.push_back(unit); - } else if (--serverCountdown_[vertexIdx][unit] == 0) { + int numberOfAvailableUnits = 0; + vector + availableUnits; // Use vector but treat like array to better mirror on GPU + availableUnits.reserve(numServers_[vertexIdx]); + for (BGSIZE unitIndex = 0; unitIndex < numServers_[vertexIdx]; unitIndex++) { + availableUnits[unitIndex] = false; + } + for (size_t unit = 0; unit < numServers_[vertexIdx]; ++unit) { + int countdown = serverCountdown_[vertexIdx][unit]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + serverCountdown_[vertexIdx][unit] = countdown; + + // Set the available unit if it was already available or became available + availableUnits[unit] = (unsigned char)(countdown == 0); + numberOfAvailableUnits += (countdown == 0); + + // If it became zero, the unit responds to the new incident + if ((!countdownWasZero) & (countdown == 0)) { // Unit becomes available to responde to new incidents Call &endingIncident = servingCall_[vertexIdx][unit]; //Store incident response metrics - wasAbandonedHistory_[vertexIdx].push_back(false); - beginTimeHistory_[vertexIdx].push_back(endingIncident.time); - answerTimeHistory_[vertexIdx].push_back(answerTime_[vertexIdx][unit]); - endTimeHistory_[vertexIdx].push_back(g_simulationStep); + wasAbandonedHistory_[vertexIdx].insertEvent(false); + beginTimeHistory_[vertexIdx].insertEvent(endingIncident.time); + answerTimeHistory_[vertexIdx].insertEvent(answerTime_[vertexIdx][unit]); + endTimeHistory_[vertexIdx].insertEvent(g_simulationStep); LOG4CPLUS_DEBUG(vertexLogger_, "Finishing response, begin time: " << endingIncident.time << ", end time: " << g_simulationStep << ", waited: " << answerTime_[vertexIdx][unit] - endingIncident.time); - - // Unit is added to available units - availableUnits.push_back(unit); } } // Assign reponse dispatches until no units are available or there are no more // incidents in the waiting queue - for (size_t unit = 0; unit < availableUnits.size() && !vertexQueues_[vertexIdx].isEmpty(); + for (size_t unit = 0; unit < numberOfAvailableUnits && !vertexQueues_[vertexIdx].isEmpty(); ++unit) { - optional incident = vertexQueues_[vertexIdx].get(); - assert(incident); // Safety check for valid incidents + // Internal CircularBuffer buffer size is capacity + 1 + vector queueBuffer = vertexQueues_[vertexIdx].getBuffer(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + Call incident = queueBuffer[queueEnd]; + uint64_t newEndIndex = (queueEnd + 1) % (numTrunks_[vertexIdx] + 1); + vertexQueues_[vertexIdx].setEndIndex(newEndIndex); // The available unit starts serving the call - int availUnit = availableUnits[unit]; - servingCall_[vertexIdx][availUnit] = incident.value(); + int availUnit = -1; + for (BGSIZE unitIndex = 0; unitIndex < numServers_[vertexIdx]; unitIndex++) { + // Add 0 if unit is not available or 1 + unitIndex if it's available and a unit has not already been found + availUnit += (availableUnits[unitIndex] == true && availUnit == -1) * (unitIndex + 1); + // Flip value only if the unit is available and a unit has not been found + availableUnits[unitIndex] + = (unsigned char)(availableUnits[unitIndex] + == true - (availableUnits[unitIndex] == true && availUnit == -1)); + } + servingCall_[vertexIdx][availUnit] = incident; answerTime_[vertexIdx][availUnit] = g_simulationStep; // We need to calculate the distance in miles but the x and y coordinates @@ -465,28 +561,83 @@ void All911Vertices::advanceRESP(BGSIZE vertexIdx, All911Edges &edges911, // 1 degree of longitude = cos(latitude) * 69.172 double lngDegreeLength = cos(layout911.yloc_[vertexIdx] * (pi / 180)) * 69.172; double latDegreeLength = 69.0; - double deltaLng = incident->x - layout911.xloc_[vertexIdx]; - double deltaLat = incident->y - layout911.yloc_[vertexIdx]; + double deltaLng = incident.x - layout911.xloc_[vertexIdx]; + double deltaLat = incident.y - layout911.yloc_[vertexIdx]; double dist2incident = sqrt(pow(deltaLng * lngDegreeLength, 2) + pow(deltaLat * latDegreeLength, 2)); // Calculate the driving time to the incident in seconds double driveTime = (dist2incident / avgDrivingSpeed_) * 3600; - serverCountdown_[vertexIdx][availUnit] = driveTime + incident->onSiteTime; + serverCountdown_[vertexIdx][availUnit] = driveTime + incident.onSiteTime; - serverCountdown_[vertexIdx][availUnit] = incident.value().duration; + serverCountdown_[vertexIdx][availUnit] = incident.duration; LOG4CPLUS_DEBUG(vertexLogger_, "Response, driving time: " << driveTime << ", On-site time: " - << incident->onSiteTime); + << incident.onSiteTime); } // Update number of busy servers. This is used to check if there is space in the queue - busyServers_[vertexIdx] = numServers_[vertexIdx] - availableUnits.size(); + busyServers_[vertexIdx] = numServers_[vertexIdx] - numberOfAvailableUnits; // Update queueLength and utilization histories - queueLengthHistory_[vertexIdx].resize(g_simulationStep + 1); - queueLengthHistory_[vertexIdx][g_simulationStep] = vertexQueues_[vertexIdx].size(); - utilizationHistory_[vertexIdx].resize(g_simulationStep + 1); - utilizationHistory_[vertexIdx][g_simulationStep] - = static_cast(busyServers_[vertexIdx]) / numServers_[vertexIdx]; + uint64_t queueSize; + uint64_t queueFront = vertexQueues_[vertexIdx].getFrontIndex(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + if (queueFront >= queueEnd) { + queueSize = queueFront - queueEnd; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + queueSize = numTrunks_[vertexIdx] + 1 + queueFront - queueEnd; + } + queueLengthHistory_[vertexIdx].insertEvent(queueSize); + utilizationHistory_[vertexIdx].insertEvent(static_cast(busyServers_[vertexIdx]) + / numServers_[vertexIdx]); +} + + +/// Finds the outgoing edge from the given vertex to the Responder closest to +/// the emergency call location +BGSIZE All911Vertices::getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx) +{ + Connections &connections = Simulator::getInstance().getModel().getConnections(); + All911Edges &edges911 = dynamic_cast(connections.getEdges()); + EdgeIndexMap &edgeIndexMap = connections.getEdgeIndexMap(); + + vertexType requiredType; + if (call.type == "Law") + requiredType = vertexType::LAW; + else if (call.type == "EMS") + requiredType = vertexType::EMS; + else if (call.type == "Fire") + requiredType = vertexType::FIRE; + + // loop over the outgoing edges looking for the responder with the shortest + // Euclidean distance to the call's location. + BGSIZE startOutEdg = edgeIndexMap.outgoingEdgeBegin_[vertexIdx]; + BGSIZE outEdgCount = edgeIndexMap.outgoingEdgeCount_[vertexIdx]; + Layout911 &layout911 + = dynamic_cast(Simulator::getInstance().getModel().getLayout()); + + BGSIZE resp, respEdge; + double minDistance = numeric_limits::max(); + for (BGSIZE eIdxMap = startOutEdg; eIdxMap < startOutEdg + outEdgCount; ++eIdxMap) { + BGSIZE outEdg = edgeIndexMap.outgoingEdgeIndexMap_[eIdxMap]; + assert(edges911.inUse_[outEdg]); // Edge must be in use + + BGSIZE dstVertex = edges911.destVertexIndex_[outEdg]; + if (layout911.vertexTypeMap_[dstVertex] == requiredType) { + double distance = layout911.getDistance(dstVertex, call.x, call.y); + + if (distance < minDistance) { + minDistance = distance; + resp = dstVertex; + respEdge = outEdg; + } + } + } + + // We must have found the closest responder of the right type + assert(minDistance < numeric_limits::max()); + assert(layout911.vertexTypeMap_[resp] == requiredType); + return respEdge; } #endif \ No newline at end of file diff --git a/Simulator/Vertices/NG911/All911Vertices.h b/Simulator/Vertices/NG911/All911Vertices.h index 48a37d988..4dd033e4e 100644 --- a/Simulator/Vertices/NG911/All911Vertices.h +++ b/Simulator/Vertices/NG911/All911Vertices.h @@ -67,6 +67,7 @@ #include "AllVertices.h" #include "CircularBuffer.h" +#include "EventBuffer.h" #include "Global.h" #include "InputEvent.h" #include "InputManager.h" @@ -74,6 +75,7 @@ // Forward declaration to avoid circular reference class All911Edges; +struct All911VerticesDeviceProperties; // Class to hold all data necessary for all the Vertices. class All911Vertices : public AllVertices { @@ -119,7 +121,7 @@ class All911Vertices : public AllVertices { /// Loads all inputs scheduled to occur in the upcoming epoch. /// These are inputs occurring in between curStep (inclusive) and /// endStep (exclusive) - virtual void loadEpochInputs(uint64_t currentStep, uint64_t endStep) override; + virtual void loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) override; /// unused virtual function placeholder virtual void registerHistoryVariables() override; @@ -148,20 +150,20 @@ class All911Vertices : public AllVertices { /// @return The number of busy servers in the given vertex int busyServers(int vIdx) const; -private: + /// Index each vertex and record it's type + vector vertexType_; /// The starting time for every call - vector> beginTimeHistory_; + vector> beginTimeHistory_; /// The answer time for every call - vector> answerTimeHistory_; + vector> answerTimeHistory_; /// The end time for every call - vector> endTimeHistory_; + vector> endTimeHistory_; /// True if the call was abandoned - vector> - wasAbandonedHistory_; // changed to bool from unsigned char + vector> wasAbandonedHistory_; // changed to bool from unsigned char /// The length of the waiting queue at every time-step - vector> queueLengthHistory_; + vector> queueLengthHistory_; /// The portion of servers that are busy at every time-step - vector> utilizationHistory_; + vector> utilizationHistory_; /// These are the queues where calls will wait to be served vector> vertexQueues_; @@ -175,6 +177,8 @@ class All911Vertices : public AllVertices { /// Number of servers currently serving calls vector busyServers_; + // Record the max number of servers for GPU memory allocation + int maxNumberOfServers_; /// Number of servers. In a PSAP these are the call takers, in Responder nodes /// they are responder units RecordableVector numServers_; @@ -200,6 +204,27 @@ class All911Vertices : public AllVertices { /// The InputManager holds all the Input Events for the simulation InputManager inputManager_; + /// Mapping of the vertex ID to the index in the noise array. Only caller regions + /// need noise for determining if a redial occurs. Caller regions have a value + /// 0 to n where n is the number of caller regions. Non-caller regions have a + /// value of -1. + vector vertexIdToNoiseIndex_; + +protected: + /// Finds the outgoing edge from the given vertex to the Responder closest to + /// the emergency call location + /// + /// @param call The call that needs a Responder + /// @param vertexIdx The index of the vertex serving the call (A PSAP) + /// @return The index of the outgoing edge to the closest Responder + BGSIZE getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx); + + /// The number of vertices that needs device noise. Only caller regions need noise for determining + /// redial so this is meant to help save memory. A member variable is used so that we don't have to + /// recompute this value multiple times. + int numberOfVerticesNeedingDeviceNoise_; + +private: /// Advance a CALR vertex. Send calls to the appropriate PSAP /// /// @param vertexIdx Index of the CALR vertex @@ -225,14 +250,14 @@ class All911Vertices : public AllVertices { // GPU functionality for 911 simulation is unimplemented. // These signatures are required to make the class non-abstract public: - virtual void allocVerticesDeviceStruct() {}; - virtual void deleteVerticesDeviceStruct() {}; - virtual void copyToDevice() {}; - virtual void copyFromDevice() {}; + virtual void allocVerticesDeviceStruct() override; + virtual void deleteVerticesDeviceStruct() override; + virtual void copyToDevice() override; + virtual void copyFromDevice() override; virtual void advanceVertices(AllEdges &edges, void *allVerticesDevice, void *allEdgesDevice, - float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) {}; - virtual void setAdvanceVerticesDeviceParams(AllEdges &edges) {}; - virtual void clearVertexHistory(void *allVerticesDevice) {}; + float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) override; + virtual void setAdvanceVerticesDeviceParams(AllEdges &edges) override; + virtual void clearVertexHistory(void *allVerticesDevice) override; /// Performs an integration operation per vertex using the inputs to the vertex. /// @@ -241,7 +266,25 @@ class All911Vertices : public AllVertices { /// @param allEdgesDevice GPU address of the allEdges struct on device memory. virtual void integrateVertexInputs(void *allVerticesDevice, EdgeIndexMapDevice *edgeIndexMapDevice, - void *allEdgesDevice) {}; + void *allEdgesDevice) override; + /// Copies all inputs scheduled to occur in the upcoming epoch onto device. + virtual void copyEpochInputsToDevice() override; + virtual int getNumberOfVerticesNeedingDeviceNoise() const override; + +protected: + /// Allocate GPU memories to store all vertices' states. + /// (Helper function of allocVerticesDeviceStruct) + /// @param allVerticesDevice Reference to the All911VerticesDeviceProperties struct. + void allocDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice); + void deleteDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice); + void copyVertexQueuesToDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice); + void copyVertexQueuesFromDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice); + void copyServingCallToDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice); + void copyServingCallFromDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice); #else // !defined(USE_GPU) public: /// Update internal state of the indexed Vertex (called by every simulation step). @@ -260,4 +303,117 @@ class All911Vertices : public AllVertices { protected: #endif // defined(USE_GPU) -}; \ No newline at end of file +}; + +#if defined(USE_GPU) +struct All911VerticesDeviceProperties : public AllVerticesDeviceProperties { + /// Index each vertex and record it's type + int *vertexType_; + /// The starting time for every call + //vector> beginTimeHistory_; + uint64_t **beginTimeHistory_; + int *beginTimeHistoryBufferFront_; + int *beginTimeHistoryBufferEnd_; + int *beginTimeHistoryEpochStart_; + int *beginTimeHistoryNumElementsInEpoch_; + /// The answer time for every call + //vector> answerTimeHistory_; + uint64_t **answerTimeHistory_; + int *answerTimeHistoryBufferFront_; + int *answerTimeHistoryBufferEnd_; + int *answerTimeHistoryEpochStart_; + int *answerTimeHistoryNumElementsInEpoch_; + /// The end time for every call + //vector> endTimeHistory_; + uint64_t **endTimeHistory_; + int *endTimeHistoryBufferFront_; + int *endTimeHistoryBufferEnd_; + int *endTimeHistoryEpochStart_; + int *endTimeHistoryNumElementsInEpoch_; + /// True if the call was abandoned + //vector> wasAbandonedHistory_; + uint64_t **wasAbandonedHistory_; + int *wasAbandonedHistoryBufferFront_; + int *wasAbandonedHistoryBufferEnd_; + int *wasAbandonedHistoryEpochStart_; + int *wasAbandonedHistoryNumElementsInEpoch_; + /// The length of the waiting queue at every time-step + //vector> queueLengthHistory_; + uint64_t **queueLengthHistory_; + int *queueLengthHistoryBufferFront_; + int *queueLengthHistoryBufferEnd_; + int *queueLengthHistoryEpochStart_; + int *queueLengthHistoryNumElementsInEpoch_; + /// The portion of servers that are busy at every time-step + //vector> utilizationHistory_; + BGFLOAT **utilizationHistory_; + int *utilizationHistoryBufferFront_; + int *utilizationHistoryBufferEnd_; + int *utilizationHistoryEpochStart_; + int *utilizationHistoryNumElementsInEpoch_; + + /// These are the queues where calls will wait to be served + //vector> vertexQueues_; + int **vertexQueuesBufferVertexId_; + uint64_t **vertexQueuesBufferTime_; + int **vertexQueuesBufferDuration_; + BGFLOAT **vertexQueuesBufferX_; + BGFLOAT **vertexQueuesBufferY_; + int **vertexQueuesBufferPatience_; + int **vertexQueuesBufferOnSiteTime_; + int **vertexQueuesBufferResponderType_; + uint64_t *vertexQueuesFront_; + uint64_t *vertexQueuesEnd_; + // Replaces calls to buffer.size() on the CPU. It's therefore + // the size of the underlying buffer, not the size of the + // Circular buffer. + uint64_t *vertexQueuesBufferSize_; + + /// The number of calls that have been dropped (got a busy signal) + //vector droppedCalls_; + int *droppedCalls_; + + /// The number of received calls + //vector receivedCalls_; + int *receivedCalls_; + + /// Number of servers currently serving calls + //vector busyServers_; + int *busyServers_; + + /// Number of servers. In a PSAP these are the call takers, in Responder nodes + /// they are responder units + //vector numServers_; + int *numServers_; + + /// Number of phone lines available. Only valid for PSAPs and Responders + //vector numTrunks_; + int *numTrunks_; + + /// Holds the calls being served by each server + //vector> servingCall_; + int **servingCallBufferVertexId_; + uint64_t **servingCallBufferTime_; + int **servingCallBufferDuration_; + BGFLOAT **servingCallBufferX_; + BGFLOAT **servingCallBufferY_; + int **servingCallBufferPatience_; + int **servingCallBufferOnSiteTime_; + int **servingCallBufferResponderType_; + + /// The time that the call being served was answered by the server + //vector> answerTime_; + uint64_t **answerTime_; + + /// The countdown until the server is available to take another call + //vector> serverCountdown_; + int **serverCountdown_; + + /// Mapping of the vertex ID to the index in the noise array. Only caller regions + /// need noise for determining if a redial occurs. Caller regions have a value + /// 0 to n where n is the number of caller regions. Non-caller regions have a + /// value of -1. + //vector vertexIdToNoiseIndex_; + int *vertexIdToNoiseIndex_; +}; +#endif // defined(USE_GPU) diff --git a/Simulator/Vertices/NG911/All911Vertices_d.cpp b/Simulator/Vertices/NG911/All911Vertices_d.cpp new file mode 100644 index 000000000..2c4686925 --- /dev/null +++ b/Simulator/Vertices/NG911/All911Vertices_d.cpp @@ -0,0 +1,3211 @@ +/** + * @file All911Vertices_d.cpp + * + * @ingroup Simulator/Vertices/NG911 + * + * @brief Specialization of the AllVertices class for the NG911 network + */ + +#include "All911Edges.h" +#include "All911Vertices.h" +#include "Book.h" +#include "GPUModel.h" +#include "Global.h" +#include "InputManager.h" +#include "Layout.h" +#include "Layout911.h" +#include "Simulator.h" +#include +#include +#include //For portable uint64_t formatting in printf +#include + +/// CUDA code for advancing all vertices +/// +__global__ void advance911VerticesDevice( + int totalVertices, int maxEventsPerEpoch, uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, float redialValues[], BGFLOAT redialProbability, + BGFLOAT *xLocation, BGFLOAT *yLocation, All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, EdgeIndexMapDevice *edgeIndexMapDevice); + +/// CUDA code for taking a call from an edge and adding it to a vertex's queue if there is space. +/// +__global__ void maybeTakeCallFromEdge(int totalVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advanceCALRVerticesDevice(int vertexId, uint64_t stepsPerEpoch, + uint64_t simulationStep, BGFLOAT redialValue, + BGFLOAT redialProbability, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advancePSAPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT *xLocation, BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advanceRESPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, BGFLOAT *xLocation, + BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +void All911Vertices::allocVerticesDeviceStruct() +{ + All911VerticesDeviceProperties allVertices; + LOG4CPLUS_DEBUG(vertexLogger_, + "Size of 911 vertice device: " << sizeof(All911VerticesDeviceProperties)); + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void **allVerticesDevice = reinterpret_cast(&(gpuModel->getAllVerticesDevice())); + allocDeviceStruct(allVertices); + HANDLE_ERROR(cudaMalloc(allVerticesDevice, sizeof(All911VerticesDeviceProperties))); + HANDLE_ERROR(cudaMemcpy(*allVerticesDevice, &allVertices, sizeof(All911VerticesDeviceProperties), + cudaMemcpyHostToDevice)); +} + +/// Allocate GPU memories to store all vertices' states. +/// (Helper function of allocVerticesDeviceStruct) +/// @param allVerticesDevice Reference to the All911VerticesDeviceProperties struct. +void All911Vertices::allocDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice) +{ + Simulator &simulator = Simulator::getInstance(); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int numberOfVertices = simulator.getTotalVertices(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + + // Layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.allocateDeviceMemory(); + layout911.yloc_.allocateDeviceMemory(); + + //int *vertexType_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.vertexType_, numberOfVertices * sizeof(int))); + // Follow pattern in ALLIFNeurons_d.cpp allocDeviceStruct for spikeHistory to alloc + // any 2D arrays + // + //uint64_t **beginTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuBeginTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.beginTimeHistory_, cpuBeginTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **answerTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuAnswerTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.answerTimeHistory_, cpuAnswerTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **endTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuEndTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.endTimeHistory_, cpuEndTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **wasAbandonedHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuWasAbandonedHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.wasAbandonedHistory_, cpuWasAbandonedHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **queueLengthHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuQueueLengthHistory[i], stepsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.queueLengthHistory_, cpuQueueLengthHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //BGFLOAT **utilizationHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuUtilizationHistory[i], stepsPerEpoch * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.utilizationHistory_, cpuUtilizationHistory, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //int **vertexQueuesBufferVertexId_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallId[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallId[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferVertexId_, cpuCallId, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //uint64_t **vertexQueuesBufferTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuCallTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallTime[i], (stepsPerEpoch + 1) * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferTime_, cpuCallTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferDuration_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallDuration[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallDuration[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferDuration_, cpuCallDuration, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **vertexQueuesBufferX_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationX[i], (stepsPerEpoch + 1) * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferX_, cpuCallLocationX, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **vertexQueuesBufferY_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationY[i], (stepsPerEpoch + 1) * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferY_, cpuCallLocationY, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferPatience_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallPatience[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallPatience[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferPatience_, cpuCallPatience, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferOnSiteTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallOnSiteTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallOnSiteTime[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferOnSiteTime_, cpuCallOnSiteTime, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferResponderType_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallResponderType[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallResponderType[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferResponderType_, + cpuCallResponderType, numberOfVertices * sizeof(int *), + cudaMemcpyHostToDevice)); + } + //uint64_t *vertexQueuesFront_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesFront_, + numberOfVertices * sizeof(uint64_t))); + //uint64_t *vertexQueuesEnd_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesEnd_, + numberOfVertices * sizeof(uint64_t))); + //uint64_t *vertexQueuesBufferSize_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferSize_, + numberOfVertices * sizeof(uint64_t))); + //int *droppedCalls_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.droppedCalls_, numberOfVertices * sizeof(int))); + //int *receivedCalls_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.receivedCalls_, numberOfVertices * sizeof(int))); + //int *busyServers_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.busyServers_, numberOfVertices * sizeof(int))); + //int *numServers_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.numServers_, numberOfVertices * sizeof(int))); + //int *numTrunks_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.numTrunks_, numberOfVertices * sizeof(int))); + //int **servingCallBufferVertexId_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallId[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallId[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferVertexId_, cpuCallId, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //uint64_t **servingCallBufferTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuCallTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallTime[i], maxNumberOfServers_ * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferTime_, cpuCallTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferDuration_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallDuration[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallDuration[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferDuration_, cpuCallDuration, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **servingCallBufferX_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationX[i], maxNumberOfServers_ * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferX_, cpuCallLocationX, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **servingCallBufferY_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationY[i], maxNumberOfServers_ * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferY_, cpuCallLocationY, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferPatience_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallPatience[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallPatience[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferPatience_, cpuCallPatience, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferOnSiteTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallOnSiteTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallOnSiteTime[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferOnSiteTime_, cpuCallOnSiteTime, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferResponderType_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallResponderType[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallResponderType[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferResponderType_, + cpuCallResponderType, numberOfVertices * sizeof(int *), + cudaMemcpyHostToDevice)); + } + //uint64_t **answerTime_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.answerTime_, numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuAnswerTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuAnswerTime[i], maxNumberOfServers_ * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.answerTime_, cpuAnswerTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **serverCountdown_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.serverCountdown_, numberOfVertices * sizeof(int *))); + { + int *cpuServerCountdown[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuServerCountdown[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.serverCountdown_, cpuServerCountdown, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexIdToNoiseIndex_, + numberOfVertices * sizeof(int))); +} + +/// Delete GPU memories. +/// +void All911Vertices::deleteVerticesDeviceStruct() +{ + All911VerticesDeviceProperties allVertices; + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void *allVerticesDevice = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, allVerticesDevice, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + deleteDeviceStruct(allVertices); + HANDLE_ERROR(cudaFree(allVerticesDevice)); +} + +/// Delete GPU memories. +/// (Helper function of deleteVerticesDeviceStruct) +/// +/// @param allVerticesDevice GPU address of the All911VerticesDeviceProperties struct. +void All911Vertices::deleteDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice) +{ + Simulator &simulator = Simulator::getInstance(); + int numberOfVertices = simulator.getTotalVertices(); + // Free layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.freeDeviceMemory(); + layout911.yloc_.freeDeviceMemory(); + // int *vertexType_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexType_)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVerticesDevice.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuBeginTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistory_)); + } + // int *beginTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryBufferFront_)); + // int *beginTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryBufferEnd_)); + // int *beginTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryEpochStart_)); + // int *beginTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryNumElementsInEpoch_)); + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVerticesDevice.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuAnswerTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistory_)); + } + // int *answerTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryBufferFront_)); + // int *answerTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryBufferEnd_)); + // int *answerTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryEpochStart_)); + // int *answerTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryNumElementsInEpoch_)); + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVerticesDevice.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuEndTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistory_)); + } + // int *endTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryBufferFront_)); + // int *endTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryBufferEnd_)); + // int *endTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryEpochStart_)); + // int *endTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryNumElementsInEpoch_)); + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVerticesDevice.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuWasAbandonedHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistory_)); + } + // int *wasAbandonedHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryBufferFront_)); + // int *wasAbandonedHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryBufferEnd_)); + // int *wasAbandonedHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryEpochStart_)); + // int *wasAbandonedHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryNumElementsInEpoch_)); + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVerticesDevice.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuQueueLengthHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistory_)); + } + // int *queueLengthHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryBufferFront_)); + // int *queueLengthHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryBufferEnd_)); + // int *queueLengthHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryEpochStart_)); + // int *queueLengthHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryNumElementsInEpoch_)); + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVerticesDevice.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuUtilizationHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistory_)); + } + // int *utilizationHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryBufferFront_)); + // int *utilizationHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryBufferEnd_)); + // int *utilizationHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryEpochStart_)); + // int *utilizationHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryNumElementsInEpoch_)); + // int **vertexQueuesBufferVertexId_; + { + int *cpuCallId[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallId, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallId[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferVertexId_)); + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *cpuCallTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallTime, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferTime_)); + } + // int **vertexQueuesBufferDuration_; + { + int *cpuCallDuration[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallDuration, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallDuration[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferDuration_)); + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationX, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationX[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferX_)); + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationY, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationY[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferY_)); + } + // int **vertexQueuesBufferPatience_; + { + int *cpuCallPatience[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallPatience, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallPatience[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferPatience_)); + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *cpuCallOnSiteTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallOnSiteTime, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallOnSiteTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferOnSiteTime_)); + } + // int **vertexQueuesBufferResponderType_; + { + int *cpuCallResponderType[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallResponderType, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallResponderType[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferResponderType_)); + } + // uint64_t *vertexQueuesFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesFront_)); + // uint64_t *vertexQueuesEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesEnd_)); + // uint64_t *vertexQueuesBufferSize_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferSize_)); + // int *droppedCalls_; + HANDLE_ERROR(cudaFree(allVerticesDevice.droppedCalls_)); + // int *receivedCalls_; + HANDLE_ERROR(cudaFree(allVerticesDevice.receivedCalls_)); + // int *busyServers_; + HANDLE_ERROR(cudaFree(allVerticesDevice.busyServers_)); + // int *numServers_; + HANDLE_ERROR(cudaFree(allVerticesDevice.numServers_)); + // int *numTrunks_; + HANDLE_ERROR(cudaFree(allVerticesDevice.numTrunks_)); + // int **servingCallBufferVertexId_; + { + int *cpuCallId[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallId, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallId[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferVertexId_)); + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *cpuCallTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallTime, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferTime_)); + } + // int **servingCallBufferDuration_; + { + int *cpuCallDuration[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallDuration, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallDuration[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferDuration_)); + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationX, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationX[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferX_)); + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationY, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationY[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferY_)); + } + // int **servingCallBufferPatience_; + { + int *cpuCallPatience[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallPatience, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallPatience[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferPatience_)); + } + // int **servingCallBufferOnSiteTime_; + { + int *cpuCallOnSiteTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallOnSiteTime, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallOnSiteTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferOnSiteTime_)); + } + // int **servingCallBufferResponderType_; + { + int *cpuCallResponderType[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallResponderType, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallResponderType[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferResponderType_)); + } + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVerticesDevice.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuAnswerTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTime_)); + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVerticesDevice.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuServerCountdown[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.serverCountdown_)); + } + //int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexIdToNoiseIndex_)); +} + +/// @brief Helper function for copying vertex queues to device from CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyVertexQueuesToDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // int **vertexQueuesBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callIdInBuffer[j] = buffer[j].vertexId; + } + HANDLE_ERROR(cudaMemcpy(callIdCpu[i], callIdInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callTimeInBuffer[j] = buffer[j].time; + } + HANDLE_ERROR(cudaMemcpy(callTimeCpu[i], callTimeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(uint64_t), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callDurationInBuffer[j] = buffer[j].duration; + } + HANDLE_ERROR(cudaMemcpy(callDurationCpu[i], callDurationInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callLocationXInBuffer[j] = buffer[j].x; + } + HANDLE_ERROR(cudaMemcpy(callLocationXCpu[i], callLocationXInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callLocationYInBuffer[j] = buffer[j].y; + } + HANDLE_ERROR(cudaMemcpy(callLocationYCpu[i], callLocationYInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **vertexQueuesBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callPatienceInBuffer[j] = buffer[j].patience; + } + HANDLE_ERROR(cudaMemcpy(callPatienceCpu[i], callPatienceInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callOnSiteTimeInBuffer[j] = buffer[j].onSiteTime; + } + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu[i], callOnSiteTimeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + std::string typeInBuffer = buffer[j].type; + if (typeInBuffer == "EMS") { + callResponderTypeInBuffer[j] = 5; + } else if (typeInBuffer == "Fire") { + callResponderTypeInBuffer[j] = 6; + } else if (typeInBuffer == "Law") { + callResponderTypeInBuffer[j] = 7; + } + } + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu[i], callResponderTypeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } + // uint64_t *vertexQueuesFront_; + { + uint64_t queueFrontCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueFrontCpu[i] = vertexQueues_[i].getFrontIndex(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesFront_, queueFrontCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + // uint64_t *vertexQueuesEnd_; + { + uint64_t queueEndCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueEndCpu[i] = vertexQueues_[i].getEndIndex(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesEnd_, queueEndCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + // uint64_t *vertexQueuesBufferSize_; + { + uint64_t queueSizeCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueSizeCpu[i] = vertexQueues_[i].getBuffer().size(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferSize_, queueSizeCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } +} + +/// @brief Helper function for copying serving calls from CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyServingCallToDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // Logic is similar to copyVertexQueuesToDevice but we use max number of servers + // for the inner vector dimension + // + // int **servingCallBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callIdInBuffer[j] = buffer[j].vertexId; + } + HANDLE_ERROR(cudaMemcpy(callIdCpu[i], callIdInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callTimeInBuffer[j] = buffer[j].time; + } + HANDLE_ERROR(cudaMemcpy(callTimeCpu[i], callTimeInBuffer.data(), + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **servingCallBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callDurationInBuffer[j] = buffer[j].duration; + } + HANDLE_ERROR(cudaMemcpy(callDurationCpu[i], callDurationInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callLocationXInBuffer[j] = buffer[j].x; + } + HANDLE_ERROR(cudaMemcpy(callLocationXCpu[i], callLocationXInBuffer.data(), + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callLocationYInBuffer[j] = buffer[j].y; + } + HANDLE_ERROR(cudaMemcpy(callLocationYCpu[i], callLocationYInBuffer.data(), + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **servingCallBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callPatienceInBuffer[j] = buffer[j].patience; + } + HANDLE_ERROR(cudaMemcpy(callPatienceCpu[i], callPatienceInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **servingCallBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callOnSiteTimeInBuffer[j] = buffer[j].onSiteTime; + } + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu[i], callOnSiteTimeInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **servingCallBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + std::string typeInBuffer = buffer[j].type; + if (typeInBuffer == "EMS") { + callResponderTypeInBuffer[j] = 5; + } else if (typeInBuffer == "Fire") { + callResponderTypeInBuffer[j] = 6; + } else if (typeInBuffer == "Law") { + callResponderTypeInBuffer[j] = 7; + } + } + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu[i], callResponderTypeInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } +} + +/// Copy all vertex data from host to device. +void All911Vertices::copyToDevice() +{ + LOG4CPLUS_DEBUG(vertexLogger_, "Copying All911Vertices to device"); + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + int numberOfVertices = simulator.getTotalVertices(); + + // Copy layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.copyToDevice(); + layout911.yloc_.copyToDevice(); + // int *vertexType_; + HANDLE_ERROR(cudaMemcpy(allVertices.vertexType_, vertexType_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVertices.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory[i], beginTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *beginTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = beginTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = beginTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = beginTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = beginTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVertices.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory[i], answerTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *answerTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = answerTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = answerTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = answerTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = answerTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVertices.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory[i], endTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *endTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = endTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = endTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = endTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = endTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVertices.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory[i], wasAbandonedHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *wasAbandonedHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = wasAbandonedHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = wasAbandonedHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = wasAbandonedHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = wasAbandonedHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryNumElementsInEpoch_, + cpuElementsInEpoch, numberOfVertices * sizeof(int), + cudaMemcpyHostToDevice)); + } + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVertices.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory[i], queueLengthHistory_[i].data(), + stepsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *queueLengthHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = queueLengthHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = queueLengthHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = queueLengthHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = queueLengthHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVertices.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory[i], utilizationHistory_[i].data(), + stepsPerEpoch * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + } + } + // int *utilizationHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = utilizationHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = utilizationHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = utilizationHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = utilizationHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int **vertexQueuesBufferVertexId_; + // uint64_t **vertexQueuesBufferTime_; + // int **vertexQueuesBufferDuration_; + // BGFLOAT **vertexQueuesBufferX_; + // BGFLOAT **vertexQueuesBufferY_; + // int **vertexQueuesBufferPatience_; + // int **vertexQueuesBufferOnSiteTime_; + // int **vertexQueuesBufferResponderType_; + // uint64_t *vertexQueuesFront_; + // uint64_t *vertexQueuesEnd_; + copyVertexQueuesToDevice(numberOfVertices, stepsPerEpoch, allVertices); + // int *droppedCalls_; + HANDLE_ERROR(cudaMemcpy(allVertices.droppedCalls_, droppedCalls_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *receivedCalls_; + HANDLE_ERROR(cudaMemcpy(allVertices.receivedCalls_, receivedCalls_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *busyServers_; + HANDLE_ERROR(cudaMemcpy(allVertices.busyServers_, busyServers_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *numServers_; + HANDLE_ERROR(cudaMemcpy(allVertices.numServers_, numServers_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *numTrunks_; + HANDLE_ERROR(cudaMemcpy(allVertices.numTrunks_, numTrunks_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int **servingCallBufferVertexId_; + // uint64_t **servingCallBufferTime_; + // int **servingCallBufferDuration_; + // BGFLOAT **servingCallBufferX_; + // BGFLOAT **servingCallBufferY_; + // int **servingCallBufferPatience_; + // int **servingCallBufferOnSiteTime_; + // int **servingCallBufferResponderType_; + copyServingCallToDevice(numberOfVertices, allVertices); + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVertices.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime[i], answerTime_[i].data(), + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVertices.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown[i], serverCountdown_[i].data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + } + } + // int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMemcpy(allVertices.vertexIdToNoiseIndex_, vertexIdToNoiseIndex_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); +} + +/// @brief Helper function for copying vertex queues from device to CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyVertexQueuesFromDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // TODO: Review implementation with Prof Stiber + // int **vertexQueuesBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + // Make sure internal buffer can hold all device values + callIdInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callIdInBuffer.data(), callIdCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + // Only copy over the number of IDs that we have on the CPU. + for (int j = 0; j < buffer.size(); j++) { + buffer[j].vertexId = callIdInBuffer[j]; + } + // clear vector before filling with next vertex's call IDs + callIdInBuffer.clear(); + } + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callTimeInBuffer.data(), callTimeCpu[i], + (stepsPerEpoch + 1) * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].time = callTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callDurationInBuffer.data(), callDurationCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].duration = callDurationInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callLocationXInBuffer.data(), callLocationXCpu[i], + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].x = callLocationXInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callLocationYInBuffer.data(), callLocationYCpu[i], + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].y = callLocationYInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **vertexQueuesBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callPatienceInBuffer.data(), callPatienceCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].patience = callPatienceInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeInBuffer.data(), callOnSiteTimeCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].onSiteTime = callOnSiteTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callResponderTypeInBuffer.data(), callResponderTypeCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + if (callResponderTypeInBuffer[j] == 5) { + buffer[j].type = "EMS"; + } else if (callResponderTypeInBuffer[j] == 6) { + buffer[j].type = "Fire"; + } else if (callResponderTypeInBuffer[j] == 7) { + buffer[j].type = "Law"; + } + } + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } + // uint64_t *vertexQueuesFront_; + { + uint64_t queueFrontCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueFrontCpu, allVerticesDevice.vertexQueuesFront_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].setFrontIndex(queueFrontCpu[i]); + } + } + // uint64_t *vertexQueuesEnd_; + { + uint64_t queueEndCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueEndCpu, allVerticesDevice.vertexQueuesEnd_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].setEndIndex(queueEndCpu[i]); + } + } + // uint64_t *vertexQueuesBufferSize_; + { + uint64_t queueSizeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueSizeCpu, allVerticesDevice.vertexQueuesBufferSize_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].getBuffer().resize(queueSizeCpu[i]); + } + } +} + +void All911Vertices::copyServingCallFromDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // int **servingCallBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callIdInBuffer.data(), callIdCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].vertexId = callIdInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callTimeInBuffer.data(), callTimeCpu[i], + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].time = callTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **servingCallBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callDurationInBuffer.data(), callDurationCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].duration = callDurationInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callLocationXInBuffer.data(), callLocationXCpu[i], + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].x = callLocationXInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callLocationYInBuffer.data(), callLocationYCpu[i], + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].y = callLocationYInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **servingCallBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callPatienceInBuffer.data(), callPatienceCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].patience = callPatienceInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **servingCallBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeInBuffer.data(), callOnSiteTimeCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].onSiteTime = callOnSiteTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **servingCallBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callResponderTypeInBuffer.data(), callResponderTypeCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + if (callResponderTypeInBuffer[j] == 5) { + buffer[j].type = "EMS"; + } else if (callResponderTypeInBuffer[j] == 6) { + buffer[j].type = "Fire"; + } else if (callResponderTypeInBuffer[j] == 7) { + buffer[j].type = "Law"; + } + } + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } +} + +/// Copy all vertex data to host from device. +void All911Vertices::copyFromDevice() +{ + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + int numberOfVertices = simulator.getTotalVertices(); + + // Copy layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.copyToHost(); + layout911.yloc_.copyToHost(); + // int *vertexType_; + HANDLE_ERROR(cudaMemcpy(vertexType_.data(), allVertices.vertexType_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVertices.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(beginTimeHistory_[i].data(), cpuBeginTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *beginTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.beginTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *beginTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.beginTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *beginTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.beginTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *beginTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.beginTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVertices.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(answerTimeHistory_[i].data(), cpuAnswerTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *answerTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.answerTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *answerTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.answerTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *answerTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.answerTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *answerTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.answerTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVertices.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(endTimeHistory_[i].data(), cpuEndTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *endTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.endTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *endTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.endTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *endTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.endTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *endTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.endTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVertices.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(wasAbandonedHistory_[i].data(), cpuWasAbandonedHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *wasAbandonedHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.wasAbandonedHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *wasAbandonedHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.wasAbandonedHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *wasAbandonedHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.wasAbandonedHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *wasAbandonedHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, + allVertices.wasAbandonedHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVertices.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(queueLengthHistory_[i].data(), cpuQueueLengthHistory[i], + stepsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *queueLengthHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.queueLengthHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *queueLengthHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.queueLengthHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *queueLengthHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.queueLengthHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *queueLengthHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.queueLengthHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVertices.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(utilizationHistory_[i].data(), cpuUtilizationHistory[i], + stepsPerEpoch * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + } + } + // int *utilizationHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.utilizationHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *utilizationHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.utilizationHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *utilizationHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.utilizationHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *utilizationHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.utilizationHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // int **vertexQueuesBufferVertexId_; + // uint64_t **vertexQueuesBufferTime_; + // int **vertexQueuesBufferDuration_; + // BGFLOAT **vertexQueuesBufferX_; + // BGFLOAT **vertexQueuesBufferY_; + // int **vertexQueuesBufferPatience_; + // int **vertexQueuesBufferOnSiteTime_; + // int **vertexQueuesBufferResponderType_; + // uint64_t *vertexQueuesFront_; + // uint64_t *vertexQueuesEnd_; + copyVertexQueuesFromDevice(numberOfVertices, stepsPerEpoch, allVertices); + // int *droppedCalls_; + HANDLE_ERROR(cudaMemcpy(droppedCalls_.data(), allVertices.droppedCalls_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *receivedCalls_; + HANDLE_ERROR(cudaMemcpy(receivedCalls_.data(), allVertices.receivedCalls_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *busyServers_; + HANDLE_ERROR(cudaMemcpy(busyServers_.data(), allVertices.busyServers_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *numServers_; + HANDLE_ERROR(cudaMemcpy(numServers_.data(), allVertices.numServers_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *numTrunks_; + HANDLE_ERROR(cudaMemcpy(numTrunks_.data(), allVertices.numTrunks_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int **servingCallBufferVertexId_; + // uint64_t **servingCallBufferTime_; + // int **servingCallBufferDuration_; + // BGFLOAT **servingCallBufferX_; + // BGFLOAT **servingCallBufferY_; + // int **servingCallBufferPatience_; + // int **servingCallBufferOnSiteTime_; + // int **servingCallBufferResponderType_; + copyServingCallFromDevice(numberOfVertices, allVertices); + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVertices.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(answerTime_[i].data(), cpuAnswerTime[i], + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVertices.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(serverCountdown_[i].data(), cpuServerCountdown[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + } + } + // int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMemcpy(vertexIdToNoiseIndex_.data(), allVertices.vertexIdToNoiseIndex_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); +} + +/// @brief Update internal state of the indexed vertex (called by every simulation step). +/// @param edges Reference to the allEdges struct on host memory. +/// @param allVerticesDevice GPU address of the allVerticesDeviceProperties struct on device memory. +/// @param allEdgesDevice GPU address of the allEdgesDeviceProperties struct on device memory. +/// @param randNoise +/// @param edgeIndexMapDevice GPU address of the EdgeIndexMap on device memory. +void All911Vertices::advanceVertices(AllEdges &edges, void *allVerticesDevice, void *allEdgesDevice, + float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Return if no vertices are present + if (size_ == 0) + return; + // CUDA parameters + Simulator &simulator = Simulator::getInstance(); + const int threadsPerBlock = 256; + int blocksPerGrid = (simulator.getTotalVertices() + threadsPerBlock - 1) / threadsPerBlock; + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + BGFLOAT *xLoc_device = layout911.xloc_.getDevicePointer(); + BGFLOAT *yLoc_device = layout911.yloc_.getDevicePointer(); + // Advance vertices -------------> + advance911VerticesDevice<<>>( + size_, maxEventsPerEpoch, stepsPerEpoch, g_simulationStep, avgDrivingSpeed_, pi, randNoise, + redialP_, xLoc_device, yLoc_device, (All911VerticesDeviceProperties *)allVerticesDevice, + (All911EdgesDeviceProperties *)allEdgesDevice, edgeIndexMapDevice); + cudaDeviceSynchronize(); +} + +__global__ void advance911VerticesDevice( + int totalVertices, int maxEventsPerEpoch, uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, float redialValues[], BGFLOAT redialProbability, + BGFLOAT *xLocation, BGFLOAT *yLocation, All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // The usual thread ID calculation and guard against excess threads + // (beyond the number of vertices, in this case). + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= totalVertices) + return; + switch (allVerticesDevice->vertexType_[idx]) { + case 3: //CALR + advanceCALRVerticesDevice(idx, stepsPerEpoch, simulationStep, + redialValues[allVerticesDevice->vertexIdToNoiseIndex_[idx]], + redialProbability, allVerticesDevice, allEdgesDevice, + edgeIndexMapDevice); + break; + case 4: //PSAP + advancePSAPVerticesDevice(idx, maxEventsPerEpoch, stepsPerEpoch, simulationStep, xLocation, + yLocation, allVerticesDevice, allEdgesDevice, + edgeIndexMapDevice); + break; + case 5: //EMS + case 6: //FIRE + case 7: //LAW + advanceRESPVerticesDevice(idx, maxEventsPerEpoch, stepsPerEpoch, simulationStep, + drivingSpeed, pi, xLocation, yLocation, allVerticesDevice, + allEdgesDevice, edgeIndexMapDevice); + break; + default: + printf("ERROR: Vertex is of unknown type [%d]\n", allVerticesDevice->vertexType_[idx]); + } +} + +/// CUDA code for advancing Caller region vertices +/// +__device__ void advanceCALRVerticesDevice(int vertexId, uint64_t stepsPerEpoch, + uint64_t simulationStep, BGFLOAT redialValue, + BGFLOAT redialProbability, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // There is only one outgoing edge from CALR to a PSAP + BGSIZE edgeIdx + = edgeIndexMapDevice->outgoingEdgeIndexMap_[edgeIndexMapDevice->outgoingEdgeBegin_[vertexId]]; + + unsigned char makeAvailable = (1 - allEdgesDevice->isAvailable_[edgeIdx]) + * (1 - allEdgesDevice->isRedial_[edgeIdx]) + * (unsigned char)(redialValue >= redialProbability); + + allEdgesDevice->isAvailable_[edgeIdx] |= makeAvailable; + allEdgesDevice->isRedial_[edgeIdx] + |= (1 - allEdgesDevice->isAvailable_[edgeIdx]) * (1 - makeAvailable); + + // peek at the next call in the queue + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexId]; + if (allEdgesDevice->isAvailable_[edgeIdx] + && (allVerticesDevice->vertexQueuesFront_[vertexId] != queueEndIndex) + && allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex] <= simulationStep) { + // Place new call in the edge going to the PSAP + if (!allEdgesDevice->isAvailable_[edgeIdx]) { + printf("ERROR: Edge ID [%d] already has a call for vertex ID [%d]\n", edgeIdx, vertexId); + return; + } + // Calls that start at the same time are process in the order they appear. + // The call starts at the current time step so we need to pop it and process it + // Process the call + allEdgesDevice->vertexId_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferVertexId_[vertexId][queueEndIndex]; + allEdgesDevice->time_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex]; + allEdgesDevice->duration_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferDuration_[vertexId][queueEndIndex]; + allEdgesDevice->x_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferX_[vertexId][queueEndIndex]; + allEdgesDevice->y_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferY_[vertexId][queueEndIndex]; + allEdgesDevice->patience_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferPatience_[vertexId][queueEndIndex]; + allEdgesDevice->onSiteTime_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexId][queueEndIndex]; + allEdgesDevice->responderType_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexId][queueEndIndex]; + + // Pop from the queue + queueEndIndex = (queueEndIndex + 1) % (stepsPerEpoch + 1); + allEdgesDevice->isAvailable_[edgeIdx] = false; + } +} + +/// CUDA code for advancing PSAP vertices +/// +__device__ void advancePSAPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT *xLocation, BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Loop over all servers and free the ones finishing serving calls + int numberOfAvailableServers = 0; + unsigned char *availableServers + = (unsigned char *)malloc(allVerticesDevice->numServers_[vertexIdx] * sizeof(unsigned char)); + // Sanity check that malloc was successful + if (availableServers == nullptr) { + printf("ERROR: Failed to allocate memory for availableServers used by vertex ID [%d]\n", + vertexIdx); + return; + } + for (size_t server = 0; server < allVerticesDevice->numServers_[vertexIdx]; ++server) { + int countdown = allVerticesDevice->serverCountdown_[vertexIdx][server]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + allVerticesDevice->serverCountdown_[vertexIdx][server] = countdown; + + // Set the available unit if it was already available or became available + availableServers[server] = (unsigned char)(countdown == 0); + numberOfAvailableServers += (countdown == 0); + + // If it became zero, the unit responds to the new incident + if ((!countdownWasZero) & (countdown == 0)) { + // Server becomes free to take calls + // TODO: What about wrap-up time? + + //Store call metrics + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] + = allVerticesDevice->answerTime_[vertexIdx][server]; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + + // loop over the outgoing edges looking for the responder with the shortest + // Euclidean distance to the call's location. + BGSIZE resp, respEdge; + BGFLOAT minDistance = FLT_MAX; + for (BGSIZE eIdxMap = edgeIndexMapDevice->outgoingEdgeBegin_[vertexIdx]; + eIdxMap < edgeIndexMapDevice->outgoingEdgeBegin_[vertexIdx] + + edgeIndexMapDevice->outgoingEdgeCount_[vertexIdx]; + ++eIdxMap) { + if (!allEdgesDevice->inUse_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]) { + printf("ERROR: Edge must be in use. Edge ID [%d] Vertex ID [%d]\n", + edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap], vertexIdx); + return; + } + + if (allVerticesDevice + ->vertexType_[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]] + == allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]) { + // Calculates the distance between the given vertex and the (x, y) coordinates of a call + BGFLOAT distance = sqrtf( + powf(allVerticesDevice->servingCallBufferX_[vertexIdx][server] + - xLocation[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]], + 2) + + (powf(allVerticesDevice->servingCallBufferY_[vertexIdx][server] + - yLocation[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]], + 2))); + + if (distance < minDistance) { + minDistance = distance; + resp = allEdgesDevice + ->destVertexIndex_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]; + respEdge = edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]; + } + } + } + + // We must have found the closest responder of the right type + if (minDistance >= FLT_MAX) { + printf( + "ERROR: Distance found was not the minimum distance. Distance [%f] Responder Edge ID [%u] Vertex ID [%d]\n", + minDistance, respEdge, vertexIdx); + return; + } + if (allVerticesDevice->vertexType_[resp] + != allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]) { + printf( + "ERROR: Responder vertex was the wrong type. Responder Type [%d] Required Type [%d]\n", + allVerticesDevice->vertexType_[respEdge], + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]); + return; + } + + // Place the call in the edge going to the responder + // Call becomes a dispatch order at this time + allVerticesDevice->servingCallBufferTime_[vertexIdx][server] = simulationStep; + + //edges911.call_[respEdge] = endingCall; + allEdgesDevice->vertexId_[respEdge] + = allVerticesDevice->servingCallBufferVertexId_[vertexIdx][server]; + allEdgesDevice->time_[respEdge] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + allEdgesDevice->duration_[respEdge] + = allVerticesDevice->servingCallBufferDuration_[vertexIdx][server]; + allEdgesDevice->x_[respEdge] = allVerticesDevice->servingCallBufferX_[vertexIdx][server]; + allEdgesDevice->y_[respEdge] = allVerticesDevice->servingCallBufferY_[vertexIdx][server]; + allEdgesDevice->patience_[respEdge] + = allVerticesDevice->servingCallBufferPatience_[vertexIdx][server]; + allEdgesDevice->onSiteTime_[respEdge] + = allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][server]; + allEdgesDevice->responderType_[respEdge] + = allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]; + + allEdgesDevice->isAvailable_[respEdge] = false; + } + } + + // Assign calls to servers until either no servers are available or + // there are no more calls in the waiting queue + int currentlyAvailableServers = numberOfAvailableServers; + //uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[vertexIdx]; + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexIdx]; + while (currentlyAvailableServers > 0 + && !(allVerticesDevice->vertexQueuesFront_[vertexIdx] == queueEndIndex)) { + // TODO: calls with duration of zero are being added but because countdown will be zero + // they don't show up in the logs + int callId = allVerticesDevice->vertexQueuesBufferVertexId_[vertexIdx][queueEndIndex]; + uint64_t callTime = allVerticesDevice->vertexQueuesBufferTime_[vertexIdx][queueEndIndex]; + int callDuration = allVerticesDevice->vertexQueuesBufferDuration_[vertexIdx][queueEndIndex]; + BGFLOAT callX = allVerticesDevice->vertexQueuesBufferX_[vertexIdx][queueEndIndex]; + BGFLOAT callY = allVerticesDevice->vertexQueuesBufferY_[vertexIdx][queueEndIndex]; + int callPatience = allVerticesDevice->vertexQueuesBufferPatience_[vertexIdx][queueEndIndex]; + int callOnSiteTime + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexIdx][queueEndIndex]; + int callResponderType + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexIdx][queueEndIndex]; + queueEndIndex = (queueEndIndex + 1) % (allVerticesDevice->numTrunks_[vertexIdx] + 1); + + if (callPatience < (simulationStep - callTime)) { + // If the patience time is less than the waiting time, the call is abandoned + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = true; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] = callTime; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Answer time and end time get zero as sentinel for non-valid values + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] = 0; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = 0; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + } else { + // The available server starts serving the call + int availServer = -1; + for (BGSIZE serverIndex = 0; serverIndex < allVerticesDevice->numServers_[vertexIdx]; + serverIndex++) { + // Add 0 if server is not available or 1 + serverIndex if it's available and a server has not already been found + availServer + += (availableServers[serverIndex] == true && availServer == -1) * (serverIndex + 1); + // Decrement by 1 if the server is available and a server has not already been found + currentlyAvailableServers + -= (availableServers[serverIndex] == true && availServer == -1); + // Flip value only if the server is available and a server has not been found + availableServers[serverIndex] + = (unsigned char)(availableServers[serverIndex] + == true + - (availableServers[serverIndex] == true + && availServer == -1)); + } + allVerticesDevice->servingCallBufferVertexId_[vertexIdx][availServer] = callId; + allVerticesDevice->servingCallBufferTime_[vertexIdx][availServer] = callTime; + allVerticesDevice->servingCallBufferDuration_[vertexIdx][availServer] = callDuration; + allVerticesDevice->servingCallBufferX_[vertexIdx][availServer] = callX; + allVerticesDevice->servingCallBufferY_[vertexIdx][availServer] = callY; + allVerticesDevice->servingCallBufferPatience_[vertexIdx][availServer] = callPatience; + allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][availServer] = callOnSiteTime; + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][availServer] + = callResponderType; + + allVerticesDevice->answerTime_[vertexIdx][availServer] = simulationStep; + allVerticesDevice->serverCountdown_[vertexIdx][availServer] = callDuration; + } + } + + // Update number of busy servers. This is used to check if there is space in the queue + allVerticesDevice->busyServers_[vertexIdx] + = allVerticesDevice->numServers_[vertexIdx] - numberOfAvailableServers; + + // Update queueLength and utilization histories + // Compute the size of the destination queue for queue length + //uint64_t queueSize; + // if (queueFrontIndex >= queueEndIndex) { + // queueSize = queueFrontIndex - queueEndIndex; + // } else { + // queueSize = stepsPerEpoch + queueFrontIndex - queueEndIndex; + // } + // EventBuffer::insertEvent + if (allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: queueLengthHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &queueLengthHistoryQueueEnd = allVerticesDevice->queueLengthHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->queueLengthHistory_[vertexIdx][queueLengthHistoryQueueEnd] + = stepsPerEpoch * (1 - (allVerticesDevice->vertexQueuesFront_[vertexIdx] >= queueEndIndex)) + + allVerticesDevice->vertexQueuesFront_[vertexIdx] - queueEndIndex; //queueSize + queueLengthHistoryQueueEnd = (queueLengthHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]++; + // EventBuffer::insertEvent + if (allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: utilizationHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &utilizationHistoryQueueEnd = allVerticesDevice->utilizationHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->utilizationHistory_[vertexIdx][utilizationHistoryQueueEnd] + = static_cast(allVerticesDevice->busyServers_[vertexIdx]) + / allVerticesDevice->numServers_[vertexIdx]; + utilizationHistoryQueueEnd = (utilizationHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]++; + + // Free the availableServers array + free(availableServers); +} + +/// CUDA code for advancing emergency responder vertices +/// +__device__ void advanceRESPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, BGFLOAT *xLocation, + BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Free the units finishing up with emergency responses + int numberOfAvailableUnits = 0; + unsigned char *availableUnits + = (unsigned char *)malloc(allVerticesDevice->numServers_[vertexIdx] * sizeof(unsigned char)); + // Sanity check that malloc was successful + if (availableUnits == nullptr) { + printf("ERROR: Failed to allocate memory for availableUnits used by vertex ID [%d]\n", + vertexIdx); + return; + } + for (size_t unit = 0; unit < allVerticesDevice->numServers_[vertexIdx]; ++unit) { + int countdown = allVerticesDevice->serverCountdown_[vertexIdx][unit]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + allVerticesDevice->serverCountdown_[vertexIdx][unit] = countdown; + + // Set the available unit if it was already available or became available + availableUnits[unit] = (unsigned char)(countdown == 0); + numberOfAvailableUnits += (countdown == 0); + + // If it became zero, the unit responds to the new incident + if ((!countdownWasZero) & (countdown == 0)) { + // Unit becomes available to responde to new incidents + + //Store incident response metrics + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][unit]; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] + = allVerticesDevice->answerTime_[vertexIdx][unit]; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + } + } + + + // Assign reponse dispatches until no units are available or there are no more + // incidents in the waiting queue + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexIdx]; + for (size_t unit = 0; unit < numberOfAvailableUnits + && !(allVerticesDevice->vertexQueuesFront_[vertexIdx] == queueEndIndex); + ++unit) { + int incidentId = allVerticesDevice->vertexQueuesBufferVertexId_[vertexIdx][queueEndIndex]; + uint64_t incidentTime = allVerticesDevice->vertexQueuesBufferTime_[vertexIdx][queueEndIndex]; + int incidentDuration + = allVerticesDevice->vertexQueuesBufferDuration_[vertexIdx][queueEndIndex]; + BGFLOAT incidentX = allVerticesDevice->vertexQueuesBufferX_[vertexIdx][queueEndIndex]; + BGFLOAT incidentY = allVerticesDevice->vertexQueuesBufferY_[vertexIdx][queueEndIndex]; + int incidentPatience + = allVerticesDevice->vertexQueuesBufferPatience_[vertexIdx][queueEndIndex]; + int incidentOnSiteTime + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexIdx][queueEndIndex]; + int incidentResponderType + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexIdx][queueEndIndex]; + queueEndIndex = (queueEndIndex + 1) % (allVerticesDevice->numTrunks_[vertexIdx] + 1); + + // The available unit starts serving the call + int availUnit = -1; + for (BGSIZE unitIndex = 0; unitIndex < allVerticesDevice->numServers_[vertexIdx]; + unitIndex++) { + // Add 0 if unit is not available or 1 + unitIndex if it's available and a unit has not already been found + availUnit += (availableUnits[unitIndex] == true && availUnit == -1) * (unitIndex + 1); + // Flip value only if the unit is available and a unit has not been found + availableUnits[unitIndex] + = (unsigned char)(availableUnits[unitIndex] + == true - (availableUnits[unitIndex] == true && availUnit == -1)); + } + allVerticesDevice->servingCallBufferVertexId_[vertexIdx][availUnit] = incidentId; + allVerticesDevice->servingCallBufferTime_[vertexIdx][availUnit] = incidentTime; + allVerticesDevice->servingCallBufferDuration_[vertexIdx][availUnit] = incidentDuration; + allVerticesDevice->servingCallBufferX_[vertexIdx][availUnit] = incidentX; + allVerticesDevice->servingCallBufferY_[vertexIdx][availUnit] = incidentY; + allVerticesDevice->servingCallBufferPatience_[vertexIdx][availUnit] = incidentPatience; + allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][availUnit] = incidentOnSiteTime; + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][availUnit] + = incidentResponderType; + + allVerticesDevice->answerTime_[vertexIdx][availUnit] = simulationStep; + + // We need to calculate the distance in miles but the x and y coordinates + // represent, respectively, degrees of longitude and latitude. + // One degree of latitude is aproximately 69 miles regardles of the location. However, + // a degree of longitude varies, being 69.172 miles at the equator and gradually shrinking + // to zero at the poles. + // One degree of longitude can be converted to miles using the following formula: + // 1 degree of longitude = cos(latitude) * 69.172 + // BGFLOAT lngDegreeLength = cos(yLocation[vertexIdx] * (pi / 180)) * 69.172f; + // BGFLOAT latDegreeLength = 69.0; + // BGFLOAT deltaLng = incidentX - xLocation[vertexIdx]; + // BGFLOAT deltaLat = incidentY - yLocation[vertexIdx]; + // BGFLOAT dist2incident + // = sqrtf(powf(incidentX - xLocation[vertexIdx] * cos(yLocation[vertexIdx] * (pi / 180)) * 69.172f, 2) + powf(incidentY - yLocation[vertexIdx] * 69.0f, 2)); + + // Calculate the driving time to the incident in seconds + // BGFLOAT driveTime = (dist2incident / drivingSpeed) * 3600; + // allVerticesDevice->serverCountdown_[vertexIdx][availUnit] = driveTime + incidentOnSiteTime; + + /// Wouldn't this just immediately overwrite the above? Why is it needed? + allVerticesDevice->serverCountdown_[vertexIdx][availUnit] = incidentDuration; + } + + // Update number of busy servers. This is used to check if there is space in the queue + allVerticesDevice->busyServers_[vertexIdx] + = allVerticesDevice->numServers_[vertexIdx] - numberOfAvailableUnits; + + // Update queueLength and utilization histories + // // Compute the size of the destination queue for queue length + // uint64_t queueSize; + // // if (queueFrontIndex >= queueEndIndex) { + // // queueSize = queueFrontIndex - queueEndIndex; + // // } else { + // // queueSize = stepsPerEpoch + queueFrontIndex - queueEndIndex; + // // } + // EventBuffer::insertEvent + if (allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: queueLengthHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &queueLengthHistoryQueueEnd = allVerticesDevice->queueLengthHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->queueLengthHistory_[vertexIdx][queueLengthHistoryQueueEnd] + = stepsPerEpoch * (1 - (allVerticesDevice->vertexQueuesFront_[vertexIdx] >= queueEndIndex)) + + allVerticesDevice->vertexQueuesFront_[vertexIdx] - queueEndIndex; + queueLengthHistoryQueueEnd = (queueLengthHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]++; + // EventBuffer::insertEvent + if (allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: utilizationHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &utilizationHistoryQueueEnd = allVerticesDevice->utilizationHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->utilizationHistory_[vertexIdx][utilizationHistoryQueueEnd] + = static_cast(allVerticesDevice->busyServers_[vertexIdx]) + / allVerticesDevice->numServers_[vertexIdx]; + utilizationHistoryQueueEnd = (utilizationHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]++; + + // Free the availableUnits array + free(availableUnits); +} + +/// Take a call from an edge and add it to the queue if the queue isn't full. +/// +/// @param allVerticesDevice GPU address of the allVertices struct on device memory. +/// @param edgeIndexMapDevice GPU address of the EdgeIndexMap on device memory. +/// @param allEdgesDevice GPU address of the allEdges struct on device memory. +void All911Vertices::integrateVertexInputs(void *allVerticesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice, + void *allEdgesDevice) +{ + // CUDA parameters + Simulator &simulator = Simulator::getInstance(); + int totalVertices = simulator.getTotalVertices(); + const int threadsPerBlock = 256; + int blocksPerGrid = (totalVertices + threadsPerBlock - 1) / threadsPerBlock; + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + + maybeTakeCallFromEdge<<>>( + totalVertices, stepsPerEpoch, (All911VerticesDeviceProperties *)allVerticesDevice, + (All911EdgesDeviceProperties *)allEdgesDevice, edgeIndexMapDevice); + cudaDeviceSynchronize(); +} + +__global__ void maybeTakeCallFromEdge(int totalVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // The usual thread ID calculation and guard against excess threads + // (beyond the number of vertices, in this case). + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= totalVertices) + return; + + // TODO911: Caller Regions will have different behaviour + if (allVerticesDevice->vertexType_[idx] == 3) { + return; + } + + // Loop over all the edges and pull the data in + for (int edge = edgeIndexMapDevice->incomingEdgeBegin_[idx]; + edge + < edgeIndexMapDevice->incomingEdgeBegin_[idx] + edgeIndexMapDevice->incomingEdgeCount_[idx]; + ++edge) { + int edgeIdx = edgeIndexMapDevice->incomingEdgeIndexMap_[edge]; + + if (!allEdgesDevice->inUse_[edgeIdx] || allEdgesDevice->isAvailable_[edgeIdx]) { + continue; // Edge isn't in use and doesn't have a call + } + + int dstIndex = allEdgesDevice->destVertexIndex_[edgeIdx]; + // The destination vertex should be the one pulling the information + if (dstIndex != idx) { + printf( + "ERROR: The destination vertex is responsible for pulling in it's calls. Destination Vertex ID [%d] Vertex ID [%d]\n", + dstIndex, idx); + return; + } + + // Compute the size of the destination queue + uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[dstIndex]; + int queueFull + = (int)((1 - (queueFrontIndex >= allVerticesDevice->vertexQueuesEnd_[dstIndex])) + * (allVerticesDevice->numTrunks_[dstIndex] + 1) + + queueFrontIndex - allVerticesDevice->vertexQueuesEnd_[dstIndex]) + >= (allVerticesDevice->numTrunks_[dstIndex] - allVerticesDevice->busyServers_[dstIndex]); + allVerticesDevice->droppedCalls_[dstIndex] + += queueFull && (!allEdgesDevice->isRedial_[edgeIdx]); + allVerticesDevice->receivedCalls_[dstIndex] + += queueFull && (!allEdgesDevice->isRedial_[edgeIdx]); + if (!queueFull) { + // Transfer call to destination + // We throw an error if the buffer is full + if (((queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1)) + == allVerticesDevice->vertexQueuesEnd_[dstIndex]) { + printf("ERROR: Vertex queue is full. Vertex ID [%d] Front Index [%" PRIu64 + "] End Index [%" PRIu64 "] Buffer size [%" PRIu64 "]\n", + dstIndex, queueFrontIndex, allVerticesDevice->vertexQueuesEnd_[dstIndex], + (allVerticesDevice->numTrunks_[dstIndex] + 1)); + return; + } + // Insert the new element and increment the front index + allVerticesDevice->vertexQueuesBufferVertexId_[dstIndex][queueFrontIndex] + = allEdgesDevice->vertexId_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferTime_[dstIndex][queueFrontIndex] + = allEdgesDevice->time_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferDuration_[dstIndex][queueFrontIndex] + = allEdgesDevice->duration_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferX_[dstIndex][queueFrontIndex] + = allEdgesDevice->x_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferY_[dstIndex][queueFrontIndex] + = allEdgesDevice->y_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferPatience_[dstIndex][queueFrontIndex] + = allEdgesDevice->patience_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferOnSiteTime_[dstIndex][queueFrontIndex] + = allEdgesDevice->onSiteTime_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferResponderType_[dstIndex][queueFrontIndex] + = allEdgesDevice->responderType_[edgeIdx]; + allVerticesDevice->vertexQueuesFront_[dstIndex] + = (queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1); + // Record that we received a call + allVerticesDevice->receivedCalls_[dstIndex]++; + allEdgesDevice->isAvailable_[edgeIdx] = true; + allEdgesDevice->isRedial_[edgeIdx] = false; + } + } +} + +void All911Vertices::clearVertexHistory(void *allVerticesDevice) +{ + /// What exactly should this clear out? Probably at least the vertex queues + All911VerticesDeviceProperties allVertices; + HANDLE_ERROR(cudaMemcpy(&allVertices, allVerticesDevice, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + int numberOfVertices = Simulator::getInstance().getTotalVertices(); + // uint64_t **beginTimeHistory_ + HANDLE_ERROR(cudaMemset(allVertices.beginTimeHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = beginTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **answerTimeHistory_ + HANDLE_ERROR(cudaMemset(allVertices.answerTimeHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = answerTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **endTimeHistory_ + HANDLE_ERROR( + cudaMemset(allVertices.endTimeHistoryNumElementsInEpoch_, 0, numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = endTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **wasAbandonedHistory_ + HANDLE_ERROR(cudaMemset(allVertices.wasAbandonedHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = wasAbandonedHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **queueLengthHistory_ + HANDLE_ERROR(cudaMemset(allVertices.queueLengthHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = queueLengthHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // BGFLOAT **utilizationHistory_ + HANDLE_ERROR(cudaMemset(allVertices.utilizationHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = utilizationHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } +} + +/// Copies all inputs scheduled to occur in the upcoming epoch onto device. +void All911Vertices::copyEpochInputsToDevice() +{ + LOG4CPLUS_DEBUG(fileLogger_, "Calling All911Vertices::copyEpochInputsToDevice"); + // The only new inputs are going to be for caller region vertices. However, due to how + // we have our memory organized on the GPU, we need to copy over all queues instead of + // just the queues with new inputs. + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + int numberOfVertices = simulator.getTotalVertices(); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + copyVertexQueuesToDevice(numberOfVertices, stepsPerEpoch, allVertices); +} + +void All911Vertices::setAdvanceVerticesDeviceParams(AllEdges &edges) +{ + LOG4CPLUS_DEBUG(vertexLogger_, "Setting Advance Vertices device parameters"); +} + +int All911Vertices::getNumberOfVerticesNeedingDeviceNoise() const +{ + return numberOfVerticesNeedingDeviceNoise_; +} \ No newline at end of file diff --git a/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp b/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp index 9a3602ec6..b1201ac26 100644 --- a/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp +++ b/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp @@ -138,14 +138,14 @@ void AllSpikingNeurons::copyFromDevice() uint64_t *pSpikeHistory[numVertices]; HANDLE_ERROR(cudaMemcpy(pSpikeHistory, allVerticesDevice.spikeHistory_, - numVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + numVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); // All EventBuffers are of the same size, // which is one greater than maxSpikes in GPU spikeHistory array. int maxSpikes = vertexEvents_[0].size(); for (int i = 0; i < numVertices; i++) { HANDLE_ERROR(cudaMemcpy(vertexEvents_[i].data(), pSpikeHistory[i], - maxSpikes * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + maxSpikes * sizeof(uint64_t), cudaMemcpyDeviceToHost)); } } diff --git a/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml b/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml index 173c25fd2..13cb42ada 100644 Binary files a/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml and b/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml differ diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-long-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-long-out.xml index cabfb69d2..c3836ffd9 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-long-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-long-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 - - - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 - - - 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 2009016 2010444 2012302 2028383 2041077 2068744 2091604 2103452 2113163 2116734 2145232 2172268 2179957 2187608 2193846 2208269 2221371 2229857 2271078 2301281 2314175 2337784 2344798 2346234 2350212 2352903 2367966 2370426 2396718 2412987 2421462 2440374 2451744 2452570 2462667 2464122 2474143 2489412 2491355 2496337 2502661 2504420 2509156 2515974 2518315 2531661 2566123 2570146 2574676 2578833 2586261 2596544 2599831 2608829 2613424 2623632 2673856 2702137 2708959 2714132 2734312 2757749 2762260 2769940 2770969 2772189 2778403 2782430 2803417 2813425 2837196 2842017 2848362 2854072 2860565 2864131 2869113 2874260 2889192 2899930 2901745 2904723 2917415 2924608 2937800 2942760 2948077 2951064 2965433 2969022 2974904 2980717 2995070 3011758 3023923 3027877 3029140 3031645 3032768 3035325 3042118 3043521 3052540 3058356 3065164 3090857 3096174 3100728 3107862 3135983 3138285 3154894 3163473 3167149 3177045 3194921 3207713 3218819 3221785 3227207 3231279 3238466 3247564 3248797 3255244 3267976 3321296 3330121 3341390 3342267 3346730 3352120 3354099 3358980 3360731 3383366 3388639 3396328 3404870 3411233 3417478 3422295 3425188 3439978 3453502 3462788 3465027 3476054 3479497 3485077 3491935 3495718 3516317 3520207 3540178 3543657 3554565 3557178 3576591 3587656 3590186 3593329 3598049 3601099 3616624 3656336 3659088 3677044 3695480 3715289 3721645 3765614 3775087 3788521 3793754 3795276 3803614 3805412 3816164 3854861 3856039 3876161 3903814 3907180 3918540 3925634 3927247 3936905 3938777 3942054 3946994 3955471 3968155 3972288 3974802 3987494 3994417 3996342 4004609 4008645 4025531 4030626 4035090 4043749 4059530 4063048 4069637 4075211 4078154 4082610 4099636 4100861 4132380 4147935 4161171 4195318 4207620 4208934 4212661 4237882 4240588 4244494 4273297 4275327 4284175 4294288 4304858 4331384 4342298 4352197 4357866 4373535 4375074 4384005 4390495 4393094 4404469 4414688 4433360 4436651 4445068 4460473 4502941 4515894 4533797 4558247 4559777 4561476 4562871 4579138 4607190 4614471 4620006 4623378 4637450 4655438 4667074 4675867 4685395 4694180 4704565 4707917 4715415 4730074 4737154 4748053 4752894 4761823 4769043 4770327 4773038 4788915 4798758 4813038 4821450 4838265 4859543 4877916 4897445 4901948 4913027 4915214 4920323 4922643 4947864 4949074 4951519 4970888 4978296 4989441 4996194 5002155 5008671 5013998 5024357 5044523 5057157 5063983 5066060 5067675 5085109 5102139 5110689 5130494 5134839 5136863 5180509 5185245 5191344 5211060 5216720 5262167 5270147 5277678 5280422 5282683 5288246 5290089 5305074 5312392 5321709 5326697 5336816 5338241 5344444 5350565 5357183 5360837 5365413 5366855 5374942 5387183 5397985 5406770 5410596 5428673 5433808 5444544 5449794 5452821 5456362 5464777 5473302 5480302 5486438 5489237 5494212 5514024 5533484 5546245 5548786 5551954 5563639 5597219 5606276 5635427 5644474 5663248 5669858 5688754 5698462 5703064 5730167 5733892 5737474 5750786 5760665 5771807 5788907 5791404 5795056 5818972 5831586 5835051 5841696 5843926 5856096 5871819 5874812 5895865 5902814 5904433 5915333 5927956 5929886 5936113 5955128 5956695 5962058 5965015 5966647 5967766 5982602 6000868 6005599 6012700 6023614 6029328 6034017 6062078 6067574 6078494 6079888 6089740 6105022 6114450 6131864 6142498 6146302 6156323 6176817 6182268 6206086 6210516 6244497 6255191 6258307 6261734 6284875 6296737 6307643 6319744 6328631 6337166 6342906 6354801 6360261 6374767 6379240 6390077 6393189 6412405 6415262 6422552 6431812 6442133 6466705 6475156 6481121 6498798 6500194 6508638 6512554 6531535 6550506 6567752 6574152 6581086 6589108 6592410 6596219 6600599 6608199 6639716 6661106 6668217 6672295 6693573 6696880 6703886 6716851 6720660 6721674 6724387 6736294 6740654 6756307 6778923 6800361 6803629 6820901 6823729 6829282 6851750 6857777 6860402 6881219 6904232 6912491 6915271 6930620 6949650 6955164 6958952 6995228 7005925 7010188 7018777 7043357 7067326 7068403 7071078 7104732 7106963 7119275 7144555 7147150 7188893 7191707 7192825 7196954 7212961 7223887 7232759 7242714 7248773 7265070 7272546 7289544 7291315 7307330 7312980 7315691 7318210 7327946 7339024 7354542 7360570 7371573 7376185 7377717 7384995 7386410 7392234 7394371 7411635 7425273 7429792 7436465 7456486 7484764 7488996 7503458 7515330 7522184 7531563 7538670 7539915 7544298 7556097 7558695 7562489 7567472 7568636 7570921 7580971 7586409 7601850 7611114 7620829 7629192 7636331 7640173 7652631 7689813 7706083 7708114 7717883 7725332 7731025 7741039 7742086 7744870 7753225 7756079 7762002 7776062 7781176 7782727 7798804 7825713 7832065 7842541 7851754 7854294 7865220 7878744 7880688 7883613 7884785 7886288 7893828 7903137 7906810 7925767 7936745 7944736 7951395 7963578 7968883 7972712 7974562 7977093 7987499 7994834 7999438 8015523 8025354 8028370 8031995 8087724 8128172 8133741 8142570 8149244 8156791 8169765 8173648 8178850 8184451 8195910 8200627 8214853 8220986 8252207 8260040 8263635 8274810 8293248 8312211 8313852 8316892 8338726 8353355 8356710 8361407 8368825 8403217 8408197 8424367 8430216 8436287 8446882 8468965 8472699 8485896 8503903 8512475 8527017 8528856 8531663 8544385 8554959 8559315 8591077 8603246 8612454 8616155 8623815 8631884 8634655 8639363 8668615 8681582 8686082 8700332 8704511 8726623 8732109 8733848 8747909 8762684 8784996 8786771 8806157 8810817 8825454 8844473 8889183 8891722 8930253 8935837 8936983 8943671 8945001 8968312 8979599 8988954 9002444 9014285 9021129 9028218 9055048 9076860 9086803 9119723 9129475 9159946 9193128 9210233 9211469 9241572 9252095 9269419 9287248 9288610 9298985 9303572 9308979 9310140 9316388 9323882 9327325 9342693 9344955 9348501 9359532 9362018 9393721 9423058 9425310 9437405 9458823 9470174 9477637 9507239 9514394 9516043 9525730 9551421 9553391 9555557 9564113 9568711 9571982 9579534 9580957 9582651 9609951 9636438 9639966 9649412 9670187 9679372 9682147 9694821 9703974 9706605 9708579 9710720 9719634 9723729 9734322 9749390 9754343 9764465 9765825 9769319 9794487 9796305 9802043 9805896 9820251 9824661 9826200 9832255 9839648 9849841 9851751 9871751 9874693 9877626 9879503 9890488 9897026 9905033 9925113 9946997 9950090 9955231 9961489 9963037 9968789 9984513 9996726 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-out.xml index aee07e5d1..28ce08038 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-connected-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 - - - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 - - - 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-long-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-long-out.xml index cabfb69d2..c3836ffd9 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-long-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-long-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 - - - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 - - - 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 2009016 2010444 2012302 2028383 2041077 2068744 2091604 2103452 2113163 2116734 2145232 2172268 2179957 2187608 2193846 2208269 2221371 2229857 2271078 2301281 2314175 2337784 2344798 2346234 2350212 2352903 2367966 2370426 2396718 2412987 2421462 2440374 2451744 2452570 2462667 2464122 2474143 2489412 2491355 2496337 2502661 2504420 2509156 2515974 2518315 2531661 2566123 2570146 2574676 2578833 2586261 2596544 2599831 2608829 2613424 2623632 2673856 2702137 2708959 2714132 2734312 2757749 2762260 2769940 2770969 2772189 2778403 2782430 2803417 2813425 2837196 2842017 2848362 2854072 2860565 2864131 2869113 2874260 2889192 2899930 2901745 2904723 2917415 2924608 2937800 2942760 2948077 2951064 2965433 2969022 2974904 2980717 2995070 3011758 3023923 3027877 3029140 3031645 3032768 3035325 3042118 3043521 3052540 3058356 3065164 3090857 3096174 3100728 3107862 3135983 3138285 3154894 3163473 3167149 3177045 3194921 3207713 3218819 3221785 3227207 3231279 3238466 3247564 3248797 3255244 3267976 3321296 3330121 3341390 3342267 3346730 3352120 3354099 3358980 3360731 3383366 3388639 3396328 3404870 3411233 3417478 3422295 3425188 3439978 3453502 3462788 3465027 3476054 3479497 3485077 3491935 3495718 3516317 3520207 3540178 3543657 3554565 3557178 3576591 3587656 3590186 3593329 3598049 3601099 3616624 3656336 3659088 3677044 3695480 3715289 3721645 3765614 3775087 3788521 3793754 3795276 3803614 3805412 3816164 3854861 3856039 3876161 3903814 3907180 3918540 3925634 3927247 3936905 3938777 3942054 3946994 3955471 3968155 3972288 3974802 3987494 3994417 3996342 4004609 4008645 4025531 4030626 4035090 4043749 4059530 4063048 4069637 4075211 4078154 4082610 4099636 4100861 4132380 4147935 4161171 4195318 4207620 4208934 4212661 4237882 4240588 4244494 4273297 4275327 4284175 4294288 4304858 4331384 4342298 4352197 4357866 4373535 4375074 4384005 4390495 4393094 4404469 4414688 4433360 4436651 4445068 4460473 4502941 4515894 4533797 4558247 4559777 4561476 4562871 4579138 4607190 4614471 4620006 4623378 4637450 4655438 4667074 4675867 4685395 4694180 4704565 4707917 4715415 4730074 4737154 4748053 4752894 4761823 4769043 4770327 4773038 4788915 4798758 4813038 4821450 4838265 4859543 4877916 4897445 4901948 4913027 4915214 4920323 4922643 4947864 4949074 4951519 4970888 4978296 4989441 4996194 5002155 5008671 5013998 5024357 5044523 5057157 5063983 5066060 5067675 5085109 5102139 5110689 5130494 5134839 5136863 5180509 5185245 5191344 5211060 5216720 5262167 5270147 5277678 5280422 5282683 5288246 5290089 5305074 5312392 5321709 5326697 5336816 5338241 5344444 5350565 5357183 5360837 5365413 5366855 5374942 5387183 5397985 5406770 5410596 5428673 5433808 5444544 5449794 5452821 5456362 5464777 5473302 5480302 5486438 5489237 5494212 5514024 5533484 5546245 5548786 5551954 5563639 5597219 5606276 5635427 5644474 5663248 5669858 5688754 5698462 5703064 5730167 5733892 5737474 5750786 5760665 5771807 5788907 5791404 5795056 5818972 5831586 5835051 5841696 5843926 5856096 5871819 5874812 5895865 5902814 5904433 5915333 5927956 5929886 5936113 5955128 5956695 5962058 5965015 5966647 5967766 5982602 6000868 6005599 6012700 6023614 6029328 6034017 6062078 6067574 6078494 6079888 6089740 6105022 6114450 6131864 6142498 6146302 6156323 6176817 6182268 6206086 6210516 6244497 6255191 6258307 6261734 6284875 6296737 6307643 6319744 6328631 6337166 6342906 6354801 6360261 6374767 6379240 6390077 6393189 6412405 6415262 6422552 6431812 6442133 6466705 6475156 6481121 6498798 6500194 6508638 6512554 6531535 6550506 6567752 6574152 6581086 6589108 6592410 6596219 6600599 6608199 6639716 6661106 6668217 6672295 6693573 6696880 6703886 6716851 6720660 6721674 6724387 6736294 6740654 6756307 6778923 6800361 6803629 6820901 6823729 6829282 6851750 6857777 6860402 6881219 6904232 6912491 6915271 6930620 6949650 6955164 6958952 6995228 7005925 7010188 7018777 7043357 7067326 7068403 7071078 7104732 7106963 7119275 7144555 7147150 7188893 7191707 7192825 7196954 7212961 7223887 7232759 7242714 7248773 7265070 7272546 7289544 7291315 7307330 7312980 7315691 7318210 7327946 7339024 7354542 7360570 7371573 7376185 7377717 7384995 7386410 7392234 7394371 7411635 7425273 7429792 7436465 7456486 7484764 7488996 7503458 7515330 7522184 7531563 7538670 7539915 7544298 7556097 7558695 7562489 7567472 7568636 7570921 7580971 7586409 7601850 7611114 7620829 7629192 7636331 7640173 7652631 7689813 7706083 7708114 7717883 7725332 7731025 7741039 7742086 7744870 7753225 7756079 7762002 7776062 7781176 7782727 7798804 7825713 7832065 7842541 7851754 7854294 7865220 7878744 7880688 7883613 7884785 7886288 7893828 7903137 7906810 7925767 7936745 7944736 7951395 7963578 7968883 7972712 7974562 7977093 7987499 7994834 7999438 8015523 8025354 8028370 8031995 8087724 8128172 8133741 8142570 8149244 8156791 8169765 8173648 8178850 8184451 8195910 8200627 8214853 8220986 8252207 8260040 8263635 8274810 8293248 8312211 8313852 8316892 8338726 8353355 8356710 8361407 8368825 8403217 8408197 8424367 8430216 8436287 8446882 8468965 8472699 8485896 8503903 8512475 8527017 8528856 8531663 8544385 8554959 8559315 8591077 8603246 8612454 8616155 8623815 8631884 8634655 8639363 8668615 8681582 8686082 8700332 8704511 8726623 8732109 8733848 8747909 8762684 8784996 8786771 8806157 8810817 8825454 8844473 8889183 8891722 8930253 8935837 8936983 8943671 8945001 8968312 8979599 8988954 9002444 9014285 9021129 9028218 9055048 9076860 9086803 9119723 9129475 9159946 9193128 9210233 9211469 9241572 9252095 9269419 9287248 9288610 9298985 9303572 9308979 9310140 9316388 9323882 9327325 9342693 9344955 9348501 9359532 9362018 9393721 9423058 9425310 9437405 9458823 9470174 9477637 9507239 9514394 9516043 9525730 9551421 9553391 9555557 9564113 9568711 9571982 9579534 9580957 9582651 9609951 9636438 9639966 9649412 9670187 9679372 9682147 9694821 9703974 9706605 9708579 9710720 9719634 9723729 9734322 9749390 9754343 9764465 9765825 9769319 9794487 9796305 9802043 9805896 9820251 9824661 9826200 9832255 9839648 9849841 9851751 9871751 9874693 9877626 9879503 9890488 9897026 9905033 9925113 9946997 9950090 9955231 9961489 9963037 9968789 9984513 9996726 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-out.xml index aee07e5d1..28ce08038 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-medium-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 - - - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 - - - 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml new file mode 100644 index 000000000..13cb42ada --- /dev/null +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml @@ -0,0 +1,196 @@ + + + 5 10 10 10 10 10 5 10 10 10 0 + + + 4 5 3 3 3 3 3 4 5 3 0 + + + 1 0 0 0 0 0 0 0 0 0 0 + + + 21 2 3 1 2 2 1 1 5 2 0 + + + 37 73 47 34 42 388 130 435 401 324 490 541 900 960 671 1110 1106 1155 1143 1009 + + + 265 512 + + + 490 1061 1337 + + + 213 + + + 434 + + + 450 750 + + + 1014 + + + 892 + + + 207 370 982 1175 1385 + + + 534 1355 + + + 38 0 48 35 43 389 208 436 402 325 491 542 901 961 672 1111 1107 1175 1144 1010 + + + 266 513 + + + 491 1062 1338 + + + 214 + + + 435 + + + 451 751 + + + 1015 + + + 893 + + + 208 371 983 1176 1386 + + + 535 1356 + + + 207 0 213 265 370 434 450 490 512 534 750 892 982 1014 1061 1175 1337 1355 1385 1648 + + + 496 623 + + + 545 1451 1568 + + + 379 + + + 480 + + + 693 1010 + + + 1068 + + + 1243 + + + 377 698 1064 1240 1627 + + + 744 1536 + + + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 + + + 0 0 0 + + + 0 + + + 0 + + + 0 0 + + + 0 + + + 0 + + + 0 0 0 0 0 + + + 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.4 0.4 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 4 5 5 5 7 7 7 7 6 6 3 + diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-long-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-long-out.xml index 2f47c1c1a..199d0d356 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-long-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-long-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 - - - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 - - - 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 2009016 2010444 2012302 2028383 2041077 2068744 2091604 2103452 2113163 2116734 2145232 2172268 2179957 2187608 2193846 2208269 2221371 2229857 2271078 2301281 2314175 2337784 2344798 2346234 2350212 2352903 2367966 2370426 2396718 2412987 2421462 2440374 2451744 2452570 2462667 2464122 2474143 2489412 2491355 2496337 2502661 2504420 2509156 2515974 2518315 2531661 2566123 2570146 2574676 2578833 2586261 2596544 2599831 2608829 2613424 2623632 2673856 2702137 2708959 2714132 2734312 2757749 2762260 2769940 2770969 2772189 2778403 2782430 2803417 2813425 2837196 2842017 2848362 2854072 2860565 2864131 2869113 2874260 2889192 2899930 2901745 2904723 2917415 2924608 2937800 2942760 2948077 2951064 2965433 2969022 2974904 2980717 2995070 3011758 3023923 3027877 3029140 3031645 3032768 3035325 3042118 3043521 3052540 3058356 3065164 3090857 3096174 3100728 3107862 3135983 3138285 3154894 3163473 3167149 3177045 3194921 3207713 3218819 3221785 3227207 3231279 3238466 3247564 3248797 3255244 3267976 3321296 3330121 3341390 3342267 3346730 3352120 3354099 3358980 3360731 3383366 3388639 3396328 3404870 3411233 3417478 3422295 3425188 3439978 3453502 3462788 3465027 3476054 3479497 3485077 3491935 3495718 3516317 3520207 3540178 3543657 3554565 3557178 3576591 3587656 3590186 3593329 3598049 3601099 3616624 3656336 3659088 3677044 3695480 3715289 3721645 3765614 3775087 3788521 3793754 3795276 3803614 3805412 3816164 3854861 3856039 3876161 3903814 3907180 3918540 3925634 3927247 3936905 3938777 3942054 3946994 3955471 3968155 3972288 3974802 3987494 3994417 3996342 4004609 4008645 4025531 4030626 4035090 4043749 4059530 4063048 4069637 4075211 4078154 4082610 4099636 4100861 4132380 4147935 4161171 4195318 4207620 4208934 4212661 4237882 4240588 4244494 4273297 4275327 4284175 4294288 4304858 4331384 4342298 4352197 4357866 4373535 4375074 4384005 4390495 4393094 4404469 4414688 4433360 4436651 4445068 4460473 4502941 4515894 4533797 4558247 4559777 4561476 4562871 4579138 4607190 4614471 4620006 4623378 4637450 4655438 4667074 4675867 4685395 4694180 4704565 4707917 4715415 4730074 4737154 4748053 4752894 4761823 4769043 4770327 4773038 4788915 4798758 4813038 4821450 4838265 4859543 4877916 4897445 4901948 4913027 4915214 4920323 4922643 4947864 4949074 4951519 4970888 4978296 4989441 4996194 5002155 5008671 5013998 5024357 5044523 5057157 5063983 5066060 5067675 5085109 5102139 5110689 5130494 5134839 5136863 5180509 5185245 5191344 5211060 5216720 5262167 5270147 5277678 5280422 5282683 5288246 5290089 5305074 5312392 5321709 5326697 5336816 5338241 5344444 5350565 5357183 5360837 5365413 5366855 5374942 5387183 5397985 5406770 5410596 5428673 5433808 5444544 5449794 5452821 5456362 5464777 5473302 5480302 5486438 5489237 5494212 5514024 5533484 5546245 5548786 5551954 5563639 5597219 5606276 5635427 5644474 5663248 5669858 5688754 5698462 5703064 5730167 5733892 5737474 5750786 5760665 5771807 5788907 5791404 5795056 5818972 5831586 5835051 5841696 5843926 5856096 5871819 5874812 5895865 5902814 5904433 5915333 5927956 5929886 5936113 5955128 5956695 5962058 5965015 5966647 5967766 5982602 6000868 6005599 6012700 6023614 6029328 6034017 6062078 6067574 6078494 6079888 6089740 6105022 6114450 6131864 6142498 6146302 6156323 6176817 6182268 6206086 6210516 6244497 6255191 6258307 6261734 6284875 6296737 6307643 6319744 6328631 6337166 6342906 6354801 6360261 6374767 6379240 6390077 6393189 6412405 6415262 6422552 6431812 6442133 6466705 6475156 6481121 6498798 6500194 6508638 6512554 6531535 6550506 6567752 6574152 6581086 6589108 6592410 6596219 6600599 6608199 6639716 6661106 6668217 6672295 6693573 6696880 6703886 6716851 6720660 6721674 6724387 6736294 6740654 6756307 6778923 6800361 6803629 6820901 6823729 6829282 6851750 6857777 6860402 6881219 6904232 6912491 6915271 6930620 6949650 6955164 6958952 6995228 7005925 7010188 7018777 7043357 7067326 7068403 7071078 7104732 7106963 7119275 7144555 7147150 7188893 7191707 7192825 7196954 7212961 7223887 7232759 7242714 7248773 7265070 7272546 7289544 7291315 7307330 7312980 7315691 7318210 7327946 7339024 7354542 7360570 7371573 7376185 7377717 7384995 7386410 7392234 7394371 7411635 7425273 7429792 7436465 7456486 7484764 7488996 7503458 7515330 7522184 7531563 7538670 7539915 7544298 7556097 7558695 7562489 7567472 7568636 7570921 7580971 7586409 7601850 7611114 7620829 7629192 7636331 7640173 7652631 7689813 7706083 7708114 7717883 7725332 7731025 7741039 7742086 7744870 7753225 7756079 7762002 7776062 7781176 7782727 7798804 7825713 7832065 7842541 7851754 7854294 7865220 7878744 7880688 7883613 7884785 7886288 7893828 7903137 7906810 7925767 7936745 7944736 7951395 7963578 7968883 7972712 7974562 7977093 7987499 7994834 7999438 8015523 8025354 8028370 8031995 8087724 8128172 8133741 8142570 8149244 8156791 8169765 8173648 8178850 8184451 8195910 8200627 8214853 8220986 8252207 8260040 8263635 8274810 8293248 8312211 8313852 8316892 8338726 8353355 8356710 8361407 8368825 8403217 8408197 8424367 8430216 8436287 8446882 8468965 8472699 8485896 8503903 8512475 8527017 8528856 8531663 8544385 8554959 8559315 8591077 8603246 8612454 8616155 8623815 8631884 8634655 8639363 8668615 8681582 8686082 8700332 8704511 8726623 8732109 8733848 8747909 8762684 8784996 8786771 8806157 8810817 8825454 8844473 8889183 8891722 8930253 8935837 8936983 8943671 8945001 8968312 8979599 8988954 9002444 9014285 9021129 9028218 9055048 9076860 9086803 9119723 9129475 9159946 9193128 9210233 9211469 9241572 9252095 9269419 9287248 9288610 9298985 9303572 9308979 9310140 9316388 9323882 9327325 9342693 9344955 9348501 9359532 9362018 9393721 9423058 9425310 9437405 9458823 9470174 9477637 9507239 9514394 9516043 9525730 9551421 9553391 9555557 9564113 9568711 9571982 9579534 9580957 9582651 9609951 9636438 9639966 9649412 9670187 9679372 9682147 9694821 9703974 9706605 9708579 9710720 9719634 9723729 9734322 9749390 9754343 9764465 9765825 9769319 9794487 9796305 9802043 9805896 9820251 9824661 9826200 9832255 9839648 9849841 9851751 9871751 9874693 9877626 9879503 9890488 9897026 9905033 9925113 9946997 9950090 9955231 9961489 9963037 9968789 9984513 9996726 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-out.xml index 25ee7dae9..cc0fb2f8f 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-connected-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 - - - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 - - - 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-long-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-long-out.xml index 2f47c1c1a..199d0d356 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-long-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-long-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 - - - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 - - - 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 2009016 2010444 2012302 2028383 2041077 2068744 2091604 2103452 2113163 2116734 2145232 2172268 2179957 2187608 2193846 2208269 2221371 2229857 2271078 2301281 2314175 2337784 2344798 2346234 2350212 2352903 2367966 2370426 2396718 2412987 2421462 2440374 2451744 2452570 2462667 2464122 2474143 2489412 2491355 2496337 2502661 2504420 2509156 2515974 2518315 2531661 2566123 2570146 2574676 2578833 2586261 2596544 2599831 2608829 2613424 2623632 2673856 2702137 2708959 2714132 2734312 2757749 2762260 2769940 2770969 2772189 2778403 2782430 2803417 2813425 2837196 2842017 2848362 2854072 2860565 2864131 2869113 2874260 2889192 2899930 2901745 2904723 2917415 2924608 2937800 2942760 2948077 2951064 2965433 2969022 2974904 2980717 2995070 3011758 3023923 3027877 3029140 3031645 3032768 3035325 3042118 3043521 3052540 3058356 3065164 3090857 3096174 3100728 3107862 3135983 3138285 3154894 3163473 3167149 3177045 3194921 3207713 3218819 3221785 3227207 3231279 3238466 3247564 3248797 3255244 3267976 3321296 3330121 3341390 3342267 3346730 3352120 3354099 3358980 3360731 3383366 3388639 3396328 3404870 3411233 3417478 3422295 3425188 3439978 3453502 3462788 3465027 3476054 3479497 3485077 3491935 3495718 3516317 3520207 3540178 3543657 3554565 3557178 3576591 3587656 3590186 3593329 3598049 3601099 3616624 3656336 3659088 3677044 3695480 3715289 3721645 3765614 3775087 3788521 3793754 3795276 3803614 3805412 3816164 3854861 3856039 3876161 3903814 3907180 3918540 3925634 3927247 3936905 3938777 3942054 3946994 3955471 3968155 3972288 3974802 3987494 3994417 3996342 4004609 4008645 4025531 4030626 4035090 4043749 4059530 4063048 4069637 4075211 4078154 4082610 4099636 4100861 4132380 4147935 4161171 4195318 4207620 4208934 4212661 4237882 4240588 4244494 4273297 4275327 4284175 4294288 4304858 4331384 4342298 4352197 4357866 4373535 4375074 4384005 4390495 4393094 4404469 4414688 4433360 4436651 4445068 4460473 4502941 4515894 4533797 4558247 4559777 4561476 4562871 4579138 4607190 4614471 4620006 4623378 4637450 4655438 4667074 4675867 4685395 4694180 4704565 4707917 4715415 4730074 4737154 4748053 4752894 4761823 4769043 4770327 4773038 4788915 4798758 4813038 4821450 4838265 4859543 4877916 4897445 4901948 4913027 4915214 4920323 4922643 4947864 4949074 4951519 4970888 4978296 4989441 4996194 5002155 5008671 5013998 5024357 5044523 5057157 5063983 5066060 5067675 5085109 5102139 5110689 5130494 5134839 5136863 5180509 5185245 5191344 5211060 5216720 5262167 5270147 5277678 5280422 5282683 5288246 5290089 5305074 5312392 5321709 5326697 5336816 5338241 5344444 5350565 5357183 5360837 5365413 5366855 5374942 5387183 5397985 5406770 5410596 5428673 5433808 5444544 5449794 5452821 5456362 5464777 5473302 5480302 5486438 5489237 5494212 5514024 5533484 5546245 5548786 5551954 5563639 5597219 5606276 5635427 5644474 5663248 5669858 5688754 5698462 5703064 5730167 5733892 5737474 5750786 5760665 5771807 5788907 5791404 5795056 5818972 5831586 5835051 5841696 5843926 5856096 5871819 5874812 5895865 5902814 5904433 5915333 5927956 5929886 5936113 5955128 5956695 5962058 5965015 5966647 5967766 5982602 6000868 6005599 6012700 6023614 6029328 6034017 6062078 6067574 6078494 6079888 6089740 6105022 6114450 6131864 6142498 6146302 6156323 6176817 6182268 6206086 6210516 6244497 6255191 6258307 6261734 6284875 6296737 6307643 6319744 6328631 6337166 6342906 6354801 6360261 6374767 6379240 6390077 6393189 6412405 6415262 6422552 6431812 6442133 6466705 6475156 6481121 6498798 6500194 6508638 6512554 6531535 6550506 6567752 6574152 6581086 6589108 6592410 6596219 6600599 6608199 6639716 6661106 6668217 6672295 6693573 6696880 6703886 6716851 6720660 6721674 6724387 6736294 6740654 6756307 6778923 6800361 6803629 6820901 6823729 6829282 6851750 6857777 6860402 6881219 6904232 6912491 6915271 6930620 6949650 6955164 6958952 6995228 7005925 7010188 7018777 7043357 7067326 7068403 7071078 7104732 7106963 7119275 7144555 7147150 7188893 7191707 7192825 7196954 7212961 7223887 7232759 7242714 7248773 7265070 7272546 7289544 7291315 7307330 7312980 7315691 7318210 7327946 7339024 7354542 7360570 7371573 7376185 7377717 7384995 7386410 7392234 7394371 7411635 7425273 7429792 7436465 7456486 7484764 7488996 7503458 7515330 7522184 7531563 7538670 7539915 7544298 7556097 7558695 7562489 7567472 7568636 7570921 7580971 7586409 7601850 7611114 7620829 7629192 7636331 7640173 7652631 7689813 7706083 7708114 7717883 7725332 7731025 7741039 7742086 7744870 7753225 7756079 7762002 7776062 7781176 7782727 7798804 7825713 7832065 7842541 7851754 7854294 7865220 7878744 7880688 7883613 7884785 7886288 7893828 7903137 7906810 7925767 7936745 7944736 7951395 7963578 7968883 7972712 7974562 7977093 7987499 7994834 7999438 8015523 8025354 8028370 8031995 8087724 8128172 8133741 8142570 8149244 8156791 8169765 8173648 8178850 8184451 8195910 8200627 8214853 8220986 8252207 8260040 8263635 8274810 8293248 8312211 8313852 8316892 8338726 8353355 8356710 8361407 8368825 8403217 8408197 8424367 8430216 8436287 8446882 8468965 8472699 8485896 8503903 8512475 8527017 8528856 8531663 8544385 8554959 8559315 8591077 8603246 8612454 8616155 8623815 8631884 8634655 8639363 8668615 8681582 8686082 8700332 8704511 8726623 8732109 8733848 8747909 8762684 8784996 8786771 8806157 8810817 8825454 8844473 8889183 8891722 8930253 8935837 8936983 8943671 8945001 8968312 8979599 8988954 9002444 9014285 9021129 9028218 9055048 9076860 9086803 9119723 9129475 9159946 9193128 9210233 9211469 9241572 9252095 9269419 9287248 9288610 9298985 9303572 9308979 9310140 9316388 9323882 9327325 9342693 9344955 9348501 9359532 9362018 9393721 9423058 9425310 9437405 9458823 9470174 9477637 9507239 9514394 9516043 9525730 9551421 9553391 9555557 9564113 9568711 9571982 9579534 9580957 9582651 9609951 9636438 9639966 9649412 9670187 9679372 9682147 9694821 9703974 9706605 9708579 9710720 9719634 9723729 9734322 9749390 9754343 9764465 9765825 9769319 9794487 9796305 9802043 9805896 9820251 9824661 9826200 9832255 9839648 9849841 9851751 9871751 9874693 9877626 9879503 9890488 9897026 9905033 9925113 9946997 9950090 9955231 9961489 9963037 9968789 9984513 9996726 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-out.xml index 25ee7dae9..cc0fb2f8f 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-out.xml @@ -1,13 +1,4 @@ - - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 - - - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 - - - 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 2 2 2 2 2 - 14159 18777 20123 32635 48558 75686 100355 103147 113993 115604 117387 140475 145167 146519 161874 163728 178066 215683 223960 228689 233148 234007 246256 254231 276690 279706 298851 300429 303737 320939 331642 336491 357281 370713 377927 391242 421923 440282 446090 465374 468351 480018 484666 491976 495304 500369 504264 515725 529534 535079 537242 540737 545285 549954 563610 569173 643960 647616 650747 654707 661804 663922 673668 675594 683052 698813 713137 721596 735680 752943 762452 767879 784454 795664 799364 808928 817251 832734 836768 843622 849553 888412 891914 897996 901544 910220 953689 955496 978732 982913 1000433 1003423 1012970 1035585 1073828 1079966 1081717 1090063 1099722 1110743 1127918 1135762 1139875 1144516 1157471 1158953 1161841 1181320 1199343 1218946 1220251 1224318 1226825 1252510 1254248 1265458 1276792 1300154 1308851 1311251 1313858 1318765 1325783 1329351 1332664 1342456 1346018 1354032 1370036 1372945 1377888 1395245 1414766 1441820 1450147 1453016 1457226 1466598 1470887 1506384 1510537 1514289 1517626 1529152 1530483 1542002 1545872 1583040 1591649 1614730 1638290 1640902 1644772 1647007 1649249 1686783 1691867 1702600 1709983 1714118 1733136 1741440 1750174 1761304 1793672 1803162 1810576 1834071 1844491 1850175 1862603 1867909 1870733 1872950 1876394 1878206 1884721 1895763 1900020 1912440 1929327 1949780 1952125 1959364 1979927 1982232 1992534 diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml index 1e85011cf..2bee30482 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml @@ -1,10 +1,13 @@ + + 5738 8228 + + + 2 1 2 2 + 0 1 0 1 0 0 1 1 - - 2 1 2 2 - diff --git a/Testing/RegressionTesting/configfiles/test-medium-911.xml b/Testing/RegressionTesting/configfiles/test-medium-911.xml new file mode 100644 index 000000000..3abb8e2a0 --- /dev/null +++ b/Testing/RegressionTesting/configfiles/test-medium-911.xml @@ -0,0 +1,51 @@ + + + + + + 200 + 1440 + + 1 + + + 100 + + 190 + + + 1 + 1 + + + + + + 0.85 + + 30.0 + + + + + + + ../configfiles/graphs/test-medium-911.graphml + 0 + 0 + + + + ../configfiles/inputs/test-medium-911-calls.xml + + + + + + + + ../Testing/RegressionTesting/TestOutput/test-medium-911-out.xml + + + + diff --git a/Testing/RunTests.sh b/Testing/RunTests.sh index 20057a9a2..00b7c655b 100644 --- a/Testing/RunTests.sh +++ b/Testing/RunTests.sh @@ -79,7 +79,8 @@ else "test-medium" "test-medium-connected" "test-medium-long" - "test-medium-connected-long") + "test-medium-connected-long" + "test-small-911") fi # This function starts the simulations in parallel diff --git a/Testing/UnitTesting/InputManagerTests.cpp b/Testing/UnitTesting/InputManagerTests.cpp index 38a5167a0..5230fdc56 100644 --- a/Testing/UnitTesting/InputManagerTests.cpp +++ b/Testing/UnitTesting/InputManagerTests.cpp @@ -43,8 +43,8 @@ TEST_F(InputManagerFixture, queueFront) EXPECT_EQ(event.time, 0); EXPECT_EQ(event.duration, 0); EXPECT_EQ(event.type, "EMS"); - EXPECT_DOUBLE_EQ(event.x, -122.38496236371942); - EXPECT_DOUBLE_EQ(event.y, 47.570236838209546); + EXPECT_FLOAT_EQ(event.x, -122.38496236371942); + EXPECT_FLOAT_EQ(event.y, 47.570236838209546); } TEST_F(InputManagerFixture, queueFrontException) @@ -77,8 +77,8 @@ TEST_F(InputManagerFixture, getEpochEvents) EXPECT_EQ(call1->time, 0); EXPECT_EQ(call1->duration, 0); EXPECT_EQ(call1->type, "EMS"); - EXPECT_DOUBLE_EQ(call1->x, -122.38496236371942); - EXPECT_DOUBLE_EQ(call1->y, 47.570236838209546); + EXPECT_FLOAT_EQ(call1->x, -122.38496236371942); + EXPECT_FLOAT_EQ(call1->y, 47.570236838209546); // Check that we ge the correct information for the second // expected event @@ -88,8 +88,8 @@ TEST_F(InputManagerFixture, getEpochEvents) EXPECT_EQ(call2->time, 34); EXPECT_EQ(call2->duration, 230); EXPECT_EQ(call2->type, "EMS"); - EXPECT_DOUBLE_EQ(call2->x, -122.37482094435583); - EXPECT_DOUBLE_EQ(call2->y, 47.64839548276973); + EXPECT_FLOAT_EQ(call2->x, -122.37482094435583); + EXPECT_FLOAT_EQ(call2->y, 47.64839548276973); // Get event for vertex 195 CircularBuffer v195Queue(5); @@ -105,8 +105,8 @@ TEST_F(InputManagerFixture, getEpochEvents) EXPECT_EQ(call3->time, 388); EXPECT_EQ(call3->duration, 45); EXPECT_EQ(call3->type, "Law"); - EXPECT_DOUBLE_EQ(call3->x, -122.37746466732693); - EXPECT_DOUBLE_EQ(call3->y, 47.711139673719046); + EXPECT_FLOAT_EQ(call3->x, -122.37746466732693); + EXPECT_FLOAT_EQ(call3->y, 47.711139673719046); } TEST_F(InputManagerFixture, nonEmptyEventQueue) @@ -191,4 +191,9 @@ TEST(InputManager, readNeuroInputs) ASSERT_EQ(inputManager.getClockTickSize(), 100); ASSERT_EQ(inputManager.getClockTickUnit(), "usec"); +} + +TEST_F(InputManagerFixture, totalNumberOfEvents) +{ + ASSERT_EQ(inputManager.getTotalNumberOfEvents(), 8); } \ No newline at end of file diff --git a/Testing/UnitTesting/OperationManagerTestingClass.h b/Testing/UnitTesting/OperationManagerTestingClass.h index 3527cb988..cc453986d 100644 --- a/Testing/UnitTesting/OperationManagerTestingClass.h +++ b/Testing/UnitTesting/OperationManagerTestingClass.h @@ -37,6 +37,12 @@ class Foo : public IFoo { { cout << "Foo printing parameters" << endl; } + + void loadEpochInputs(uint64_t currentStep, uint64_t endStep) + { + cout << "Foo current step: " << currentStep << endl; + cout << "Foo end step: " << endStep << endl; + } }; diff --git a/Testing/UnitTesting/OperationManagerTests.cpp b/Testing/UnitTesting/OperationManagerTests.cpp index 0a54afb90..433e4a0ab 100644 --- a/Testing/UnitTesting/OperationManagerTests.cpp +++ b/Testing/UnitTesting/OperationManagerTests.cpp @@ -48,4 +48,21 @@ TEST(OperationManager, OperationExecutionSuccess) TEST(OperationManager, OperationExecutionContainsNoFunctionsOfOperationType) { EXPECT_NO_FATAL_FAILURE(OperationManager::getInstance().executeOperation(Operations::copyToGPU)); +} + +TEST(OperationManager, AddingNonEmptySignatureOperation) +{ + Foo foo; + function function + = std::bind(&Foo::loadEpochInputs, foo, std::placeholders::_1, std::placeholders::_2); + EXPECT_NO_FATAL_FAILURE( + OperationManager::getInstance().registerOperation(Operations::loadEpochInputs, function)); +} + +TEST(OperationManager, NonEmptySignatureOperationExecution) +{ + uint64_t currentStep = 10; + uint64_t endStep = 20; + EXPECT_NO_FATAL_FAILURE(OperationManager::getInstance().executeOperation( + Operations::loadEpochInputs, currentStep, endStep)); } \ No newline at end of file diff --git a/configfiles/graphs/test-medium-911.graphml b/configfiles/graphs/test-medium-911.graphml new file mode 100644 index 000000000..d86a3e791 --- /dev/null +++ b/configfiles/graphs/test-medium-911.graphml @@ -0,0 +1,21160 @@ + + + + + + + + + + + + + PSAP + PSAP_920@GraphGeneration.gov + PSAP_920 + 6 + 3 + 118.36261166039608 + 102.25562765898832 + + + PSAP + PSAP_1012@GraphGeneration.gov + PSAP_1012 + 5 + 3 + 190.74906276676657 + 112.81476824519619 + + + PSAP + PSAP_1564@GraphGeneration.gov + PSAP_1564 + 10 + 3 + 185.00640471230477 + 155.24513553065935 + + + PSAP + PSAP_1656@GraphGeneration.gov + PSAP_1656 + 5 + 3 + 14.066553219857319 + 186.08742555861383 + + + PSAP + PSAP_1748@GraphGeneration.gov + PSAP_1748 + 5 + 3 + 122.41127934141082 + 189.8837772694578 + + + PSAP + PSAP_1840@GraphGeneration.gov + PSAP_1840 + 10 + 3 + 161.73869925694777 + 174.44284578967088 + + + PSAP + PSAP_0@GraphGeneration.gov + PSAP_0 + 6 + 4 + 53.48105053685491 + 5.539701726084953 + + + PSAP + PSAP_276@GraphGeneration.gov + PSAP_276 + 6 + 4 + 40.59297197927873 + 32.545267191775146 + + + PSAP + PSAP_460@GraphGeneration.gov + PSAP_460 + 6 + 4 + 162.1606566813899 + 55.5315744963312 + + + PSAP + PSAP_736@GraphGeneration.gov + PSAP_736 + 8 + 4 + 138.59452189729515 + 72.25039517887713 + + + PSAP + PSAP_828@GraphGeneration.gov + PSAP_828 + 8 + 4 + 41.02530208940383 + 97.61170706435864 + + + PSAP + PSAP_1104@GraphGeneration.gov + PSAP_1104 + 9 + 4 + 11.325542760627709 + 132.93888819507154 + + + PSAP + PSAP_1288@GraphGeneration.gov + PSAP_1288 + 10 + 4 + 186.77533039581544 + 121.76822806013962 + + + PSAP + PSAP_92@GraphGeneration.gov + PSAP_92 + 5 + 5 + 124.98584500655676 + 4.5121877609966035 + + + PSAP + PSAP_184@GraphGeneration.gov + PSAP_184 + 10 + 5 + 176.53967467574878 + 13.18920629063176 + + + PSAP + PSAP_368@GraphGeneration.gov + PSAP_368 + 6 + 5 + 129.44018685387505 + 49.63991163021935 + + + PSAP + PSAP_552@GraphGeneration.gov + PSAP_552 + 10 + 5 + 36.2601046004757 + 73.78334131801273 + + + PSAP + PSAP_644@GraphGeneration.gov + PSAP_644 + 10 + 5 + 99.82881503873074 + 79.45386869802095 + + + PSAP + PSAP_1196@GraphGeneration.gov + PSAP_1196 + 9 + 5 + 114.6707888292886 + 130.42276792062492 + + + PSAP + PSAP_1380@GraphGeneration.gov + PSAP_1380 + 5 + 5 + 47.76112741886401 + 162.74619484366235 + + + PSAP + PSAP_1472@GraphGeneration.gov + PSAP_1472 + 5 + 5 + 128.26454380644486 + 146.97958922558072 + + + EMS + EMS_7@GraphGeneration.gov + EMS_7 + 8 + 3 + 45.684330707676956 + 12.395612110915156 + + + EMS + EMS_10@GraphGeneration.gov + EMS_10 + 7 + 3 + 22.956864898372256 + 17.844146242455704 + + + EMS + EMS_12@GraphGeneration.gov + EMS_12 + 7 + 3 + 14.762871896014056 + 8.971618698245686 + + + EMS + EMS_13@GraphGeneration.gov + EMS_13 + 10 + 3 + 40.53672689647039 + 8.528388714664947 + + + EMS + EMS_16@GraphGeneration.gov + EMS_16 + 10 + 3 + 43.56325077273006 + 3.520005126897135 + + + EMS + EMS_20@GraphGeneration.gov + EMS_20 + 9 + 3 + 57.2440107638832 + 27.06326381580841 + + + EMS + EMS_23@GraphGeneration.gov + EMS_23 + 12 + 3 + 18.431061224448783 + 5.961061486355322 + + + EMS + EMS_25@GraphGeneration.gov + EMS_25 + 7 + 3 + 24.631924929543263 + 20.49024459026305 + + + EMS + EMS_27@GraphGeneration.gov + EMS_27 + 6 + 3 + 58.479385048465275 + 0.37459831818182593 + + + EMS + EMS_96@GraphGeneration.gov + EMS_96 + 9 + 3 + 84.843260210541 + 3.714350273417958 + + + EMS + EMS_99@GraphGeneration.gov + EMS_99 + 10 + 3 + 78.22128428916174 + 23.582915422267874 + + + EMS + EMS_101@GraphGeneration.gov + EMS_101 + 12 + 3 + 78.96207734489474 + 16.996627263105076 + + + EMS + EMS_106@GraphGeneration.gov + EMS_106 + 9 + 3 + 103.72980606079773 + 5.747431600121522 + + + EMS + EMS_110@GraphGeneration.gov + EMS_110 + 8 + 3 + 106.84318234431748 + 14.225462553475865 + + + EMS + EMS_111@GraphGeneration.gov + EMS_111 + 6 + 3 + 115.55778364859083 + 10.31443499949693 + + + EMS + EMS_116@GraphGeneration.gov + EMS_116 + 9 + 3 + 133.09110555533607 + 21.317347661580943 + + + EMS + EMS_118@GraphGeneration.gov + EMS_118 + 9 + 3 + 69.06428772266115 + 24.088380503028795 + + + EMS + EMS_119@GraphGeneration.gov + EMS_119 + 11 + 3 + 130.9313426684405 + 26.27231751837203 + + + EMS + EMS_120@GraphGeneration.gov + EMS_120 + 10 + 3 + 82.19961786073488 + 6.292159410746571 + + + EMS + EMS_193@GraphGeneration.gov + EMS_193 + 8 + 3 + 181.21142154190116 + 25.07144615724517 + + + EMS + EMS_194@GraphGeneration.gov + EMS_194 + 10 + 3 + 172.35133559307474 + 2.6492973442644074 + + + EMS + EMS_202@GraphGeneration.gov + EMS_202 + 7 + 3 + 149.85599238374493 + 19.933953930685643 + + + EMS + EMS_205@GraphGeneration.gov + EMS_205 + 12 + 3 + 172.80163262272157 + 23.8359499551767 + + + EMS + EMS_206@GraphGeneration.gov + EMS_206 + 8 + 3 + 196.29141211575723 + 11.67330821155046 + + + EMS + EMS_208@GraphGeneration.gov + EMS_208 + 7 + 3 + 144.95954826063928 + 23.629440594493186 + + + EMS + EMS_296@GraphGeneration.gov + EMS_296 + 6 + 3 + 44.93946797263768 + 38.97082052063458 + + + EMS + EMS_298@GraphGeneration.gov + EMS_298 + 12 + 3 + 29.260961958421024 + 55.14961017059406 + + + EMS + EMS_306@GraphGeneration.gov + EMS_306 + 9 + 3 + 18.802184290892406 + 30.70908033192486 + + + EMS + EMS_371@GraphGeneration.gov + EMS_371 + 9 + 3 + 131.91811306414684 + 29.311477866278313 + + + EMS + EMS_375@GraphGeneration.gov + EMS_375 + 8 + 3 + 118.17763107239139 + 38.791754906443096 + + + EMS + EMS_377@GraphGeneration.gov + EMS_377 + 9 + 3 + 82.51275869446529 + 54.222177871784524 + + + EMS + EMS_378@GraphGeneration.gov + EMS_378 + 11 + 3 + 123.56577434848471 + 46.837343318916886 + + + EMS + EMS_379@GraphGeneration.gov + EMS_379 + 12 + 3 + 87.58858199490182 + 39.804221212257396 + + + EMS + EMS_380@GraphGeneration.gov + EMS_380 + 10 + 3 + 96.7171646533693 + 42.67903583256721 + + + EMS + EMS_386@GraphGeneration.gov + EMS_386 + 9 + 3 + 68.88041878889078 + 38.3536904121872 + + + EMS + EMS_387@GraphGeneration.gov + EMS_387 + 8 + 3 + 102.41610981634291 + 55.32688401602216 + + + EMS + EMS_398@GraphGeneration.gov + EMS_398 + 11 + 3 + 80.70503171039871 + 34.035202553340326 + + + EMS + EMS_462@GraphGeneration.gov + EMS_462 + 6 + 3 + 151.1731988926529 + 35.87907210647247 + + + EMS + EMS_468@GraphGeneration.gov + EMS_468 + 7 + 3 + 196.8992901900848 + 53.79307897413114 + + + EMS + EMS_475@GraphGeneration.gov + EMS_475 + 7 + 3 + 192.8781259593108 + 54.93182432608302 + + + EMS + EMS_477@GraphGeneration.gov + EMS_477 + 7 + 3 + 147.71900760387 + 30.838747420927255 + + + EMS + EMS_478@GraphGeneration.gov + EMS_478 + 10 + 3 + 167.07442427821394 + 56.70551856511803 + + + EMS + EMS_479@GraphGeneration.gov + EMS_479 + 9 + 3 + 140.55071096625963 + 47.52799320489429 + + + EMS + EMS_483@GraphGeneration.gov + EMS_483 + 9 + 3 + 135.26742431171144 + 39.261133069364696 + + + EMS + EMS_484@GraphGeneration.gov + EMS_484 + 10 + 3 + 160.5081597513588 + 40.261322045818346 + + + EMS + EMS_489@GraphGeneration.gov + EMS_489 + 11 + 3 + 165.85191416437468 + 44.00950520814835 + + + EMS + EMS_555@GraphGeneration.gov + EMS_555 + 7 + 3 + 23.558449212854203 + 76.96043131185675 + + + EMS + EMS_556@GraphGeneration.gov + EMS_556 + 12 + 3 + 13.533412548734127 + 75.03913341373018 + + + EMS + EMS_559@GraphGeneration.gov + EMS_559 + 6 + 3 + 52.21742820613614 + 66.8319260285027 + + + EMS + EMS_564@GraphGeneration.gov + EMS_564 + 6 + 3 + 3.5427276895848796 + 74.06168785876761 + + + EMS + EMS_566@GraphGeneration.gov + EMS_566 + 8 + 3 + 35.832983989918134 + 62.39289636785928 + + + EMS + EMS_568@GraphGeneration.gov + EMS_568 + 7 + 3 + 41.75905588346348 + 81.14518165658589 + + + EMS + EMS_572@GraphGeneration.gov + EMS_572 + 8 + 3 + 53.17614009485008 + 64.72812656026305 + + + EMS + EMS_576@GraphGeneration.gov + EMS_576 + 7 + 3 + 16.72626238759337 + 66.03330989236056 + + + EMS + EMS_577@GraphGeneration.gov + EMS_577 + 7 + 3 + 59.72756969209287 + 77.73258586211416 + + + EMS + EMS_578@GraphGeneration.gov + EMS_578 + 8 + 3 + 3.559194014138956 + 65.69492846239093 + + + EMS + EMS_646@GraphGeneration.gov + EMS_646 + 10 + 3 + 103.25716457712252 + 84.78672922617136 + + + EMS + EMS_649@GraphGeneration.gov + EMS_649 + 9 + 3 + 68.06431363631589 + 67.40682698940061 + + + EMS + EMS_650@GraphGeneration.gov + EMS_650 + 7 + 3 + 92.03650687041979 + 84.57784731831526 + + + EMS + EMS_654@GraphGeneration.gov + EMS_654 + 9 + 3 + 79.95934912246324 + 75.41407010452687 + + + EMS + EMS_655@GraphGeneration.gov + EMS_655 + 6 + 3 + 84.83577544438207 + 60.75708101918608 + + + EMS + EMS_747@GraphGeneration.gov + EMS_747 + 7 + 3 + 182.15989294153363 + 79.82479794900948 + + + EMS + EMS_756@GraphGeneration.gov + EMS_756 + 8 + 3 + 138.6900482303634 + 70.91028101099914 + + + EMS + EMS_765@GraphGeneration.gov + EMS_765 + 9 + 3 + 149.9843020387271 + 82.7865351805368 + + + EMS + EMS_830@GraphGeneration.gov + EMS_830 + 8 + 3 + 35.19556269453453 + 113.93603446562128 + + + EMS + EMS_834@GraphGeneration.gov + EMS_834 + 12 + 3 + 28.239230432558415 + 87.30772132710435 + + + EMS + EMS_838@GraphGeneration.gov + EMS_838 + 7 + 3 + 34.08890787004895 + 88.71297080939291 + + + EMS + EMS_840@GraphGeneration.gov + EMS_840 + 11 + 3 + 61.96115890156377 + 92.87149637662986 + + + EMS + EMS_842@GraphGeneration.gov + EMS_842 + 10 + 3 + 29.609409510777354 + 91.65794343550701 + + + EMS + EMS_844@GraphGeneration.gov + EMS_844 + 7 + 3 + 34.780808598859686 + 108.0363187562699 + + + EMS + EMS_853@GraphGeneration.gov + EMS_853 + 9 + 3 + 54.08185039317525 + 94.39705068859168 + + + EMS + EMS_926@GraphGeneration.gov + EMS_926 + 8 + 3 + 119.59235962503095 + 91.04116095488686 + + + EMS + EMS_940@GraphGeneration.gov + EMS_940 + 8 + 3 + 90.53617552200308 + 107.74798428969515 + + + EMS + EMS_941@GraphGeneration.gov + EMS_941 + 10 + 3 + 111.24429704599565 + 96.75956175243152 + + + EMS + EMS_944@GraphGeneration.gov + EMS_944 + 6 + 3 + 114.13388641297519 + 104.4254645199095 + + + EMS + EMS_1014@GraphGeneration.gov + EMS_1014 + 7 + 3 + 186.35365486205956 + 104.5211452848882 + + + EMS + EMS_1015@GraphGeneration.gov + EMS_1015 + 7 + 3 + 139.0683703041828 + 102.7670507336778 + + + EMS + EMS_1019@GraphGeneration.gov + EMS_1019 + 8 + 3 + 169.33481224423798 + 86.53438186872685 + + + EMS + EMS_1032@GraphGeneration.gov + EMS_1032 + 12 + 3 + 170.54616635856252 + 86.52522702804694 + + + EMS + EMS_1034@GraphGeneration.gov + EMS_1034 + 9 + 3 + 198.1637894718589 + 98.72441041923541 + + + EMS + EMS_1037@GraphGeneration.gov + EMS_1037 + 6 + 3 + 157.73302951980355 + 101.83655683973171 + + + EMS + EMS_1039@GraphGeneration.gov + EMS_1039 + 6 + 3 + 191.4007779359336 + 103.75019786174667 + + + EMS + EMS_1041@GraphGeneration.gov + EMS_1041 + 11 + 3 + 152.1275329164672 + 101.44147649976782 + + + EMS + EMS_1109@GraphGeneration.gov + EMS_1109 + 11 + 3 + 56.0666769464647 + 116.19992108946121 + + + EMS + EMS_1110@GraphGeneration.gov + EMS_1110 + 6 + 3 + 49.49404386118493 + 121.86630825778192 + + + EMS + EMS_1119@GraphGeneration.gov + EMS_1119 + 8 + 3 + 33.03643913101277 + 119.10341428549333 + + + EMS + EMS_1120@GraphGeneration.gov + EMS_1120 + 12 + 3 + 27.317911317031363 + 131.99623837291887 + + + EMS + EMS_1125@GraphGeneration.gov + EMS_1125 + 9 + 3 + 41.23544800073192 + 129.1114253992563 + + + EMS + EMS_1126@GraphGeneration.gov + EMS_1126 + 9 + 3 + 4.685243379641284 + 120.62559876805453 + + + EMS + EMS_1132@GraphGeneration.gov + EMS_1132 + 12 + 3 + 31.53642504053306 + 120.16283752923093 + + + EMS + EMS_1133@GraphGeneration.gov + EMS_1133 + 9 + 3 + 29.873750162490655 + 124.80135814088 + + + EMS + EMS_1197@GraphGeneration.gov + EMS_1197 + 6 + 3 + 119.69876160389165 + 131.63559081468088 + + + EMS + EMS_1200@GraphGeneration.gov + EMS_1200 + 12 + 3 + 73.71936413166263 + 120.62021462757595 + + + EMS + EMS_1202@GraphGeneration.gov + EMS_1202 + 9 + 3 + 106.56912227124695 + 120.04337869449665 + + + EMS + EMS_1204@GraphGeneration.gov + EMS_1204 + 10 + 3 + 114.2471178921621 + 129.02290693320705 + + + EMS + EMS_1207@GraphGeneration.gov + EMS_1207 + 6 + 3 + 114.45497449285153 + 132.2773212904305 + + + EMS + EMS_1213@GraphGeneration.gov + EMS_1213 + 12 + 3 + 90.9535423322244 + 115.38481419011217 + + + EMS + EMS_1215@GraphGeneration.gov + EMS_1215 + 9 + 3 + 131.29563710428536 + 138.9203424518477 + + + EMS + EMS_1217@GraphGeneration.gov + EMS_1217 + 7 + 3 + 129.3803718264499 + 133.42139418116474 + + + EMS + EMS_1218@GraphGeneration.gov + EMS_1218 + 7 + 3 + 100.74678521002404 + 120.10516056692931 + + + EMS + EMS_1219@GraphGeneration.gov + EMS_1219 + 11 + 3 + 79.02522854032824 + 115.47968160230239 + + + EMS + EMS_1221@GraphGeneration.gov + EMS_1221 + 7 + 3 + 91.22158320377272 + 141.8832830739202 + + + EMS + EMS_1222@GraphGeneration.gov + EMS_1222 + 6 + 3 + 125.81513724712335 + 115.50144185575287 + + + EMS + EMS_1224@GraphGeneration.gov + EMS_1224 + 10 + 3 + 123.28717927016312 + 120.82853433320514 + + + EMS + EMS_1294@GraphGeneration.gov + EMS_1294 + 8 + 3 + 146.72083583941742 + 123.62925968391946 + + + EMS + EMS_1295@GraphGeneration.gov + EMS_1295 + 9 + 3 + 147.2746875318341 + 141.72819134536056 + + + EMS + EMS_1298@GraphGeneration.gov + EMS_1298 + 9 + 3 + 179.7089278638544 + 138.24279769685225 + + + EMS + EMS_1299@GraphGeneration.gov + EMS_1299 + 6 + 3 + 159.13654409818196 + 122.43321840446885 + + + EMS + EMS_1302@GraphGeneration.gov + EMS_1302 + 7 + 3 + 174.51111655647514 + 118.06930039267512 + + + EMS + EMS_1303@GraphGeneration.gov + EMS_1303 + 11 + 3 + 170.9203899866778 + 123.13108304920668 + + + EMS + EMS_1305@GraphGeneration.gov + EMS_1305 + 10 + 3 + 185.34047303384656 + 117.64708180179775 + + + EMS + EMS_1309@GraphGeneration.gov + EMS_1309 + 11 + 3 + 146.27328998610437 + 125.76453008792058 + + + EMS + EMS_1315@GraphGeneration.gov + EMS_1315 + 11 + 3 + 187.36427123805882 + 141.9368395034346 + + + EMS + EMS_1381@GraphGeneration.gov + EMS_1381 + 8 + 3 + 5.3492953243621395 + 155.599181951314 + + + EMS + EMS_1383@GraphGeneration.gov + EMS_1383 + 12 + 3 + 12.385316957969916 + 156.20416613109444 + + + EMS + EMS_1388@GraphGeneration.gov + EMS_1388 + 9 + 3 + 1.1625912429850414 + 168.9039458126758 + + + EMS + EMS_1389@GraphGeneration.gov + EMS_1389 + 7 + 3 + 12.71995452535931 + 160.02677293932982 + + + EMS + EMS_1390@GraphGeneration.gov + EMS_1390 + 11 + 3 + 21.95379185578813 + 151.5795254157275 + + + EMS + EMS_1394@GraphGeneration.gov + EMS_1394 + 11 + 3 + 31.788911312447873 + 165.7497703727765 + + + EMS + EMS_1395@GraphGeneration.gov + EMS_1395 + 11 + 3 + 28.89474600495124 + 143.37944065511303 + + + EMS + EMS_1402@GraphGeneration.gov + EMS_1402 + 10 + 3 + 33.52760713801675 + 151.07974585728695 + + + EMS + EMS_1406@GraphGeneration.gov + EMS_1406 + 10 + 3 + 10.443227601979503 + 158.33777714519536 + + + EMS + EMS_1407@GraphGeneration.gov + EMS_1407 + 10 + 3 + 40.30439636111619 + 170.16761619418878 + + + EMS + EMS_1408@GraphGeneration.gov + EMS_1408 + 7 + 3 + 66.33361365470638 + 169.9807945710877 + + + EMS + EMS_1473@GraphGeneration.gov + EMS_1473 + 9 + 3 + 89.14257113579399 + 144.2199452194772 + + + EMS + EMS_1474@GraphGeneration.gov + EMS_1474 + 11 + 3 + 131.35478145549808 + 165.60461925390456 + + + EMS + EMS_1475@GraphGeneration.gov + EMS_1475 + 10 + 3 + 102.358642387392 + 163.34295671036392 + + + EMS + EMS_1485@GraphGeneration.gov + EMS_1485 + 11 + 3 + 117.7294726769618 + 158.65846857960793 + + + EMS + EMS_1488@GraphGeneration.gov + EMS_1488 + 9 + 3 + 122.13089287597884 + 170.36909900101355 + + + EMS + EMS_1490@GraphGeneration.gov + EMS_1490 + 7 + 3 + 112.43988713900453 + 147.96438699891723 + + + EMS + EMS_1491@GraphGeneration.gov + EMS_1491 + 12 + 3 + 101.95689427933513 + 147.43685464821115 + + + EMS + EMS_1492@GraphGeneration.gov + EMS_1492 + 8 + 3 + 96.40936586314378 + 159.58356893025694 + + + EMS + EMS_1493@GraphGeneration.gov + EMS_1493 + 10 + 3 + 99.53995132860042 + 170.06081638552257 + + + EMS + EMS_1502@GraphGeneration.gov + EMS_1502 + 10 + 3 + 81.39672087269939 + 167.04225994901282 + + + EMS + EMS_1567@GraphGeneration.gov + EMS_1567 + 10 + 3 + 166.82404701263096 + 169.87532005652628 + + + EMS + EMS_1584@GraphGeneration.gov + EMS_1584 + 7 + 3 + 199.25363211519942 + 169.75562848251107 + + + EMS + EMS_1585@GraphGeneration.gov + EMS_1585 + 9 + 3 + 171.03171190663355 + 155.35523352598568 + + + EMS + EMS_1659@GraphGeneration.gov + EMS_1659 + 12 + 3 + 27.936271559116705 + 184.63417468874792 + + + EMS + EMS_1661@GraphGeneration.gov + EMS_1661 + 6 + 3 + 41.90842215457704 + 173.1458002678863 + + + EMS + EMS_1665@GraphGeneration.gov + EMS_1665 + 7 + 3 + 34.627238347497645 + 176.33294006588406 + + + EMS + EMS_1672@GraphGeneration.gov + EMS_1672 + 6 + 3 + 58.846612251078774 + 196.32039684931544 + + + EMS + EMS_1682@GraphGeneration.gov + EMS_1682 + 8 + 3 + 8.169835457024737 + 183.270877150289 + + + EMS + EMS_1683@GraphGeneration.gov + EMS_1683 + 10 + 3 + 37.795099963227635 + 187.93813586906077 + + + EMS + EMS_1755@GraphGeneration.gov + EMS_1755 + 10 + 3 + 121.76524496883593 + 199.0747906273082 + + + EMS + EMS_1756@GraphGeneration.gov + EMS_1756 + 7 + 3 + 79.96262869325726 + 185.9738058525145 + + + EMS + EMS_1758@GraphGeneration.gov + EMS_1758 + 8 + 3 + 101.00731254134314 + 199.61069063684127 + + + EMS + EMS_1764@GraphGeneration.gov + EMS_1764 + 12 + 3 + 87.11387569301786 + 176.89599386942484 + + + EMS + EMS_1766@GraphGeneration.gov + EMS_1766 + 10 + 3 + 121.68728127305477 + 194.7106841397353 + + + EMS + EMS_1770@GraphGeneration.gov + EMS_1770 + 7 + 3 + 109.48504453298617 + 184.0813405475857 + + + EMS + EMS_1772@GraphGeneration.gov + EMS_1772 + 9 + 3 + 114.79362903513115 + 171.6000298301522 + + + EMS + EMS_1773@GraphGeneration.gov + EMS_1773 + 6 + 3 + 127.91861464171726 + 194.31665842322812 + + + EMS + EMS_1774@GraphGeneration.gov + EMS_1774 + 10 + 3 + 114.9521941115005 + 188.45805402899342 + + + EMS + EMS_1848@GraphGeneration.gov + EMS_1848 + 6 + 3 + 145.11964079631423 + 198.03865984403163 + + + EMS + EMS_1857@GraphGeneration.gov + EMS_1857 + 7 + 3 + 199.1699565885742 + 178.78775512950014 + + + EMS + EMS_1862@GraphGeneration.gov + EMS_1862 + 11 + 3 + 162.3460279348548 + 172.75920290988665 + + + EMS + EMS_1863@GraphGeneration.gov + EMS_1863 + 8 + 3 + 192.55805425088587 + 176.3576246714392 + + + EMS + EMS_1870@GraphGeneration.gov + EMS_1870 + 8 + 3 + 143.31532006518248 + 193.65493786257537 + + + FIRE + FIRE_32@GraphGeneration.gov + FIRE_32 + 11 + 3 + 47.57057959023745 + 26.254224269575012 + + + FIRE + FIRE_36@GraphGeneration.gov + FIRE_36 + 10 + 3 + 5.222501134114836 + 6.973078231367458 + + + FIRE + FIRE_43@GraphGeneration.gov + FIRE_43 + 9 + 3 + 11.825280193481658 + 22.848353117781063 + + + FIRE + FIRE_46@GraphGeneration.gov + FIRE_46 + 7 + 3 + 63.504211010876645 + 4.8364942883173745 + + + FIRE + FIRE_57@GraphGeneration.gov + FIRE_57 + 8 + 3 + 13.490857540927664 + 14.063708604128864 + + + FIRE + FIRE_60@GraphGeneration.gov + FIRE_60 + 10 + 3 + 26.813846683779968 + 0.4744987351392378 + + + FIRE + FIRE_130@GraphGeneration.gov + FIRE_130 + 9 + 3 + 108.39850414806489 + 22.159351596375203 + + + FIRE + FIRE_132@GraphGeneration.gov + FIRE_132 + 12 + 3 + 128.42310772269946 + 21.903205096975686 + + + FIRE + FIRE_138@GraphGeneration.gov + FIRE_138 + 8 + 3 + 84.08011027526481 + 16.774323743301796 + + + FIRE + FIRE_216@GraphGeneration.gov + FIRE_216 + 11 + 3 + 170.27994294677848 + 0.46477230279969073 + + + FIRE + FIRE_218@GraphGeneration.gov + FIRE_218 + 11 + 3 + 142.81423102253356 + 21.913644847034245 + + + FIRE + FIRE_223@GraphGeneration.gov + FIRE_223 + 8 + 3 + 137.90057614426513 + 3.7399500282800737 + + + FIRE + FIRE_224@GraphGeneration.gov + FIRE_224 + 8 + 3 + 151.1421609232001 + 1.2938513679105494 + + + FIRE + FIRE_233@GraphGeneration.gov + FIRE_233 + 10 + 3 + 185.5434825731878 + 15.78812407873794 + + + FIRE + FIRE_236@GraphGeneration.gov + FIRE_236 + 7 + 3 + 146.07443124880984 + 14.34756133984008 + + + FIRE + FIRE_237@GraphGeneration.gov + FIRE_237 + 11 + 3 + 185.40842457311103 + 8.280549688338827 + + + FIRE + FIRE_241@GraphGeneration.gov + FIRE_241 + 9 + 3 + 164.48891241731138 + 15.896884674475261 + + + FIRE + FIRE_244@GraphGeneration.gov + FIRE_244 + 8 + 3 + 133.58244141638426 + 5.596314442042532 + + + FIRE + FIRE_317@GraphGeneration.gov + FIRE_317 + 9 + 3 + 5.267052479841132 + 29.983430954950585 + + + FIRE + FIRE_321@GraphGeneration.gov + FIRE_321 + 9 + 3 + 33.14115908066283 + 55.87269589146467 + + + FIRE + FIRE_322@GraphGeneration.gov + FIRE_322 + 7 + 3 + 45.71641455623825 + 50.63164853091442 + + + FIRE + FIRE_327@GraphGeneration.gov + FIRE_327 + 7 + 3 + 58.88238218909368 + 38.522274552838496 + + + FIRE + FIRE_328@GraphGeneration.gov + FIRE_328 + 6 + 3 + 4.556081742620159 + 57.02098312629834 + + + FIRE + FIRE_330@GraphGeneration.gov + FIRE_330 + 8 + 3 + 4.002159118747358 + 54.99728354336088 + + + FIRE + FIRE_331@GraphGeneration.gov + FIRE_331 + 11 + 3 + 19.491793737593348 + 37.864053929964406 + + + FIRE + FIRE_333@GraphGeneration.gov + FIRE_333 + 12 + 3 + 12.255172074552727 + 42.71664037829499 + + + FIRE + FIRE_400@GraphGeneration.gov + FIRE_400 + 11 + 3 + 72.75059928891596 + 30.499159760631017 + + + FIRE + FIRE_403@GraphGeneration.gov + FIRE_403 + 6 + 3 + 131.05763731942557 + 34.72139702831529 + + + FIRE + FIRE_409@GraphGeneration.gov + FIRE_409 + 9 + 3 + 74.76069671634727 + 38.85359160036283 + + + FIRE + FIRE_413@GraphGeneration.gov + FIRE_413 + 10 + 3 + 119.42778753295076 + 29.513527716574735 + + + FIRE + FIRE_416@GraphGeneration.gov + FIRE_416 + 8 + 3 + 73.1015351002251 + 55.18255233358076 + + + FIRE + FIRE_421@GraphGeneration.gov + FIRE_421 + 10 + 3 + 106.69667967441627 + 46.07873004080717 + + + FIRE + FIRE_425@GraphGeneration.gov + FIRE_425 + 9 + 3 + 67.24859947227547 + 53.365983953145815 + + + FIRE + FIRE_491@GraphGeneration.gov + FIRE_491 + 12 + 3 + 151.62021241541802 + 56.81577253687372 + + + FIRE + FIRE_495@GraphGeneration.gov + FIRE_495 + 12 + 3 + 150.4133815601329 + 33.71571237063659 + + + FIRE + FIRE_498@GraphGeneration.gov + FIRE_498 + 10 + 3 + 139.8555166337545 + 54.026468987362335 + + + FIRE + FIRE_499@GraphGeneration.gov + FIRE_499 + 8 + 3 + 189.448595234537 + 54.51255740489236 + + + FIRE + FIRE_509@GraphGeneration.gov + FIRE_509 + 12 + 3 + 149.32285607832094 + 54.51447011954008 + + + FIRE + FIRE_510@GraphGeneration.gov + FIRE_510 + 11 + 3 + 192.84557886234208 + 56.77838200801122 + + + FIRE + FIRE_512@GraphGeneration.gov + FIRE_512 + 10 + 3 + 166.15269448292977 + 47.09115875991651 + + + FIRE + FIRE_514@GraphGeneration.gov + FIRE_514 + 9 + 3 + 199.90465199183882 + 40.956742597454706 + + + FIRE + FIRE_585@GraphGeneration.gov + FIRE_585 + 8 + 3 + 39.30999458932309 + 74.66019673863022 + + + FIRE + FIRE_592@GraphGeneration.gov + FIRE_592 + 9 + 3 + 56.90077753201705 + 85.35317464252012 + + + FIRE + FIRE_595@GraphGeneration.gov + FIRE_595 + 11 + 3 + 53.5128703178043 + 69.3846581667842 + + + FIRE + FIRE_597@GraphGeneration.gov + FIRE_597 + 7 + 3 + 38.89940294757533 + 79.16933146660017 + + + FIRE + FIRE_603@GraphGeneration.gov + FIRE_603 + 12 + 3 + 9.036329889032292 + 75.03942989208672 + + + FIRE + FIRE_607@GraphGeneration.gov + FIRE_607 + 7 + 3 + 66.62957541907274 + 67.83075252534688 + + + FIRE + FIRE_608@GraphGeneration.gov + FIRE_608 + 7 + 3 + 33.62886795119296 + 78.87723232400742 + + + FIRE + FIRE_611@GraphGeneration.gov + FIRE_611 + 11 + 3 + 25.18484488704566 + 73.1287009455179 + + + FIRE + FIRE_678@GraphGeneration.gov + FIRE_678 + 12 + 3 + 86.67431008666188 + 72.72126100377709 + + + FIRE + FIRE_679@GraphGeneration.gov + FIRE_679 + 10 + 3 + 101.24791366838636 + 78.28390079823276 + + + FIRE + FIRE_686@GraphGeneration.gov + FIRE_686 + 10 + 3 + 117.5675499399102 + 64.89245108576564 + + + FIRE + FIRE_693@GraphGeneration.gov + FIRE_693 + 12 + 3 + 96.97528585642874 + 67.9252794429342 + + + FIRE + FIRE_694@GraphGeneration.gov + FIRE_694 + 10 + 3 + 81.39655004583713 + 75.7807416809569 + + + FIRE + FIRE_696@GraphGeneration.gov + FIRE_696 + 8 + 3 + 116.14774716749321 + 77.81429004969988 + + + FIRE + FIRE_699@GraphGeneration.gov + FIRE_699 + 7 + 3 + 73.60263899092193 + 69.51428656508075 + + + FIRE + FIRE_703@GraphGeneration.gov + FIRE_703 + 12 + 3 + 99.14631802356413 + 80.11186200293974 + + + FIRE + FIRE_769@GraphGeneration.gov + FIRE_769 + 12 + 3 + 169.13260520621412 + 57.87429939477528 + + + FIRE + FIRE_776@GraphGeneration.gov + FIRE_776 + 6 + 3 + 179.4568572300122 + 62.44118155804556 + + + FIRE + FIRE_793@GraphGeneration.gov + FIRE_793 + 7 + 3 + 184.72326872647653 + 78.19125146175045 + + + FIRE + FIRE_862@GraphGeneration.gov + FIRE_862 + 10 + 3 + 4.1054803343184645 + 86.67873983534686 + + + FIRE + FIRE_864@GraphGeneration.gov + FIRE_864 + 12 + 3 + 14.34531221959603 + 111.98786382579775 + + + FIRE + FIRE_875@GraphGeneration.gov + FIRE_875 + 10 + 3 + 3.606920273034198 + 89.85127266652232 + + + FIRE + FIRE_880@GraphGeneration.gov + FIRE_880 + 10 + 3 + 48.87661117991167 + 104.96966471043504 + + + FIRE + FIRE_882@GraphGeneration.gov + FIRE_882 + 11 + 3 + 61.25583181811367 + 97.26638608707624 + + + FIRE + FIRE_886@GraphGeneration.gov + FIRE_886 + 9 + 3 + 23.69926065265144 + 106.70786620688412 + + + FIRE + FIRE_887@GraphGeneration.gov + FIRE_887 + 8 + 3 + 30.296724695102903 + 101.73126395875015 + + + FIRE + FIRE_888@GraphGeneration.gov + FIRE_888 + 10 + 3 + 6.485397694450882 + 110.76215956870666 + + + FIRE + FIRE_952@GraphGeneration.gov + FIRE_952 + 7 + 3 + 112.99510122399218 + 92.26131911650839 + + + FIRE + FIRE_954@GraphGeneration.gov + FIRE_954 + 12 + 3 + 109.0004714881137 + 103.20778096092675 + + + FIRE + FIRE_958@GraphGeneration.gov + FIRE_958 + 9 + 3 + 83.09991931090269 + 110.03779555549413 + + + FIRE + FIRE_961@GraphGeneration.gov + FIRE_961 + 8 + 3 + 119.63540638428523 + 103.01991514414328 + + + FIRE + FIRE_962@GraphGeneration.gov + FIRE_962 + 12 + 3 + 79.35987873192806 + 100.2439628998095 + + + FIRE + FIRE_963@GraphGeneration.gov + FIRE_963 + 7 + 3 + 126.60935009918128 + 106.15836888003227 + + + FIRE + FIRE_968@GraphGeneration.gov + FIRE_968 + 9 + 3 + 117.09184136045397 + 96.59040102871509 + + + FIRE + FIRE_974@GraphGeneration.gov + FIRE_974 + 10 + 3 + 99.05090425350653 + 86.39697676318929 + + + FIRE + FIRE_975@GraphGeneration.gov + FIRE_975 + 7 + 3 + 120.39267845690435 + 95.68869663838409 + + + FIRE + FIRE_1046@GraphGeneration.gov + FIRE_1046 + 9 + 3 + 196.9564951192461 + 86.12522433802052 + + + FIRE + FIRE_1052@GraphGeneration.gov + FIRE_1052 + 8 + 3 + 142.84748202611428 + 101.54821152625549 + + + FIRE + FIRE_1053@GraphGeneration.gov + FIRE_1053 + 10 + 3 + 138.9173400361225 + 89.20521494734226 + + + FIRE + FIRE_1054@GraphGeneration.gov + FIRE_1054 + 6 + 3 + 195.018139545573 + 113.16804371642417 + + + FIRE + FIRE_1058@GraphGeneration.gov + FIRE_1058 + 8 + 3 + 179.92394658338236 + 113.97148347700085 + + + FIRE + FIRE_1059@GraphGeneration.gov + FIRE_1059 + 9 + 3 + 145.97731208877403 + 99.30702410704431 + + + FIRE + FIRE_1064@GraphGeneration.gov + FIRE_1064 + 8 + 3 + 144.74946924514495 + 85.93822599135157 + + + FIRE + FIRE_1066@GraphGeneration.gov + FIRE_1066 + 9 + 3 + 137.74241944115613 + 109.28645765181527 + + + FIRE + FIRE_1069@GraphGeneration.gov + FIRE_1069 + 11 + 3 + 198.85707718853268 + 112.4493545792754 + + + FIRE + FIRE_1141@GraphGeneration.gov + FIRE_1141 + 10 + 3 + 37.99580066653415 + 121.99366880368049 + + + FIRE + FIRE_1144@GraphGeneration.gov + FIRE_1144 + 10 + 3 + 54.980313121816714 + 120.3857889076061 + + + FIRE + FIRE_1147@GraphGeneration.gov + FIRE_1147 + 6 + 3 + 42.099586210601345 + 118.04832221775425 + + + FIRE + FIRE_1148@GraphGeneration.gov + FIRE_1148 + 12 + 3 + 11.42967815948756 + 127.49730939374592 + + + FIRE + FIRE_1150@GraphGeneration.gov + FIRE_1150 + 10 + 3 + 39.14321055542453 + 132.63780926269948 + + + FIRE + FIRE_1151@GraphGeneration.gov + FIRE_1151 + 10 + 3 + 37.9611075389852 + 139.86601462868714 + + + FIRE + FIRE_1154@GraphGeneration.gov + FIRE_1154 + 11 + 3 + 24.78228709943132 + 120.66507061740215 + + + FIRE + FIRE_1155@GraphGeneration.gov + FIRE_1155 + 11 + 3 + 18.58902315011671 + 119.17194764083864 + + + FIRE + FIRE_1232@GraphGeneration.gov + FIRE_1232 + 12 + 3 + 85.67582042978923 + 133.4824358164288 + + + FIRE + FIRE_1234@GraphGeneration.gov + FIRE_1234 + 7 + 3 + 99.2413960416801 + 130.3617769275604 + + + FIRE + FIRE_1237@GraphGeneration.gov + FIRE_1237 + 10 + 3 + 69.37508337456143 + 132.61158865892426 + + + FIRE + FIRE_1239@GraphGeneration.gov + FIRE_1239 + 6 + 3 + 132.50006674165962 + 131.4742649233014 + + + FIRE + FIRE_1243@GraphGeneration.gov + FIRE_1243 + 12 + 3 + 132.14264497531187 + 132.87300525584806 + + + FIRE + FIRE_1251@GraphGeneration.gov + FIRE_1251 + 10 + 3 + 119.36061296500648 + 119.82211539984287 + + + FIRE + FIRE_1252@GraphGeneration.gov + FIRE_1252 + 6 + 3 + 82.38006193359385 + 132.84036850895393 + + + FIRE + FIRE_1319@GraphGeneration.gov + FIRE_1319 + 8 + 3 + 144.93643612232205 + 133.78638938330755 + + + FIRE + FIRE_1321@GraphGeneration.gov + FIRE_1321 + 10 + 3 + 137.53902502041257 + 134.4835302730417 + + + FIRE + FIRE_1322@GraphGeneration.gov + FIRE_1322 + 11 + 3 + 134.44944708905166 + 117.63881770029971 + + + FIRE + FIRE_1324@GraphGeneration.gov + FIRE_1324 + 10 + 3 + 156.52479355523593 + 133.96907952543444 + + + FIRE + FIRE_1333@GraphGeneration.gov + FIRE_1333 + 10 + 3 + 187.0977180808402 + 125.16013036710578 + + + FIRE + FIRE_1339@GraphGeneration.gov + FIRE_1339 + 10 + 3 + 148.3356274402297 + 119.73120969575794 + + + FIRE + FIRE_1417@GraphGeneration.gov + FIRE_1417 + 8 + 3 + 15.969649363571607 + 155.829595009723 + + + FIRE + FIRE_1424@GraphGeneration.gov + FIRE_1424 + 8 + 3 + 66.13495106611548 + 159.85512120365397 + + + FIRE + FIRE_1432@GraphGeneration.gov + FIRE_1432 + 8 + 3 + 10.007607624024596 + 163.90646211334237 + + + FIRE + FIRE_1434@GraphGeneration.gov + FIRE_1434 + 12 + 3 + 0.5734600906778983 + 168.12814709681118 + + + FIRE + FIRE_1436@GraphGeneration.gov + FIRE_1436 + 9 + 3 + 5.924872127490281 + 158.91535253841494 + + + FIRE + FIRE_1506@GraphGeneration.gov + FIRE_1506 + 10 + 3 + 124.1493779684005 + 169.59001224045747 + + + FIRE + FIRE_1512@GraphGeneration.gov + FIRE_1512 + 10 + 3 + 106.34840595538509 + 161.0132364800669 + + + FIRE + FIRE_1515@GraphGeneration.gov + FIRE_1515 + 10 + 3 + 117.63418125176499 + 165.52548450575944 + + + FIRE + FIRE_1519@GraphGeneration.gov + FIRE_1519 + 6 + 3 + 131.99650119711288 + 160.64925801131653 + + + FIRE + FIRE_1521@GraphGeneration.gov + FIRE_1521 + 8 + 3 + 89.72324057228916 + 157.15572794994836 + + + FIRE + FIRE_1528@GraphGeneration.gov + FIRE_1528 + 12 + 3 + 69.37445674559208 + 170.79576512851952 + + + FIRE + FIRE_1529@GraphGeneration.gov + FIRE_1529 + 12 + 3 + 130.24963148583058 + 161.92866311074917 + + + FIRE + FIRE_1530@GraphGeneration.gov + FIRE_1530 + 12 + 3 + 94.19641705110587 + 165.32387785175698 + + + FIRE + FIRE_1600@GraphGeneration.gov + FIRE_1600 + 11 + 3 + 192.67255749849105 + 157.526643020952 + + + FIRE + FIRE_1601@GraphGeneration.gov + FIRE_1601 + 6 + 3 + 164.30639416457785 + 143.98069820571695 + + + FIRE + FIRE_1602@GraphGeneration.gov + FIRE_1602 + 9 + 3 + 134.98519369924074 + 162.96405782679878 + + + FIRE + FIRE_1603@GraphGeneration.gov + FIRE_1603 + 9 + 3 + 168.45388352714693 + 169.50468014092226 + + + FIRE + FIRE_1604@GraphGeneration.gov + FIRE_1604 + 9 + 3 + 143.394085553768 + 144.6043788226785 + + + FIRE + FIRE_1606@GraphGeneration.gov + FIRE_1606 + 12 + 3 + 171.4094508449777 + 163.12191799769104 + + + FIRE + FIRE_1609@GraphGeneration.gov + FIRE_1609 + 9 + 3 + 182.3091357096501 + 167.27099245044633 + + + FIRE + FIRE_1616@GraphGeneration.gov + FIRE_1616 + 7 + 3 + 189.36554328054723 + 168.70679436270132 + + + FIRE + FIRE_1618@GraphGeneration.gov + FIRE_1618 + 11 + 3 + 148.84556052692142 + 151.49642402800865 + + + FIRE + FIRE_1619@GraphGeneration.gov + FIRE_1619 + 10 + 3 + 143.1896037089847 + 150.50718234136957 + + + FIRE + FIRE_1623@GraphGeneration.gov + FIRE_1623 + 10 + 3 + 183.9923503310525 + 154.15774408999195 + + + FIRE + FIRE_1688@GraphGeneration.gov + FIRE_1688 + 11 + 3 + 17.776040073462955 + 188.24383603091246 + + + FIRE + FIRE_1690@GraphGeneration.gov + FIRE_1690 + 9 + 3 + 33.83366796711004 + 196.99770341446936 + + + FIRE + FIRE_1698@GraphGeneration.gov + FIRE_1698 + 11 + 3 + 33.282922932725405 + 184.55746040305127 + + + FIRE + FIRE_1700@GraphGeneration.gov + FIRE_1700 + 8 + 3 + 44.025708746340115 + 172.63423070600112 + + + FIRE + FIRE_1701@GraphGeneration.gov + FIRE_1701 + 7 + 3 + 17.756283344944006 + 173.94034085583698 + + + FIRE + FIRE_1703@GraphGeneration.gov + FIRE_1703 + 6 + 3 + 59.47358610217616 + 192.3315028954653 + + + FIRE + FIRE_1705@GraphGeneration.gov + FIRE_1705 + 11 + 3 + 1.1580592681277389 + 188.06662369758487 + + + FIRE + FIRE_1706@GraphGeneration.gov + FIRE_1706 + 8 + 3 + 39.731888551464095 + 173.10745070644305 + + + FIRE + FIRE_1708@GraphGeneration.gov + FIRE_1708 + 10 + 3 + 9.116614800719578 + 198.33159329831133 + + + FIRE + FIRE_1709@GraphGeneration.gov + FIRE_1709 + 6 + 3 + 17.464164674105735 + 184.85989950774947 + + + FIRE + FIRE_1710@GraphGeneration.gov + FIRE_1710 + 10 + 3 + 46.4638830707389 + 192.97447157439916 + + + FIRE + FIRE_1791@GraphGeneration.gov + FIRE_1791 + 7 + 3 + 129.18838674117856 + 176.19142734250076 + + + FIRE + FIRE_1803@GraphGeneration.gov + FIRE_1803 + 9 + 3 + 98.28791889105773 + 186.43431750061694 + + + FIRE + FIRE_1804@GraphGeneration.gov + FIRE_1804 + 9 + 3 + 79.00521670793822 + 190.0656889522525 + + + FIRE + FIRE_1806@GraphGeneration.gov + FIRE_1806 + 10 + 3 + 103.81997094644683 + 197.4696753073261 + + + FIRE + FIRE_1877@GraphGeneration.gov + FIRE_1877 + 9 + 3 + 182.81136342907595 + 189.46513303825668 + + + FIRE + FIRE_1879@GraphGeneration.gov + FIRE_1879 + 12 + 3 + 140.91810993325984 + 172.71219225296264 + + + FIRE + FIRE_1880@GraphGeneration.gov + FIRE_1880 + 8 + 3 + 147.33986068342224 + 180.854174688569 + + + FIRE + FIRE_1888@GraphGeneration.gov + FIRE_1888 + 7 + 3 + 156.65123422961406 + 178.30932727735438 + + + FIRE + FIRE_1889@GraphGeneration.gov + FIRE_1889 + 12 + 3 + 171.33413944145718 + 182.74504195278698 + + + FIRE + FIRE_1899@GraphGeneration.gov + FIRE_1899 + 11 + 3 + 189.4037915892209 + 191.67904595008176 + + + LAW + LAW_65@GraphGeneration.gov + LAW_65 + 8 + 3 + 29.81810003999468 + 1.2951546951240298 + + + LAW + LAW_67@GraphGeneration.gov + LAW_67 + 8 + 3 + 55.68254061493399 + 13.026671750122546 + + + LAW + LAW_71@GraphGeneration.gov + LAW_71 + 8 + 3 + 15.148276272004296 + 24.890994857098892 + + + LAW + LAW_72@GraphGeneration.gov + LAW_72 + 12 + 3 + 33.51494288522809 + 16.349014309529487 + + + LAW + LAW_78@GraphGeneration.gov + LAW_78 + 11 + 3 + 33.06495529832618 + 27.910918129747447 + + + LAW + LAW_81@GraphGeneration.gov + LAW_81 + 10 + 3 + 7.039588654102895 + 15.105350097284827 + + + LAW + LAW_85@GraphGeneration.gov + LAW_85 + 10 + 3 + 52.399888122118334 + 15.774945389733288 + + + LAW + LAW_88@GraphGeneration.gov + LAW_88 + 10 + 3 + 0.5135180320106218 + 1.5860408042562646 + + + LAW + LAW_154@GraphGeneration.gov + LAW_154 + 11 + 3 + 95.17008231104307 + 18.99330242898587 + + + LAW + LAW_155@GraphGeneration.gov + LAW_155 + 8 + 3 + 68.48583219299837 + 17.231032232287546 + + + LAW + LAW_170@GraphGeneration.gov + LAW_170 + 10 + 3 + 83.12419942974546 + 8.07107489724747 + + + LAW + LAW_173@GraphGeneration.gov + LAW_173 + 12 + 3 + 117.10056384593204 + 1.2138114538665201 + + + LAW + LAW_177@GraphGeneration.gov + LAW_177 + 6 + 3 + 109.53101609117036 + 23.638880229435028 + + + LAW + LAW_178@GraphGeneration.gov + LAW_178 + 6 + 3 + 121.15092668841908 + 16.505224811286492 + + + LAW + LAW_180@GraphGeneration.gov + LAW_180 + 9 + 3 + 72.08733410586731 + 24.510264949743252 + + + LAW + LAW_246@GraphGeneration.gov + LAW_246 + 6 + 3 + 162.86417118017422 + 12.929682621956932 + + + LAW + LAW_250@GraphGeneration.gov + LAW_250 + 8 + 3 + 184.88805044271936 + 24.689085045662615 + + + LAW + LAW_252@GraphGeneration.gov + LAW_252 + 12 + 3 + 170.17164384379257 + 15.91096918049294 + + + LAW + LAW_253@GraphGeneration.gov + LAW_253 + 12 + 3 + 134.31279832777614 + 11.463557174695335 + + + LAW + LAW_254@GraphGeneration.gov + LAW_254 + 6 + 3 + 198.3120827047888 + 26.59878787539274 + + + LAW + LAW_256@GraphGeneration.gov + LAW_256 + 12 + 3 + 156.57985691874484 + 13.815871325282691 + + + LAW + LAW_271@GraphGeneration.gov + LAW_271 + 7 + 3 + 147.8752073631516 + 6.5400947449046996 + + + LAW + LAW_274@GraphGeneration.gov + LAW_274 + 12 + 3 + 195.91548315330857 + 8.542709886870282 + + + LAW + LAW_338@GraphGeneration.gov + LAW_338 + 9 + 3 + 26.428447173218885 + 47.84106239601367 + + + LAW + LAW_340@GraphGeneration.gov + LAW_340 + 6 + 3 + 30.789870252049365 + 42.420864967365944 + + + LAW + LAW_342@GraphGeneration.gov + LAW_342 + 12 + 3 + 55.93389267185731 + 48.08205584552062 + + + LAW + LAW_350@GraphGeneration.gov + LAW_350 + 9 + 3 + 50.460970753960005 + 37.26432808059144 + + + LAW + LAW_351@GraphGeneration.gov + LAW_351 + 12 + 3 + 59.199080469075376 + 55.352810201187765 + + + LAW + LAW_352@GraphGeneration.gov + LAW_352 + 6 + 3 + 3.1641128350201537 + 55.23932380026754 + + + LAW + LAW_357@GraphGeneration.gov + LAW_357 + 7 + 3 + 53.224377444652575 + 33.50759381782258 + + + LAW + LAW_359@GraphGeneration.gov + LAW_359 + 11 + 3 + 20.063995369913073 + 41.45173559243021 + + + LAW + LAW_362@GraphGeneration.gov + LAW_362 + 10 + 3 + 54.24132095413452 + 54.58483851891866 + + + LAW + LAW_364@GraphGeneration.gov + LAW_364 + 6 + 3 + 9.769982496627543 + 31.28153789904484 + + + LAW + LAW_440@GraphGeneration.gov + LAW_440 + 11 + 3 + 108.7694069103422 + 43.58097493164782 + + + LAW + LAW_455@GraphGeneration.gov + LAW_455 + 10 + 3 + 127.76033951086272 + 50.23094400010396 + + + LAW + LAW_456@GraphGeneration.gov + LAW_456 + 8 + 3 + 109.90027225910411 + 32.58426631365864 + + + LAW + LAW_522@GraphGeneration.gov + LAW_522 + 10 + 3 + 153.8649668876646 + 52.828204414595945 + + + LAW + LAW_526@GraphGeneration.gov + LAW_526 + 7 + 3 + 187.28698258605078 + 32.91252913268218 + + + LAW + LAW_531@GraphGeneration.gov + LAW_531 + 10 + 3 + 158.23735296228685 + 35.62065916207106 + + + LAW + LAW_534@GraphGeneration.gov + LAW_534 + 8 + 3 + 157.97801828480883 + 32.85939534600077 + + + LAW + LAW_539@GraphGeneration.gov + LAW_539 + 8 + 3 + 143.13376933958267 + 49.26497249748273 + + + LAW + LAW_544@GraphGeneration.gov + LAW_544 + 9 + 3 + 163.2725305991702 + 32.67974239014389 + + + LAW + LAW_546@GraphGeneration.gov + LAW_546 + 9 + 3 + 166.25961971307538 + 29.05257665579223 + + + LAW + LAW_614@GraphGeneration.gov + LAW_614 + 8 + 3 + 44.13118065380563 + 71.71312068308842 + + + LAW + LAW_619@GraphGeneration.gov + LAW_619 + 8 + 3 + 1.5102316142698635 + 60.460882375081695 + + + LAW + LAW_624@GraphGeneration.gov + LAW_624 + 9 + 3 + 44.754028129251296 + 62.53555479225413 + + + LAW + LAW_625@GraphGeneration.gov + LAW_625 + 12 + 3 + 35.359137290486856 + 77.59178087616782 + + + LAW + LAW_627@GraphGeneration.gov + LAW_627 + 9 + 3 + 29.919055667410333 + 67.74714329210133 + + + LAW + LAW_629@GraphGeneration.gov + LAW_629 + 11 + 3 + 48.03250245691066 + 58.222497633076365 + + + LAW + LAW_630@GraphGeneration.gov + LAW_630 + 8 + 3 + 40.4289910175408 + 66.79182747960782 + + + LAW + LAW_631@GraphGeneration.gov + LAW_631 + 6 + 3 + 28.703956891728232 + 63.958008349226354 + + + LAW + LAW_633@GraphGeneration.gov + LAW_633 + 12 + 3 + 27.28193505301829 + 84.0775535090695 + + + LAW + LAW_637@GraphGeneration.gov + LAW_637 + 7 + 3 + 21.18407991633821 + 66.93497781452096 + + + LAW + LAW_638@GraphGeneration.gov + LAW_638 + 12 + 3 + 26.611494343948888 + 73.73905905294666 + + + LAW + LAW_641@GraphGeneration.gov + LAW_641 + 11 + 3 + 46.53748631299381 + 58.83309351709392 + + + LAW + LAW_709@GraphGeneration.gov + LAW_709 + 8 + 3 + 74.43941056450055 + 80.30725293188698 + + + LAW + LAW_710@GraphGeneration.gov + LAW_710 + 8 + 3 + 89.40051722094378 + 78.06908509549629 + + + LAW + LAW_711@GraphGeneration.gov + LAW_711 + 7 + 3 + 98.2705884221437 + 71.19693129602389 + + + LAW + LAW_713@GraphGeneration.gov + LAW_713 + 6 + 3 + 68.18382097238143 + 59.47528612328815 + + + LAW + LAW_723@GraphGeneration.gov + LAW_723 + 6 + 3 + 85.91894426424955 + 79.51784803609681 + + + LAW + LAW_727@GraphGeneration.gov + LAW_727 + 8 + 3 + 81.45926108481588 + 80.18637801078359 + + + LAW + LAW_729@GraphGeneration.gov + LAW_729 + 12 + 3 + 117.19387074663138 + 83.3631061857958 + + + LAW + LAW_730@GraphGeneration.gov + LAW_730 + 11 + 3 + 93.18471887966223 + 57.281797025137614 + + + LAW + LAW_732@GraphGeneration.gov + LAW_732 + 12 + 3 + 85.80535743926534 + 64.63755909018715 + + + LAW + LAW_799@GraphGeneration.gov + LAW_799 + 6 + 3 + 174.95383445752805 + 58.37830005357547 + + + LAW + LAW_802@GraphGeneration.gov + LAW_802 + 11 + 3 + 169.44511686951762 + 60.080376574105685 + + + LAW + LAW_803@GraphGeneration.gov + LAW_803 + 11 + 3 + 154.9885415171778 + 63.15837448711678 + + + LAW + LAW_804@GraphGeneration.gov + LAW_804 + 12 + 3 + 176.77197894478257 + 85.61545559675591 + + + LAW + LAW_807@GraphGeneration.gov + LAW_807 + 8 + 3 + 169.9412147292906 + 68.167498815486 + + + LAW + LAW_814@GraphGeneration.gov + LAW_814 + 11 + 3 + 143.58293434704382 + 72.92693480062005 + + + LAW + LAW_816@GraphGeneration.gov + LAW_816 + 7 + 3 + 184.8279856962672 + 61.63702693216015 + + + LAW + LAW_826@GraphGeneration.gov + LAW_826 + 12 + 3 + 134.14503636908404 + 82.09870159631103 + + + LAW + LAW_896@GraphGeneration.gov + LAW_896 + 6 + 3 + 43.572318705263505 + 96.01078153760938 + + + LAW + LAW_904@GraphGeneration.gov + LAW_904 + 9 + 3 + 51.85219152240956 + 90.74110578628391 + + + LAW + LAW_909@GraphGeneration.gov + LAW_909 + 12 + 3 + 6.803119455307464 + 86.81528431425468 + + + LAW + LAW_911@GraphGeneration.gov + LAW_911 + 9 + 3 + 9.207096429936195 + 86.36791735321403 + + + LAW + LAW_912@GraphGeneration.gov + LAW_912 + 12 + 3 + 28.36201907779416 + 106.3751983318373 + + + LAW + LAW_913@GraphGeneration.gov + LAW_913 + 11 + 3 + 23.135243540710327 + 92.46513184080581 + + + LAW + LAW_914@GraphGeneration.gov + LAW_914 + 11 + 3 + 57.70165051501299 + 110.5725927113144 + + + LAW + LAW_916@GraphGeneration.gov + LAW_916 + 7 + 3 + 5.953125516136382 + 86.43286429993574 + + + LAW + LAW_982@GraphGeneration.gov + LAW_982 + 6 + 3 + 86.62788512137111 + 102.49486258870202 + + + LAW + LAW_993@GraphGeneration.gov + LAW_993 + 9 + 3 + 116.5310802646451 + 105.80676788897452 + + + LAW + LAW_995@GraphGeneration.gov + LAW_995 + 12 + 3 + 79.55826792030956 + 111.70225488409324 + + + LAW + LAW_1000@GraphGeneration.gov + LAW_1000 + 9 + 3 + 97.40213162697883 + 105.16256686154462 + + + LAW + LAW_1001@GraphGeneration.gov + LAW_1001 + 11 + 3 + 80.28730814417037 + 99.2131776083898 + + + LAW + LAW_1006@GraphGeneration.gov + LAW_1006 + 12 + 3 + 110.65464529802998 + 95.16897359067782 + + + LAW + LAW_1008@GraphGeneration.gov + LAW_1008 + 9 + 3 + 124.04554881147058 + 91.40762054359051 + + + LAW + LAW_1073@GraphGeneration.gov + LAW_1073 + 9 + 3 + 158.5898586824876 + 106.00428041263571 + + + LAW + LAW_1080@GraphGeneration.gov + LAW_1080 + 9 + 3 + 148.5469302637944 + 85.77324190455998 + + + LAW + LAW_1081@GraphGeneration.gov + LAW_1081 + 9 + 3 + 145.76070198695342 + 93.90787679918888 + + + LAW + LAW_1083@GraphGeneration.gov + LAW_1083 + 6 + 3 + 173.7290593348129 + 109.27816138651801 + + + LAW + LAW_1084@GraphGeneration.gov + LAW_1084 + 6 + 3 + 140.58033030926737 + 114.26837623992078 + + + LAW + LAW_1089@GraphGeneration.gov + LAW_1089 + 6 + 3 + 150.61924196004242 + 106.4619191165991 + + + LAW + LAW_1090@GraphGeneration.gov + LAW_1090 + 11 + 3 + 161.20854914454037 + 90.91281815586285 + + + LAW + LAW_1091@GraphGeneration.gov + LAW_1091 + 8 + 3 + 142.57131085638966 + 107.28364639055832 + + + LAW + LAW_1097@GraphGeneration.gov + LAW_1097 + 6 + 3 + 170.22894678740872 + 99.71596415514578 + + + LAW + LAW_1166@GraphGeneration.gov + LAW_1166 + 11 + 3 + 2.937502809967718 + 121.7220574209176 + + + LAW + LAW_1167@GraphGeneration.gov + LAW_1167 + 10 + 3 + 62.51202066810681 + 135.16066163815907 + + + LAW + LAW_1169@GraphGeneration.gov + LAW_1169 + 8 + 3 + 58.7617221976189 + 120.38198846039155 + + + LAW + LAW_1171@GraphGeneration.gov + LAW_1171 + 6 + 3 + 14.736707186848127 + 114.34647137652193 + + + LAW + LAW_1178@GraphGeneration.gov + LAW_1178 + 7 + 3 + 9.105017285043235 + 141.82772228840665 + + + LAW + LAW_1181@GraphGeneration.gov + LAW_1181 + 7 + 3 + 62.716352023949206 + 134.63289832943178 + + + LAW + LAW_1188@GraphGeneration.gov + LAW_1188 + 12 + 3 + 33.50231953337768 + 129.0925665990062 + + + LAW + LAW_1189@GraphGeneration.gov + LAW_1189 + 9 + 3 + 64.22681670790854 + 141.5298639637829 + + + LAW + LAW_1190@GraphGeneration.gov + LAW_1190 + 9 + 3 + 49.26178439699509 + 120.77919161875586 + + + LAW + LAW_1261@GraphGeneration.gov + LAW_1261 + 10 + 3 + 118.67183381973467 + 141.87700457397096 + + + LAW + LAW_1266@GraphGeneration.gov + LAW_1266 + 9 + 3 + 67.57371179210553 + 134.23012271524638 + + + LAW + LAW_1267@GraphGeneration.gov + LAW_1267 + 6 + 3 + 103.21807371631874 + 124.3353191035107 + + + LAW + LAW_1268@GraphGeneration.gov + LAW_1268 + 6 + 3 + 72.70255587200171 + 135.6234188183689 + + + LAW + LAW_1275@GraphGeneration.gov + LAW_1275 + 6 + 3 + 105.4028200864154 + 131.4176231946956 + + + LAW + LAW_1276@GraphGeneration.gov + LAW_1276 + 11 + 3 + 98.79886660177077 + 117.23158045476899 + + + LAW + LAW_1277@GraphGeneration.gov + LAW_1277 + 12 + 3 + 79.60174364891333 + 135.98453069001982 + + + LAW + LAW_1283@GraphGeneration.gov + LAW_1283 + 10 + 3 + 115.41649603935632 + 115.18485749957908 + + + LAW + LAW_1354@GraphGeneration.gov + LAW_1354 + 6 + 3 + 186.31362535596634 + 136.63492516518045 + + + LAW + LAW_1360@GraphGeneration.gov + LAW_1360 + 8 + 3 + 134.56767872738192 + 142.3998313204628 + + + LAW + LAW_1361@GraphGeneration.gov + LAW_1361 + 12 + 3 + 143.78800833431578 + 134.3206665908345 + + + LAW + LAW_1365@GraphGeneration.gov + LAW_1365 + 6 + 3 + 178.98266364814518 + 128.10031099191292 + + + LAW + LAW_1367@GraphGeneration.gov + LAW_1367 + 12 + 3 + 175.08442547799964 + 132.5960132963449 + + + LAW + LAW_1372@GraphGeneration.gov + LAW_1372 + 6 + 3 + 154.40148486111127 + 114.67858824241362 + + + LAW + LAW_1376@GraphGeneration.gov + LAW_1376 + 9 + 3 + 146.90660202590004 + 128.58648425029247 + + + LAW + LAW_1378@GraphGeneration.gov + LAW_1378 + 9 + 3 + 170.14746056831507 + 119.75197989336738 + + + LAW + LAW_1448@GraphGeneration.gov + LAW_1448 + 8 + 3 + 47.49524811614644 + 164.9634412657365 + + + LAW + LAW_1451@GraphGeneration.gov + LAW_1451 + 11 + 3 + 15.519390761773334 + 150.57716128928783 + + + LAW + LAW_1455@GraphGeneration.gov + LAW_1455 + 9 + 3 + 23.995137258045208 + 170.67944642384072 + + + LAW + LAW_1457@GraphGeneration.gov + LAW_1457 + 9 + 3 + 58.43482288662484 + 159.60099694207253 + + + LAW + LAW_1459@GraphGeneration.gov + LAW_1459 + 9 + 3 + 23.040381158262583 + 161.50896526323922 + + + LAW + LAW_1468@GraphGeneration.gov + LAW_1468 + 6 + 3 + 31.08067914170602 + 148.5137775583844 + + + LAW + LAW_1535@GraphGeneration.gov + LAW_1535 + 11 + 3 + 69.74341818060091 + 158.58508213227253 + + + LAW + LAW_1538@GraphGeneration.gov + LAW_1538 + 7 + 3 + 99.42274862286685 + 166.00042774373827 + + + LAW + LAW_1540@GraphGeneration.gov + LAW_1540 + 12 + 3 + 111.55069002231667 + 162.43223768306805 + + + LAW + LAW_1542@GraphGeneration.gov + LAW_1542 + 8 + 3 + 129.1137080071002 + 160.08052538327178 + + + LAW + LAW_1544@GraphGeneration.gov + LAW_1544 + 7 + 3 + 121.99519534146302 + 148.76963070274567 + + + LAW + LAW_1546@GraphGeneration.gov + LAW_1546 + 11 + 3 + 108.98945129083478 + 154.8537491772008 + + + LAW + LAW_1548@GraphGeneration.gov + LAW_1548 + 10 + 3 + 99.81310874172789 + 158.5591408779984 + + + LAW + LAW_1555@GraphGeneration.gov + LAW_1555 + 12 + 3 + 83.33740090223941 + 144.1512530452535 + + + LAW + LAW_1556@GraphGeneration.gov + LAW_1556 + 10 + 3 + 82.04083394856835 + 152.73338847320636 + + + LAW + LAW_1561@GraphGeneration.gov + LAW_1561 + 10 + 3 + 118.4042054938238 + 155.56872985596462 + + + LAW + LAW_1562@GraphGeneration.gov + LAW_1562 + 11 + 3 + 121.69293777170367 + 160.89560302091874 + + + LAW + LAW_1626@GraphGeneration.gov + LAW_1626 + 9 + 3 + 154.7104233814874 + 162.02473457876835 + + + LAW + LAW_1634@GraphGeneration.gov + LAW_1634 + 12 + 3 + 175.83979903708027 + 143.54486139643282 + + + LAW + LAW_1639@GraphGeneration.gov + LAW_1639 + 9 + 3 + 161.38888466846646 + 149.1592706949815 + + + LAW + LAW_1640@GraphGeneration.gov + LAW_1640 + 6 + 3 + 192.67836305469632 + 148.0250184862565 + + + LAW + LAW_1644@GraphGeneration.gov + LAW_1644 + 9 + 3 + 142.17332924687784 + 153.7205975805941 + + + LAW + LAW_1649@GraphGeneration.gov + LAW_1649 + 11 + 3 + 138.45618063609615 + 152.39846342883294 + + + LAW + LAW_1653@GraphGeneration.gov + LAW_1653 + 12 + 3 + 179.80372883729638 + 162.13043888600396 + + + LAW + LAW_1719@GraphGeneration.gov + LAW_1719 + 7 + 3 + 56.42271204375938 + 172.44158338823442 + + + LAW + LAW_1729@GraphGeneration.gov + LAW_1729 + 6 + 3 + 62.875307320453466 + 178.83842824227224 + + + LAW + LAW_1731@GraphGeneration.gov + LAW_1731 + 11 + 3 + 54.89681600603831 + 181.84138531624396 + + + LAW + LAW_1734@GraphGeneration.gov + LAW_1734 + 11 + 3 + 15.56815379672758 + 188.10546521402435 + + + LAW + LAW_1735@GraphGeneration.gov + LAW_1735 + 12 + 3 + 57.7167220652282 + 181.1158349432073 + + + LAW + LAW_1737@GraphGeneration.gov + LAW_1737 + 8 + 3 + 13.565008147552172 + 186.01198865641985 + + + LAW + LAW_1740@GraphGeneration.gov + LAW_1740 + 6 + 3 + 39.922491132907716 + 195.07707992466348 + + + LAW + LAW_1742@GraphGeneration.gov + LAW_1742 + 12 + 3 + 5.883561190185723 + 183.09606644285395 + + + LAW + LAW_1743@GraphGeneration.gov + LAW_1743 + 8 + 3 + 45.87942414080621 + 188.8792540361905 + + + LAW + LAW_1814@GraphGeneration.gov + LAW_1814 + 8 + 3 + 88.17193808859787 + 187.64439975073938 + + + LAW + LAW_1815@GraphGeneration.gov + LAW_1815 + 8 + 3 + 105.25961755153946 + 189.4651771886406 + + + LAW + LAW_1818@GraphGeneration.gov + LAW_1818 + 6 + 3 + 106.30050390078736 + 197.48101928880584 + + + LAW + LAW_1822@GraphGeneration.gov + LAW_1822 + 9 + 3 + 68.70964043744476 + 196.87637705982502 + + + LAW + LAW_1824@GraphGeneration.gov + LAW_1824 + 10 + 3 + 102.18500781239402 + 198.8037318733474 + + + LAW + LAW_1836@GraphGeneration.gov + LAW_1836 + 10 + 3 + 80.68261549121478 + 182.8819371373128 + + + LAW + LAW_1837@GraphGeneration.gov + LAW_1837 + 10 + 3 + 106.27390307381484 + 188.44010781452295 + + + LAW + LAW_1906@GraphGeneration.gov + LAW_1906 + 7 + 3 + 135.9173916467889 + 184.58687613845507 + + + LAW + LAW_1908@GraphGeneration.gov + LAW_1908 + 8 + 3 + 144.25069260094727 + 175.71947904488715 + + + LAW + LAW_1912@GraphGeneration.gov + LAW_1912 + 10 + 3 + 136.4448416831871 + 177.0246308726032 + + + LAW + LAW_1913@GraphGeneration.gov + LAW_1913 + 12 + 3 + 185.53346365132467 + 192.89884181487236 + + + LAW + LAW_1914@GraphGeneration.gov + LAW_1914 + 11 + 3 + 169.5390325045595 + 197.93099519044188 + + + LAW + LAW_1916@GraphGeneration.gov + LAW_1916 + 8 + 3 + 135.02009914729788 + 189.53600038687216 + + + LAW + LAW_1918@GraphGeneration.gov + LAW_1918 + 12 + 3 + 175.23258515471997 + 172.25045782783417 + + + LAW + LAW_1924@GraphGeneration.gov + LAW_1924 + 9 + 3 + 175.52544666265482 + 173.8784706377101 + + + LAW + LAW_1927@GraphGeneration.gov + LAW_1927 + 11 + 3 + 186.16366559255079 + 175.20716209911794 + + + LAW + LAW_1929@GraphGeneration.gov + LAW_1929 + 6 + 3 + 138.54362812102298 + 189.49972187825028 + + + LAW + LAW_1930@GraphGeneration.gov + LAW_1930 + 12 + 3 + 184.7659075083111 + 182.23294573801496 + + + EMS + EMS_3@GraphGeneration.gov + EMS_3 + 6 + 4 + 53.24483808447065 + 10.508163406844558 + + + EMS + EMS_9@GraphGeneration.gov + EMS_9 + 12 + 4 + 43.536217344348536 + 24.94515307065562 + + + EMS + EMS_18@GraphGeneration.gov + EMS_18 + 12 + 4 + 20.585592145589334 + 1.963335437830795 + + + EMS + EMS_21@GraphGeneration.gov + EMS_21 + 7 + 4 + 49.39333874699091 + 27.260678378529693 + + + EMS + EMS_22@GraphGeneration.gov + EMS_22 + 12 + 4 + 30.66544289008124 + 3.1708491941722063 + + + EMS + EMS_26@GraphGeneration.gov + EMS_26 + 6 + 4 + 54.812242570110485 + 4.880447709356856 + + + EMS + EMS_30@GraphGeneration.gov + EMS_30 + 12 + 4 + 20.679494272320877 + 23.137873297043498 + + + EMS + EMS_95@GraphGeneration.gov + EMS_95 + 10 + 4 + 67.09844959043417 + 15.348461860797531 + + + EMS + EMS_97@GraphGeneration.gov + EMS_97 + 12 + 4 + 101.47455853098663 + 4.818347433604215 + + + EMS + EMS_113@GraphGeneration.gov + EMS_113 + 11 + 4 + 107.08234011201256 + 12.995034202571025 + + + EMS + EMS_117@GraphGeneration.gov + EMS_117 + 7 + 4 + 103.77588074594286 + 5.027851382822966 + + + EMS + EMS_121@GraphGeneration.gov + EMS_121 + 8 + 4 + 90.42931519518157 + 27.37502209363067 + + + EMS + EMS_188@GraphGeneration.gov + EMS_188 + 7 + 4 + 137.35038341117257 + 18.385661618007475 + + + EMS + EMS_189@GraphGeneration.gov + EMS_189 + 11 + 4 + 155.50705399058708 + 1.282851146992289 + + + EMS + EMS_191@GraphGeneration.gov + EMS_191 + 6 + 4 + 173.5557633197165 + 9.377588786637608 + + + EMS + EMS_192@GraphGeneration.gov + EMS_192 + 10 + 4 + 187.74804001963034 + 4.10162901992735 + + + EMS + EMS_196@GraphGeneration.gov + EMS_196 + 9 + 4 + 194.92988576046048 + 0.8875584728600553 + + + EMS + EMS_197@GraphGeneration.gov + EMS_197 + 10 + 4 + 197.70724350428077 + 25.421651906255217 + + + EMS + EMS_200@GraphGeneration.gov + EMS_200 + 8 + 4 + 170.08972519244966 + 7.830219124047755 + + + EMS + EMS_203@GraphGeneration.gov + EMS_203 + 7 + 4 + 157.9556762709336 + 25.47157865656048 + + + EMS + EMS_209@GraphGeneration.gov + EMS_209 + 8 + 4 + 183.087215741922 + 6.745611753290036 + + + EMS + EMS_283@GraphGeneration.gov + EMS_283 + 11 + 4 + 59.377740810238684 + 32.284362656233384 + + + EMS + EMS_285@GraphGeneration.gov + EMS_285 + 11 + 4 + 28.84506325975638 + 44.83992502149431 + + + EMS + EMS_288@GraphGeneration.gov + EMS_288 + 8 + 4 + 27.454433621256925 + 45.50708806794397 + + + EMS + EMS_289@GraphGeneration.gov + EMS_289 + 7 + 4 + 46.12662410239461 + 43.34943993091273 + + + EMS + EMS_292@GraphGeneration.gov + EMS_292 + 10 + 4 + 61.2617271116186 + 42.95808531597094 + + + EMS + EMS_295@GraphGeneration.gov + EMS_295 + 9 + 4 + 56.647304640725196 + 32.05026711154803 + + + EMS + EMS_297@GraphGeneration.gov + EMS_297 + 7 + 4 + 2.252543109559276 + 54.3705892260422 + + + EMS + EMS_300@GraphGeneration.gov + EMS_300 + 11 + 4 + 49.54649949416762 + 35.029788163234514 + + + EMS + EMS_302@GraphGeneration.gov + EMS_302 + 9 + 4 + 55.17761742913276 + 55.80660525545005 + + + EMS + EMS_369@GraphGeneration.gov + EMS_369 + 8 + 4 + 67.71652325202682 + 56.30518116250202 + + + EMS + EMS_372@GraphGeneration.gov + EMS_372 + 8 + 4 + 69.40715341272833 + 54.37776910328658 + + + EMS + EMS_373@GraphGeneration.gov + EMS_373 + 6 + 4 + 96.70583122601815 + 34.03822408113237 + + + EMS + EMS_374@GraphGeneration.gov + EMS_374 + 6 + 4 + 82.87577525716355 + 43.64790805877066 + + + EMS + EMS_376@GraphGeneration.gov + EMS_376 + 10 + 4 + 94.43036481424376 + 30.572590336427893 + + + EMS + EMS_383@GraphGeneration.gov + EMS_383 + 9 + 4 + 73.49736241083568 + 55.375611671751294 + + + EMS + EMS_393@GraphGeneration.gov + EMS_393 + 11 + 4 + 108.36949594964787 + 51.10744945508298 + + + EMS + EMS_396@GraphGeneration.gov + EMS_396 + 9 + 4 + 118.84731077587941 + 34.240433570420265 + + + EMS + EMS_397@GraphGeneration.gov + EMS_397 + 9 + 4 + 121.42922106423242 + 40.418163002546144 + + + EMS + EMS_461@GraphGeneration.gov + EMS_461 + 8 + 4 + 142.3429717199221 + 32.43205277210421 + + + EMS + EMS_464@GraphGeneration.gov + EMS_464 + 9 + 4 + 145.6250032735692 + 29.42624261004136 + + + EMS + EMS_465@GraphGeneration.gov + EMS_465 + 6 + 4 + 160.4272736785608 + 56.130535446285776 + + + EMS + EMS_466@GraphGeneration.gov + EMS_466 + 8 + 4 + 152.96341911009316 + 42.567209541427715 + + + EMS + EMS_469@GraphGeneration.gov + EMS_469 + 12 + 4 + 183.74938029766042 + 48.62592528806978 + + + EMS + EMS_470@GraphGeneration.gov + EMS_470 + 6 + 4 + 138.19312318753205 + 56.88232194231173 + + + EMS + EMS_476@GraphGeneration.gov + EMS_476 + 12 + 4 + 154.45285500845708 + 49.93778240534675 + + + EMS + EMS_480@GraphGeneration.gov + EMS_480 + 6 + 4 + 177.62907774270204 + 42.62049677763873 + + + EMS + EMS_486@GraphGeneration.gov + EMS_486 + 7 + 4 + 190.36814174066612 + 38.4913747820717 + + + EMS + EMS_488@GraphGeneration.gov + EMS_488 + 11 + 4 + 165.4902310458936 + 40.03454570385147 + + + EMS + EMS_490@GraphGeneration.gov + EMS_490 + 7 + 4 + 166.92718707600037 + 33.77787232435905 + + + EMS + EMS_553@GraphGeneration.gov + EMS_553 + 6 + 4 + 51.0176877749275 + 65.36429187660782 + + + EMS + EMS_554@GraphGeneration.gov + EMS_554 + 11 + 4 + 48.12242797589202 + 64.774944596099 + + + EMS + EMS_560@GraphGeneration.gov + EMS_560 + 8 + 4 + 31.871387003722734 + 85.45693356780433 + + + EMS + EMS_561@GraphGeneration.gov + EMS_561 + 11 + 4 + 31.035524508828324 + 83.87790437002668 + + + EMS + EMS_563@GraphGeneration.gov + EMS_563 + 6 + 4 + 60.83586759931214 + 57.63284209285437 + + + EMS + EMS_565@GraphGeneration.gov + EMS_565 + 9 + 4 + 62.40014348377313 + 60.6235834577852 + + + EMS + EMS_567@GraphGeneration.gov + EMS_567 + 7 + 4 + 32.73376961322648 + 59.27227662587424 + + + EMS + EMS_569@GraphGeneration.gov + EMS_569 + 10 + 4 + 6.9316409343632115 + 78.91757823948811 + + + EMS + EMS_570@GraphGeneration.gov + EMS_570 + 10 + 4 + 27.563393834232603 + 66.19573828109941 + + + EMS + EMS_571@GraphGeneration.gov + EMS_571 + 12 + 4 + 58.32829541895622 + 65.90189920905799 + + + EMS + EMS_575@GraphGeneration.gov + EMS_575 + 12 + 4 + 40.337478527466686 + 81.31235216864496 + + + EMS + EMS_580@GraphGeneration.gov + EMS_580 + 12 + 4 + 12.907116392176063 + 68.95782967709133 + + + EMS + EMS_645@GraphGeneration.gov + EMS_645 + 10 + 4 + 127.36608681421566 + 85.40522376694827 + + + EMS + EMS_651@GraphGeneration.gov + EMS_651 + 12 + 4 + 79.54201973902939 + 67.83054955064338 + + + EMS + EMS_653@GraphGeneration.gov + EMS_653 + 10 + 4 + 79.72645933859641 + 71.90990201901455 + + + EMS + EMS_662@GraphGeneration.gov + EMS_662 + 10 + 4 + 69.03987428732424 + 72.02296535552023 + + + EMS + EMS_663@GraphGeneration.gov + EMS_663 + 12 + 4 + 123.86726449109733 + 79.39427414805955 + + + EMS + EMS_667@GraphGeneration.gov + EMS_667 + 8 + 4 + 117.91013481795866 + 57.28427678352048 + + + EMS + EMS_672@GraphGeneration.gov + EMS_672 + 8 + 4 + 131.60208518733634 + 60.11143578764488 + + + EMS + EMS_744@GraphGeneration.gov + EMS_744 + 12 + 4 + 146.21385314920795 + 62.88579291553017 + + + EMS + EMS_746@GraphGeneration.gov + EMS_746 + 10 + 4 + 144.36070484873247 + 73.4720832517089 + + + EMS + EMS_753@GraphGeneration.gov + EMS_753 + 7 + 4 + 162.34060522810637 + 80.33970341721127 + + + EMS + EMS_760@GraphGeneration.gov + EMS_760 + 11 + 4 + 163.26529076077313 + 78.98776503702783 + + + EMS + EMS_763@GraphGeneration.gov + EMS_763 + 6 + 4 + 143.2062913884487 + 77.8786581362277 + + + EMS + EMS_764@GraphGeneration.gov + EMS_764 + 8 + 4 + 172.806281405476 + 58.28991999593479 + + + EMS + EMS_841@GraphGeneration.gov + EMS_841 + 9 + 4 + 9.90360517423267 + 99.91385271301793 + + + EMS + EMS_843@GraphGeneration.gov + EMS_843 + 11 + 4 + 17.59351002840813 + 90.75420437949082 + + + EMS + EMS_847@GraphGeneration.gov + EMS_847 + 7 + 4 + 37.13492853761621 + 103.54961327544747 + + + EMS + EMS_850@GraphGeneration.gov + EMS_850 + 6 + 4 + 25.18276691624959 + 99.51253247547461 + + + EMS + EMS_852@GraphGeneration.gov + EMS_852 + 10 + 4 + 39.921888854811876 + 95.76594252258339 + + + EMS + EMS_856@GraphGeneration.gov + EMS_856 + 7 + 4 + 14.225006289165211 + 101.52416764131831 + + + EMS + EMS_924@GraphGeneration.gov + EMS_924 + 9 + 4 + 97.9966043543312 + 86.22430863346132 + + + EMS + EMS_930@GraphGeneration.gov + EMS_930 + 8 + 4 + 79.44045052742682 + 107.81045896954794 + + + EMS + EMS_932@GraphGeneration.gov + EMS_932 + 9 + 4 + 117.33042395389094 + 110.74013328429582 + + + EMS + EMS_934@GraphGeneration.gov + EMS_934 + 7 + 4 + 86.1078877098515 + 96.7331041333813 + + + EMS + EMS_935@GraphGeneration.gov + EMS_935 + 7 + 4 + 108.9841757501919 + 92.65605537246854 + + + EMS + EMS_938@GraphGeneration.gov + EMS_938 + 7 + 4 + 128.66248091765632 + 96.92490420416728 + + + EMS + EMS_939@GraphGeneration.gov + EMS_939 + 10 + 4 + 109.59771460448697 + 104.60619468039584 + + + EMS + EMS_943@GraphGeneration.gov + EMS_943 + 12 + 4 + 130.19431127764625 + 108.91910254351765 + + + EMS + EMS_946@GraphGeneration.gov + EMS_946 + 10 + 4 + 113.9405538673084 + 107.75916538896132 + + + EMS + EMS_1013@GraphGeneration.gov + EMS_1013 + 10 + 4 + 185.00856286096072 + 96.33837623596825 + + + EMS + EMS_1017@GraphGeneration.gov + EMS_1017 + 7 + 4 + 163.32251195772173 + 89.26126152675563 + + + EMS + EMS_1023@GraphGeneration.gov + EMS_1023 + 12 + 4 + 177.9990327258268 + 109.68632041517387 + + + EMS + EMS_1027@GraphGeneration.gov + EMS_1027 + 11 + 4 + 143.92163988557687 + 86.53677346899367 + + + EMS + EMS_1042@GraphGeneration.gov + EMS_1042 + 9 + 4 + 187.59038441075924 + 111.226138139128 + + + EMS + EMS_1105@GraphGeneration.gov + EMS_1105 + 9 + 4 + 53.99840250990526 + 141.29668781476056 + + + EMS + EMS_1107@GraphGeneration.gov + EMS_1107 + 6 + 4 + 51.894961697013585 + 127.13197361480533 + + + EMS + EMS_1115@GraphGeneration.gov + EMS_1115 + 7 + 4 + 38.39548046141305 + 127.25947705228263 + + + EMS + EMS_1116@GraphGeneration.gov + EMS_1116 + 11 + 4 + 57.29677606245432 + 133.02509227564045 + + + EMS + EMS_1124@GraphGeneration.gov + EMS_1124 + 7 + 4 + 47.1575373190595 + 120.30258000184311 + + + EMS + EMS_1131@GraphGeneration.gov + EMS_1131 + 9 + 4 + 4.99426109905646 + 131.55234377977217 + + + EMS + EMS_1134@GraphGeneration.gov + EMS_1134 + 8 + 4 + 32.96304025243062 + 128.04068163904066 + + + EMS + EMS_1199@GraphGeneration.gov + EMS_1199 + 9 + 4 + 88.88460437566258 + 121.67014791058455 + + + EMS + EMS_1205@GraphGeneration.gov + EMS_1205 + 8 + 4 + 122.44407558159767 + 117.21017223529414 + + + EMS + EMS_1209@GraphGeneration.gov + EMS_1209 + 12 + 4 + 105.43772268065399 + 131.32689640899193 + + + EMS + EMS_1212@GraphGeneration.gov + EMS_1212 + 7 + 4 + 133.24955660790903 + 136.44502023662992 + + + EMS + EMS_1214@GraphGeneration.gov + EMS_1214 + 12 + 4 + 126.74038555879602 + 136.4790640010695 + + + EMS + EMS_1289@GraphGeneration.gov + EMS_1289 + 11 + 4 + 136.80254742861703 + 116.37674961633904 + + + EMS + EMS_1291@GraphGeneration.gov + EMS_1291 + 9 + 4 + 139.50734912675182 + 121.12542672002974 + + + EMS + EMS_1292@GraphGeneration.gov + EMS_1292 + 11 + 4 + 156.39606612322584 + 142.12487809621814 + + + EMS + EMS_1293@GraphGeneration.gov + EMS_1293 + 12 + 4 + 158.34026480482842 + 121.02080683216592 + + + EMS + EMS_1304@GraphGeneration.gov + EMS_1304 + 8 + 4 + 187.68523678687737 + 117.67604110488628 + + + EMS + EMS_1306@GraphGeneration.gov + EMS_1306 + 11 + 4 + 134.50591243210525 + 135.26781891443943 + + + EMS + EMS_1311@GraphGeneration.gov + EMS_1311 + 6 + 4 + 166.85326865985033 + 130.06282170367038 + + + EMS + EMS_1312@GraphGeneration.gov + EMS_1312 + 10 + 4 + 135.98832379356503 + 124.23093971170283 + + + EMS + EMS_1382@GraphGeneration.gov + EMS_1382 + 6 + 4 + 32.81735854652071 + 151.7011099294128 + + + EMS + EMS_1384@GraphGeneration.gov + EMS_1384 + 7 + 4 + 59.98059960100839 + 147.64535407712526 + + + EMS + EMS_1391@GraphGeneration.gov + EMS_1391 + 8 + 4 + 31.150588817850764 + 154.7816669954203 + + + EMS + EMS_1399@GraphGeneration.gov + EMS_1399 + 9 + 4 + 34.58648850501979 + 159.84547064241968 + + + EMS + EMS_1400@GraphGeneration.gov + EMS_1400 + 8 + 4 + 41.65738295705316 + 146.46536628542427 + + + EMS + EMS_1401@GraphGeneration.gov + EMS_1401 + 12 + 4 + 31.493972906502993 + 168.22937224933742 + + + EMS + EMS_1477@GraphGeneration.gov + EMS_1477 + 10 + 4 + 125.6538769193017 + 169.78766252909543 + + + EMS + EMS_1480@GraphGeneration.gov + EMS_1480 + 7 + 4 + 70.5891352598934 + 151.95598796686292 + + + EMS + EMS_1481@GraphGeneration.gov + EMS_1481 + 10 + 4 + 100.51416222244805 + 149.7090597420922 + + + EMS + EMS_1482@GraphGeneration.gov + EMS_1482 + 9 + 4 + 105.17666856704929 + 149.86261987201578 + + + EMS + EMS_1495@GraphGeneration.gov + EMS_1495 + 9 + 4 + 99.67957277243755 + 145.69039241957148 + + + EMS + EMS_1497@GraphGeneration.gov + EMS_1497 + 8 + 4 + 66.67177725344992 + 165.18015645643504 + + + EMS + EMS_1565@GraphGeneration.gov + EMS_1565 + 6 + 4 + 173.2044867133069 + 153.53090257170822 + + + EMS + EMS_1570@GraphGeneration.gov + EMS_1570 + 10 + 4 + 172.75445759460854 + 164.03375365740945 + + + EMS + EMS_1572@GraphGeneration.gov + EMS_1572 + 12 + 4 + 138.55030411508318 + 152.26246952280678 + + + EMS + EMS_1573@GraphGeneration.gov + EMS_1573 + 6 + 4 + 154.09903585636442 + 146.34340387235466 + + + EMS + EMS_1586@GraphGeneration.gov + EMS_1586 + 6 + 4 + 181.55204693367656 + 169.72863454173273 + + + EMS + EMS_1587@GraphGeneration.gov + EMS_1587 + 10 + 4 + 188.41484112360288 + 144.49688670004147 + + + EMS + EMS_1588@GraphGeneration.gov + EMS_1588 + 9 + 4 + 170.24392396411596 + 147.83593260673373 + + + EMS + EMS_1590@GraphGeneration.gov + EMS_1590 + 9 + 4 + 166.40104862501136 + 156.76563996100984 + + + EMS + EMS_1594@GraphGeneration.gov + EMS_1594 + 8 + 4 + 159.73279698130204 + 146.9772528863385 + + + EMS + EMS_1666@GraphGeneration.gov + EMS_1666 + 12 + 4 + 35.75679041694992 + 192.60618434321117 + + + EMS + EMS_1667@GraphGeneration.gov + EMS_1667 + 8 + 4 + 43.08679345641496 + 186.95788824873708 + + + EMS + EMS_1670@GraphGeneration.gov + EMS_1670 + 7 + 4 + 61.97559011682774 + 175.8803407773927 + + + EMS + EMS_1673@GraphGeneration.gov + EMS_1673 + 10 + 4 + 46.03013369047653 + 184.8664251808886 + + + EMS + EMS_1676@GraphGeneration.gov + EMS_1676 + 6 + 4 + 27.91669651913825 + 176.17956269994195 + + + EMS + EMS_1685@GraphGeneration.gov + EMS_1685 + 6 + 4 + 33.96105954422363 + 174.5246175753966 + + + EMS + EMS_1749@GraphGeneration.gov + EMS_1749 + 11 + 4 + 82.95128722764773 + 193.78631566758327 + + + EMS + EMS_1752@GraphGeneration.gov + EMS_1752 + 10 + 4 + 110.17336614023718 + 180.73980722474056 + + + EMS + EMS_1754@GraphGeneration.gov + EMS_1754 + 7 + 4 + 117.28024002373783 + 191.4028158632172 + + + EMS + EMS_1760@GraphGeneration.gov + EMS_1760 + 9 + 4 + 117.79506051545647 + 191.41428425151778 + + + EMS + EMS_1762@GraphGeneration.gov + EMS_1762 + 12 + 4 + 128.4268028637448 + 176.16388293629012 + + + EMS + EMS_1763@GraphGeneration.gov + EMS_1763 + 10 + 4 + 102.2615840660514 + 195.37468766535412 + + + EMS + EMS_1768@GraphGeneration.gov + EMS_1768 + 12 + 4 + 105.94677367252892 + 183.6391231898577 + + + EMS + EMS_1776@GraphGeneration.gov + EMS_1776 + 10 + 4 + 114.6114649941751 + 195.68606756672878 + + + EMS + EMS_1777@GraphGeneration.gov + EMS_1777 + 7 + 4 + 80.29538563335726 + 171.61071019524644 + + + EMS + EMS_1841@GraphGeneration.gov + EMS_1841 + 8 + 4 + 150.24976567268692 + 183.14706481229882 + + + EMS + EMS_1843@GraphGeneration.gov + EMS_1843 + 8 + 4 + 167.96568831510194 + 197.57636623522643 + + + EMS + EMS_1845@GraphGeneration.gov + EMS_1845 + 12 + 4 + 153.4208562734183 + 185.53142086873066 + + + EMS + EMS_1851@GraphGeneration.gov + EMS_1851 + 6 + 4 + 137.42944177296155 + 181.9651688028916 + + + EMS + EMS_1858@GraphGeneration.gov + EMS_1858 + 7 + 4 + 169.34338134378285 + 199.49592652177103 + + + EMS + EMS_1861@GraphGeneration.gov + EMS_1861 + 12 + 4 + 153.50651747718126 + 177.76970770863167 + + + EMS + EMS_1865@GraphGeneration.gov + EMS_1865 + 6 + 4 + 195.68680286820876 + 194.86135275161038 + + + EMS + EMS_1866@GraphGeneration.gov + EMS_1866 + 9 + 4 + 147.5353586371011 + 190.8112973773417 + + + EMS + EMS_1867@GraphGeneration.gov + EMS_1867 + 6 + 4 + 147.76528166025935 + 193.74269317872705 + + + EMS + EMS_1868@GraphGeneration.gov + EMS_1868 + 12 + 4 + 169.11794988223016 + 178.28070058186472 + + + EMS + EMS_1869@GraphGeneration.gov + EMS_1869 + 6 + 4 + 166.24147121325922 + 196.9800106219317 + + + FIRE + FIRE_33@GraphGeneration.gov + FIRE_33 + 6 + 4 + 21.86384896501265 + 12.706297498745057 + + + FIRE + FIRE_34@GraphGeneration.gov + FIRE_34 + 10 + 4 + 46.68407327109596 + 3.7294536717682716 + + + FIRE + FIRE_37@GraphGeneration.gov + FIRE_37 + 12 + 4 + 2.9952342460530135 + 27.360020466048336 + + + FIRE + FIRE_38@GraphGeneration.gov + FIRE_38 + 7 + 4 + 57.470024804565796 + 14.804910146411329 + + + FIRE + FIRE_41@GraphGeneration.gov + FIRE_41 + 9 + 4 + 34.40421514687941 + 5.791030626975512 + + + FIRE + FIRE_42@GraphGeneration.gov + FIRE_42 + 8 + 4 + 26.99004129654183 + 1.6540210793832706 + + + FIRE + FIRE_51@GraphGeneration.gov + FIRE_51 + 8 + 4 + 40.31856805276646 + 23.162910088062027 + + + FIRE + FIRE_56@GraphGeneration.gov + FIRE_56 + 9 + 4 + 8.130853244287987 + 0.3942043583160146 + + + FIRE + FIRE_123@GraphGeneration.gov + FIRE_123 + 6 + 4 + 127.24591743887376 + 20.3119684171907 + + + FIRE + FIRE_125@GraphGeneration.gov + FIRE_125 + 11 + 4 + 72.99652789323622 + 15.545992535570653 + + + FIRE + FIRE_128@GraphGeneration.gov + FIRE_128 + 9 + 4 + 83.00175099134913 + 3.39380193352814 + + + FIRE + FIRE_135@GraphGeneration.gov + FIRE_135 + 11 + 4 + 98.30537651259893 + 12.333410447831175 + + + FIRE + FIRE_147@GraphGeneration.gov + FIRE_147 + 7 + 4 + 125.75928096125159 + 19.229851126897948 + + + FIRE + FIRE_148@GraphGeneration.gov + FIRE_148 + 12 + 4 + 120.24014419613614 + 26.689285212960243 + + + FIRE + FIRE_151@GraphGeneration.gov + FIRE_151 + 10 + 4 + 70.43726840946726 + 28.03033703120373 + + + FIRE + FIRE_152@GraphGeneration.gov + FIRE_152 + 10 + 4 + 107.04876350885198 + 13.245124376221034 + + + FIRE + FIRE_220@GraphGeneration.gov + FIRE_220 + 11 + 4 + 142.83082020595936 + 17.30496215370988 + + + FIRE + FIRE_221@GraphGeneration.gov + FIRE_221 + 9 + 4 + 144.8794648334962 + 25.763464171870126 + + + FIRE + FIRE_232@GraphGeneration.gov + FIRE_232 + 7 + 4 + 186.20142348683348 + 25.053136216827678 + + + FIRE + FIRE_235@GraphGeneration.gov + FIRE_235 + 7 + 4 + 154.31492422770648 + 28.537931276724265 + + + FIRE + FIRE_243@GraphGeneration.gov + FIRE_243 + 9 + 4 + 175.8777102319325 + 23.50094242829977 + + + FIRE + FIRE_307@GraphGeneration.gov + FIRE_307 + 11 + 4 + 29.54768907428347 + 31.419078662157116 + + + FIRE + FIRE_310@GraphGeneration.gov + FIRE_310 + 6 + 4 + 56.785341440961105 + 49.054112966342146 + + + FIRE + FIRE_312@GraphGeneration.gov + FIRE_312 + 9 + 4 + 56.91315537658031 + 36.60509977702916 + + + FIRE + FIRE_314@GraphGeneration.gov + FIRE_314 + 10 + 4 + 36.92620981503027 + 49.20420713335341 + + + FIRE + FIRE_316@GraphGeneration.gov + FIRE_316 + 11 + 4 + 16.861255193063386 + 41.83418282392941 + + + FIRE + FIRE_325@GraphGeneration.gov + FIRE_325 + 10 + 4 + 54.47555141786813 + 38.94629249880533 + + + FIRE + FIRE_334@GraphGeneration.gov + FIRE_334 + 11 + 4 + 27.318832979204537 + 50.71307839173744 + + + FIRE + FIRE_406@GraphGeneration.gov + FIRE_406 + 12 + 4 + 74.95068512056072 + 53.345151720823125 + + + FIRE + FIRE_417@GraphGeneration.gov + FIRE_417 + 9 + 4 + 97.63051259259748 + 39.09438515809721 + + + FIRE + FIRE_420@GraphGeneration.gov + FIRE_420 + 7 + 4 + 112.57917556263934 + 55.05910470285616 + + + FIRE + FIRE_426@GraphGeneration.gov + FIRE_426 + 11 + 4 + 72.89368287266299 + 43.220747431939216 + + + FIRE + FIRE_427@GraphGeneration.gov + FIRE_427 + 12 + 4 + 104.08269617142909 + 41.746500975734456 + + + FIRE + FIRE_428@GraphGeneration.gov + FIRE_428 + 6 + 4 + 130.4268660376489 + 52.979823194802194 + + + FIRE + FIRE_493@GraphGeneration.gov + FIRE_493 + 11 + 4 + 142.03349712954684 + 31.777436051178515 + + + FIRE + FIRE_496@GraphGeneration.gov + FIRE_496 + 10 + 4 + 153.082019061538 + 32.16231078182831 + + + FIRE + FIRE_502@GraphGeneration.gov + FIRE_502 + 8 + 4 + 196.11615071911797 + 53.73440897117875 + + + FIRE + FIRE_506@GraphGeneration.gov + FIRE_506 + 11 + 4 + 165.91456652321534 + 56.35096708575563 + + + FIRE + FIRE_508@GraphGeneration.gov + FIRE_508 + 12 + 4 + 140.91939942997348 + 30.471705722767854 + + + FIRE + FIRE_517@GraphGeneration.gov + FIRE_517 + 9 + 4 + 168.42399387933062 + 42.250584197709095 + + + FIRE + FIRE_520@GraphGeneration.gov + FIRE_520 + 9 + 4 + 153.18838063585713 + 35.758625872491955 + + + FIRE + FIRE_586@GraphGeneration.gov + FIRE_586 + 9 + 4 + 34.51841286987225 + 66.72184815546896 + + + FIRE + FIRE_587@GraphGeneration.gov + FIRE_587 + 11 + 4 + 14.733120065526554 + 82.26849458869275 + + + FIRE + FIRE_588@GraphGeneration.gov + FIRE_588 + 7 + 4 + 59.02721935123622 + 84.22345306652036 + + + FIRE + FIRE_591@GraphGeneration.gov + FIRE_591 + 11 + 4 + 12.36023620209954 + 78.75015608211942 + + + FIRE + FIRE_593@GraphGeneration.gov + FIRE_593 + 8 + 4 + 14.683938442905788 + 85.30590011237534 + + + FIRE + FIRE_598@GraphGeneration.gov + FIRE_598 + 10 + 4 + 34.30175132193602 + 65.70861996388126 + + + FIRE + FIRE_599@GraphGeneration.gov + FIRE_599 + 10 + 4 + 8.74971106371083 + 61.60015550715388 + + + FIRE + FIRE_604@GraphGeneration.gov + FIRE_604 + 7 + 4 + 17.771313505709426 + 76.79723594244719 + + + FIRE + FIRE_605@GraphGeneration.gov + FIRE_605 + 12 + 4 + 48.459074814971316 + 75.29214243416345 + + + FIRE + FIRE_609@GraphGeneration.gov + FIRE_609 + 10 + 4 + 26.171169484109093 + 63.20631304206485 + + + FIRE + FIRE_610@GraphGeneration.gov + FIRE_610 + 12 + 4 + 38.428349457853436 + 71.33727032829734 + + + FIRE + FIRE_675@GraphGeneration.gov + FIRE_675 + 6 + 4 + 73.35404910839738 + 59.2577655696629 + + + FIRE + FIRE_682@GraphGeneration.gov + FIRE_682 + 11 + 4 + 93.51249409807744 + 69.18932770763297 + + + FIRE + FIRE_684@GraphGeneration.gov + FIRE_684 + 11 + 4 + 85.85955122083664 + 67.76246278866998 + + + FIRE + FIRE_690@GraphGeneration.gov + FIRE_690 + 10 + 4 + 127.33673296977145 + 74.80635329213771 + + + FIRE + FIRE_691@GraphGeneration.gov + FIRE_691 + 10 + 4 + 86.56800888933157 + 77.29461380525763 + + + FIRE + FIRE_692@GraphGeneration.gov + FIRE_692 + 8 + 4 + 79.95238247553225 + 63.97291159641252 + + + FIRE + FIRE_700@GraphGeneration.gov + FIRE_700 + 11 + 4 + 68.21339898378758 + 72.92101101002336 + + + FIRE + FIRE_777@GraphGeneration.gov + FIRE_777 + 9 + 4 + 144.32335965968247 + 79.1234258313943 + + + FIRE + FIRE_779@GraphGeneration.gov + FIRE_779 + 10 + 4 + 138.07216317049378 + 73.7613857280388 + + + FIRE + FIRE_780@GraphGeneration.gov + FIRE_780 + 8 + 4 + 150.8500435787376 + 65.49669327526176 + + + FIRE + FIRE_785@GraphGeneration.gov + FIRE_785 + 10 + 4 + 180.88626472936502 + 59.5531895476496 + + + FIRE + FIRE_786@GraphGeneration.gov + FIRE_786 + 12 + 4 + 181.07678990227413 + 60.566654432789285 + + + FIRE + FIRE_789@GraphGeneration.gov + FIRE_789 + 8 + 4 + 153.6259132308806 + 57.555439171792095 + + + FIRE + FIRE_790@GraphGeneration.gov + FIRE_790 + 12 + 4 + 158.04379932277152 + 62.061212910470935 + + + FIRE + FIRE_792@GraphGeneration.gov + FIRE_792 + 9 + 4 + 186.10032966901713 + 63.93587562461333 + + + FIRE + FIRE_795@GraphGeneration.gov + FIRE_795 + 10 + 4 + 158.12959091297563 + 66.00131475993592 + + + FIRE + FIRE_861@GraphGeneration.gov + FIRE_861 + 8 + 4 + 54.221929301643755 + 108.00261094248663 + + + FIRE + FIRE_865@GraphGeneration.gov + FIRE_865 + 10 + 4 + 56.56537988762875 + 87.20194237834248 + + + FIRE + FIRE_866@GraphGeneration.gov + FIRE_866 + 12 + 4 + 16.20089853211641 + 104.49810815331817 + + + FIRE + FIRE_868@GraphGeneration.gov + FIRE_868 + 12 + 4 + 31.210510125896672 + 98.29155469070714 + + + FIRE + FIRE_877@GraphGeneration.gov + FIRE_877 + 12 + 4 + 24.256519970534228 + 89.79711388740436 + + + FIRE + FIRE_884@GraphGeneration.gov + FIRE_884 + 10 + 4 + 47.499517389951635 + 94.06034885194913 + + + FIRE + FIRE_951@GraphGeneration.gov + FIRE_951 + 8 + 4 + 116.28573043865029 + 103.16905407163257 + + + FIRE + FIRE_953@GraphGeneration.gov + FIRE_953 + 11 + 4 + 70.69991828417247 + 97.35356828176887 + + + FIRE + FIRE_956@GraphGeneration.gov + FIRE_956 + 9 + 4 + 86.3170040653172 + 89.82713518041672 + + + FIRE + FIRE_957@GraphGeneration.gov + FIRE_957 + 6 + 4 + 132.24988176713327 + 97.80389255349479 + + + FIRE + FIRE_964@GraphGeneration.gov + FIRE_964 + 12 + 4 + 69.49025539673235 + 86.72967630121181 + + + FIRE + FIRE_973@GraphGeneration.gov + FIRE_973 + 12 + 4 + 75.6079539561635 + 109.18549987562326 + + + FIRE + FIRE_979@GraphGeneration.gov + FIRE_979 + 12 + 4 + 99.25034210203134 + 108.67846604252655 + + + FIRE + FIRE_1047@GraphGeneration.gov + FIRE_1047 + 9 + 4 + 198.80583416939658 + 99.58171473145428 + + + FIRE + FIRE_1048@GraphGeneration.gov + FIRE_1048 + 11 + 4 + 190.54022038060822 + 113.47273360645954 + + + FIRE + FIRE_1051@GraphGeneration.gov + FIRE_1051 + 11 + 4 + 158.64294198109272 + 99.23334069283919 + + + FIRE + FIRE_1056@GraphGeneration.gov + FIRE_1056 + 12 + 4 + 154.8832904289523 + 97.71084050276066 + + + FIRE + FIRE_1057@GraphGeneration.gov + FIRE_1057 + 8 + 4 + 143.8296434790895 + 108.48713535999178 + + + FIRE + FIRE_1070@GraphGeneration.gov + FIRE_1070 + 12 + 4 + 135.93810431099138 + 101.03668869153474 + + + FIRE + FIRE_1071@GraphGeneration.gov + FIRE_1071 + 11 + 4 + 136.22182151026436 + 105.64844037499932 + + + FIRE + FIRE_1137@GraphGeneration.gov + FIRE_1137 + 8 + 4 + 11.307526423023573 + 133.69659722298272 + + + FIRE + FIRE_1138@GraphGeneration.gov + FIRE_1138 + 6 + 4 + 14.82527995860652 + 140.56561594701424 + + + FIRE + FIRE_1145@GraphGeneration.gov + FIRE_1145 + 11 + 4 + 23.638146631040144 + 138.72145102557985 + + + FIRE + FIRE_1152@GraphGeneration.gov + FIRE_1152 + 9 + 4 + 61.085626549431176 + 132.8495168780405 + + + FIRE + FIRE_1158@GraphGeneration.gov + FIRE_1158 + 9 + 4 + 44.11342148321988 + 121.48371497444404 + + + FIRE + FIRE_1164@GraphGeneration.gov + FIRE_1164 + 11 + 4 + 50.689705523387644 + 135.49522398821784 + + + FIRE + FIRE_1228@GraphGeneration.gov + FIRE_1228 + 12 + 4 + 101.92276182537017 + 142.63855846027596 + + + FIRE + FIRE_1229@GraphGeneration.gov + FIRE_1229 + 8 + 4 + 122.79003220255753 + 117.10963622243818 + + + FIRE + FIRE_1230@GraphGeneration.gov + FIRE_1230 + 11 + 4 + 121.66168687710288 + 128.16411882610458 + + + FIRE + FIRE_1231@GraphGeneration.gov + FIRE_1231 + 8 + 4 + 122.64362590426023 + 140.39618032057368 + + + FIRE + FIRE_1236@GraphGeneration.gov + FIRE_1236 + 8 + 4 + 132.64418369479057 + 125.8542802012132 + + + FIRE + FIRE_1240@GraphGeneration.gov + FIRE_1240 + 6 + 4 + 90.01715768968029 + 132.23830437958017 + + + FIRE + FIRE_1241@GraphGeneration.gov + FIRE_1241 + 10 + 4 + 79.35522572302315 + 140.95254295983065 + + + FIRE + FIRE_1245@GraphGeneration.gov + FIRE_1245 + 8 + 4 + 67.30844496937773 + 117.45120041962615 + + + FIRE + FIRE_1247@GraphGeneration.gov + FIRE_1247 + 8 + 4 + 106.02046781775287 + 122.67724658166941 + + + FIRE + FIRE_1250@GraphGeneration.gov + FIRE_1250 + 6 + 4 + 72.46822105462991 + 120.79691477921035 + + + FIRE + FIRE_1255@GraphGeneration.gov + FIRE_1255 + 12 + 4 + 120.35273025326498 + 129.74209541193068 + + + FIRE + FIRE_1328@GraphGeneration.gov + FIRE_1328 + 7 + 4 + 177.05575433352516 + 124.98355515657879 + + + FIRE + FIRE_1330@GraphGeneration.gov + FIRE_1330 + 10 + 4 + 198.23995638496376 + 139.8680474579637 + + + FIRE + FIRE_1332@GraphGeneration.gov + FIRE_1332 + 10 + 4 + 175.1835953578094 + 123.86810093748925 + + + FIRE + FIRE_1335@GraphGeneration.gov + FIRE_1335 + 6 + 4 + 148.25908574468286 + 138.65523857922912 + + + FIRE + FIRE_1344@GraphGeneration.gov + FIRE_1344 + 8 + 4 + 199.66536603033006 + 136.68657184157178 + + + FIRE + FIRE_1345@GraphGeneration.gov + FIRE_1345 + 10 + 4 + 147.14867217635182 + 136.49296092354453 + + + FIRE + FIRE_1414@GraphGeneration.gov + FIRE_1414 + 9 + 4 + 1.1951308028675278 + 151.5544374641478 + + + FIRE + FIRE_1419@GraphGeneration.gov + FIRE_1419 + 10 + 4 + 22.452025015618933 + 151.82537574434784 + + + FIRE + FIRE_1422@GraphGeneration.gov + FIRE_1422 + 6 + 4 + 25.123291471299247 + 158.25827062995683 + + + FIRE + FIRE_1437@GraphGeneration.gov + FIRE_1437 + 9 + 4 + 46.33827199106282 + 154.53712582686052 + + + FIRE + FIRE_1508@GraphGeneration.gov + FIRE_1508 + 7 + 4 + 132.99999046020235 + 165.7068508692815 + + + FIRE + FIRE_1510@GraphGeneration.gov + FIRE_1510 + 11 + 4 + 67.3509572589103 + 163.2153719396738 + + + FIRE + FIRE_1513@GraphGeneration.gov + FIRE_1513 + 12 + 4 + 103.379534953276 + 169.33384368156788 + + + FIRE + FIRE_1516@GraphGeneration.gov + FIRE_1516 + 7 + 4 + 73.05356962187886 + 156.88308248545925 + + + FIRE + FIRE_1524@GraphGeneration.gov + FIRE_1524 + 11 + 4 + 125.34646435136844 + 153.13331378444678 + + + FIRE + FIRE_1605@GraphGeneration.gov + FIRE_1605 + 7 + 4 + 136.22050508147333 + 166.633881914367 + + + FIRE + FIRE_1608@GraphGeneration.gov + FIRE_1608 + 10 + 4 + 186.32932761150843 + 146.07142894738672 + + + FIRE + FIRE_1617@GraphGeneration.gov + FIRE_1617 + 9 + 4 + 182.17232159514504 + 148.50924876837897 + + + FIRE + FIRE_1687@GraphGeneration.gov + FIRE_1687 + 11 + 4 + 62.06831828656365 + 173.64580883198747 + + + FIRE + FIRE_1689@GraphGeneration.gov + FIRE_1689 + 9 + 4 + 42.66928152311478 + 193.15487230344382 + + + FIRE + FIRE_1694@GraphGeneration.gov + FIRE_1694 + 12 + 4 + 66.37314672214534 + 181.51027264544862 + + + FIRE + FIRE_1695@GraphGeneration.gov + FIRE_1695 + 12 + 4 + 61.74492519617573 + 177.70969087490977 + + + FIRE + FIRE_1699@GraphGeneration.gov + FIRE_1699 + 11 + 4 + 52.602066842702136 + 180.86784384781396 + + + FIRE + FIRE_1711@GraphGeneration.gov + FIRE_1711 + 11 + 4 + 16.564135944854833 + 179.39626167748963 + + + FIRE + FIRE_1713@GraphGeneration.gov + FIRE_1713 + 10 + 4 + 37.29222540988041 + 172.79990604677437 + + + FIRE + FIRE_1716@GraphGeneration.gov + FIRE_1716 + 11 + 4 + 0.3947755885482426 + 180.2489970388754 + + + FIRE + FIRE_1779@GraphGeneration.gov + FIRE_1779 + 9 + 4 + 86.90057566503052 + 186.07947234675234 + + + FIRE + FIRE_1781@GraphGeneration.gov + FIRE_1781 + 12 + 4 + 100.61794594104346 + 180.0050501795499 + + + FIRE + FIRE_1783@GraphGeneration.gov + FIRE_1783 + 6 + 4 + 104.33849286226716 + 192.16609169571595 + + + FIRE + FIRE_1788@GraphGeneration.gov + FIRE_1788 + 10 + 4 + 132.61066968431027 + 173.29094313784756 + + + FIRE + FIRE_1789@GraphGeneration.gov + FIRE_1789 + 8 + 4 + 97.66699452207816 + 196.46594529548756 + + + FIRE + FIRE_1790@GraphGeneration.gov + FIRE_1790 + 11 + 4 + 88.22819026114014 + 193.99414637026476 + + + FIRE + FIRE_1793@GraphGeneration.gov + FIRE_1793 + 6 + 4 + 102.24917361847233 + 192.86358243257695 + + + FIRE + FIRE_1795@GraphGeneration.gov + FIRE_1795 + 10 + 4 + 67.8356716754772 + 185.13768773466902 + + + FIRE + FIRE_1800@GraphGeneration.gov + FIRE_1800 + 7 + 4 + 74.19959452898131 + 188.11652131391853 + + + FIRE + FIRE_1872@GraphGeneration.gov + FIRE_1872 + 8 + 4 + 167.69961027216027 + 176.04396928588523 + + + FIRE + FIRE_1878@GraphGeneration.gov + FIRE_1878 + 7 + 4 + 159.65632592638505 + 199.4855944295336 + + + FIRE + FIRE_1885@GraphGeneration.gov + FIRE_1885 + 10 + 4 + 168.28271204024318 + 190.59191075397726 + + + FIRE + FIRE_1890@GraphGeneration.gov + FIRE_1890 + 9 + 4 + 152.69179485719667 + 184.0601135037577 + + + FIRE + FIRE_1892@GraphGeneration.gov + FIRE_1892 + 12 + 4 + 170.30873501066236 + 179.2304033833393 + + + FIRE + FIRE_1893@GraphGeneration.gov + FIRE_1893 + 10 + 4 + 137.79076068198762 + 182.82015108799476 + + + FIRE + FIRE_1898@GraphGeneration.gov + FIRE_1898 + 7 + 4 + 190.47419124691535 + 182.68024838145203 + + + LAW + LAW_66@GraphGeneration.gov + LAW_66 + 10 + 4 + 63.42048895676847 + 24.245021855164037 + + + LAW + LAW_68@GraphGeneration.gov + LAW_68 + 11 + 4 + 59.239158420503834 + 6.166557880356265 + + + LAW + LAW_70@GraphGeneration.gov + LAW_70 + 11 + 4 + 35.40197143583299 + 26.21333008034249 + + + LAW + LAW_75@GraphGeneration.gov + LAW_75 + 11 + 4 + 48.96934233276657 + 23.476727482934642 + + + LAW + LAW_77@GraphGeneration.gov + LAW_77 + 6 + 4 + 22.724044316955993 + 4.280504890600831 + + + LAW + LAW_83@GraphGeneration.gov + LAW_83 + 7 + 4 + 16.16271102687004 + 0.9989387110420633 + + + LAW + LAW_86@GraphGeneration.gov + LAW_86 + 12 + 4 + 5.172746657948927 + 6.261769014994877 + + + LAW + LAW_157@GraphGeneration.gov + LAW_157 + 11 + 4 + 108.11765627623285 + 8.157781466497434 + + + LAW + LAW_166@GraphGeneration.gov + LAW_166 + 6 + 4 + 97.5085764966101 + 1.5397444761907473 + + + LAW + LAW_171@GraphGeneration.gov + LAW_171 + 12 + 4 + 87.00907884673197 + 17.253137681951817 + + + LAW + LAW_175@GraphGeneration.gov + LAW_175 + 6 + 4 + 91.52962030737172 + 6.251896644016419 + + + LAW + LAW_181@GraphGeneration.gov + LAW_181 + 8 + 4 + 73.70147614306195 + 1.8568164597517598 + + + LAW + LAW_182@GraphGeneration.gov + LAW_182 + 6 + 4 + 73.18052020035323 + 25.446458356041667 + + + LAW + LAW_245@GraphGeneration.gov + LAW_245 + 11 + 4 + 184.24122944754868 + 1.6898867102948412 + + + LAW + LAW_251@GraphGeneration.gov + LAW_251 + 11 + 4 + 174.5349527178175 + 3.541015092436999 + + + LAW + LAW_258@GraphGeneration.gov + LAW_258 + 7 + 4 + 180.9128070230489 + 3.720141314217724 + + + LAW + LAW_263@GraphGeneration.gov + LAW_263 + 7 + 4 + 168.68092968004206 + 16.21162896295414 + + + LAW + LAW_267@GraphGeneration.gov + LAW_267 + 11 + 4 + 137.4026741335526 + 2.9717578086010104 + + + LAW + LAW_272@GraphGeneration.gov + LAW_272 + 9 + 4 + 199.08695800931832 + 24.08753824799598 + + + LAW + LAW_337@GraphGeneration.gov + LAW_337 + 12 + 4 + 11.535790114738525 + 52.77013380900394 + + + LAW + LAW_341@GraphGeneration.gov + LAW_341 + 8 + 4 + 4.222646601953572 + 34.06531693770061 + + + LAW + LAW_346@GraphGeneration.gov + LAW_346 + 12 + 4 + 11.542857704635228 + 43.990280252906985 + + + LAW + LAW_347@GraphGeneration.gov + LAW_347 + 10 + 4 + 47.9547319747305 + 51.235099535753974 + + + LAW + LAW_349@GraphGeneration.gov + LAW_349 + 7 + 4 + 35.884236199619444 + 52.13520056242386 + + + LAW + LAW_354@GraphGeneration.gov + LAW_354 + 6 + 4 + 56.990269034630764 + 29.108986778371516 + + + LAW + LAW_356@GraphGeneration.gov + LAW_356 + 9 + 4 + 64.17244697269035 + 39.731380335945275 + + + LAW + LAW_358@GraphGeneration.gov + LAW_358 + 12 + 4 + 29.708989993718124 + 56.414846368276585 + + + LAW + LAW_429@GraphGeneration.gov + LAW_429 + 12 + 4 + 84.71793482248 + 42.83487723082321 + + + LAW + LAW_431@GraphGeneration.gov + LAW_431 + 8 + 4 + 121.58398021512647 + 49.272330806741785 + + + LAW + LAW_432@GraphGeneration.gov + LAW_432 + 6 + 4 + 94.46033235132964 + 45.72706861164842 + + + LAW + LAW_436@GraphGeneration.gov + LAW_436 + 12 + 4 + 68.37913917024348 + 42.59451470786652 + + + LAW + LAW_439@GraphGeneration.gov + LAW_439 + 9 + 4 + 83.7038525092343 + 30.52748639080075 + + + LAW + LAW_443@GraphGeneration.gov + LAW_443 + 7 + 4 + 78.98372773566652 + 47.56544786119416 + + + LAW + LAW_451@GraphGeneration.gov + LAW_451 + 10 + 4 + 96.73736539911722 + 31.2152474339838 + + + LAW + LAW_452@GraphGeneration.gov + LAW_452 + 9 + 4 + 131.30840591943144 + 29.18165858496081 + + + LAW + LAW_523@GraphGeneration.gov + LAW_523 + 10 + 4 + 185.66587058702356 + 46.29000658143987 + + + LAW + LAW_525@GraphGeneration.gov + LAW_525 + 11 + 4 + 166.39629773128433 + 50.55848740156436 + + + LAW + LAW_532@GraphGeneration.gov + LAW_532 + 7 + 4 + 134.5950841371236 + 34.30335524924456 + + + LAW + LAW_535@GraphGeneration.gov + LAW_535 + 12 + 4 + 154.22044996311377 + 45.14400285059752 + + + LAW + LAW_538@GraphGeneration.gov + LAW_538 + 10 + 4 + 141.89699105251117 + 39.13492449934068 + + + LAW + LAW_547@GraphGeneration.gov + LAW_547 + 12 + 4 + 192.17399971951397 + 35.32157966968206 + + + LAW + LAW_548@GraphGeneration.gov + LAW_548 + 9 + 4 + 197.75537870990286 + 53.069026333587146 + + + LAW + LAW_632@GraphGeneration.gov + LAW_632 + 9 + 4 + 14.704066765743807 + 73.98645095855372 + + + LAW + LAW_635@GraphGeneration.gov + LAW_635 + 12 + 4 + 53.15162288877539 + 79.3938924746252 + + + LAW + LAW_640@GraphGeneration.gov + LAW_640 + 8 + 4 + 63.33628784289463 + 79.72607640121235 + + + LAW + LAW_706@GraphGeneration.gov + LAW_706 + 10 + 4 + 72.66442849911955 + 62.227526587300375 + + + LAW + LAW_715@GraphGeneration.gov + LAW_715 + 12 + 4 + 94.84726270445668 + 62.983006681904484 + + + LAW + LAW_716@GraphGeneration.gov + LAW_716 + 7 + 4 + 98.94289102151541 + 75.78082553550601 + + + LAW + LAW_718@GraphGeneration.gov + LAW_718 + 12 + 4 + 106.77221230432309 + 63.49412541709651 + + + LAW + LAW_719@GraphGeneration.gov + LAW_719 + 11 + 4 + 94.83941575571744 + 60.821812956556734 + + + LAW + LAW_720@GraphGeneration.gov + LAW_720 + 10 + 4 + 117.32337419561239 + 74.15800828944579 + + + LAW + LAW_724@GraphGeneration.gov + LAW_724 + 11 + 4 + 85.08408284987226 + 78.39380277074066 + + + LAW + LAW_725@GraphGeneration.gov + LAW_725 + 10 + 4 + 116.13647230818687 + 73.49689364802569 + + + LAW + LAW_728@GraphGeneration.gov + LAW_728 + 12 + 4 + 126.28710091682808 + 84.57294369376224 + + + LAW + LAW_734@GraphGeneration.gov + LAW_734 + 6 + 4 + 120.34126685456073 + 57.52351463656875 + + + LAW + LAW_797@GraphGeneration.gov + LAW_797 + 6 + 4 + 194.37315736605856 + 58.973281466837896 + + + LAW + LAW_810@GraphGeneration.gov + LAW_810 + 11 + 4 + 172.06795253400384 + 73.41919458802376 + + + LAW + LAW_817@GraphGeneration.gov + LAW_817 + 10 + 4 + 133.88320303723276 + 69.97162944823975 + + + LAW + LAW_823@GraphGeneration.gov + LAW_823 + 8 + 4 + 190.40048258636745 + 69.23063582849419 + + + LAW + LAW_825@GraphGeneration.gov + LAW_825 + 11 + 4 + 138.58695820862764 + 63.425843108594535 + + + LAW + LAW_892@GraphGeneration.gov + LAW_892 + 9 + 4 + 3.8050363954196107 + 105.41583301498747 + + + LAW + LAW_897@GraphGeneration.gov + LAW_897 + 11 + 4 + 28.792659186144437 + 101.97188341391015 + + + LAW + LAW_901@GraphGeneration.gov + LAW_901 + 11 + 4 + 39.92899914714616 + 108.13336428417857 + + + LAW + LAW_903@GraphGeneration.gov + LAW_903 + 12 + 4 + 8.844491697977341 + 103.32586587522968 + + + LAW + LAW_905@GraphGeneration.gov + LAW_905 + 11 + 4 + 4.242286062427944 + 95.79744521642553 + + + LAW + LAW_907@GraphGeneration.gov + LAW_907 + 12 + 4 + 40.26824001585289 + 95.75268891857432 + + + LAW + LAW_915@GraphGeneration.gov + LAW_915 + 7 + 4 + 61.35582493868902 + 97.49279894037022 + + + LAW + LAW_917@GraphGeneration.gov + LAW_917 + 7 + 4 + 38.987537814686114 + 113.32503619989595 + + + LAW + LAW_981@GraphGeneration.gov + LAW_981 + 11 + 4 + 110.22397209795936 + 111.1286343381777 + + + LAW + LAW_989@GraphGeneration.gov + LAW_989 + 6 + 4 + 83.25677903750633 + 104.72894673674189 + + + LAW + LAW_991@GraphGeneration.gov + LAW_991 + 12 + 4 + 107.02743459484317 + 88.92702614741327 + + + LAW + LAW_992@GraphGeneration.gov + LAW_992 + 11 + 4 + 106.57806208272369 + 88.81888797937881 + + + LAW + LAW_1009@GraphGeneration.gov + LAW_1009 + 6 + 4 + 69.91982306677772 + 104.42070409430113 + + + LAW + LAW_1010@GraphGeneration.gov + LAW_1010 + 9 + 4 + 122.85824901915477 + 96.66697384680654 + + + LAW + LAW_1077@GraphGeneration.gov + LAW_1077 + 12 + 4 + 186.46218530311504 + 109.42589330972777 + + + LAW + LAW_1082@GraphGeneration.gov + LAW_1082 + 7 + 4 + 148.50568207990705 + 98.97194135909866 + + + LAW + LAW_1085@GraphGeneration.gov + LAW_1085 + 11 + 4 + 136.5762222103513 + 111.62716222852154 + + + LAW + LAW_1092@GraphGeneration.gov + LAW_1092 + 7 + 4 + 172.94128622803478 + 95.90967109757501 + + + LAW + LAW_1093@GraphGeneration.gov + LAW_1093 + 6 + 4 + 194.1223013412635 + 103.39158210502868 + + + LAW + LAW_1172@GraphGeneration.gov + LAW_1172 + 10 + 4 + 35.90540902269552 + 129.65628867032532 + + + LAW + LAW_1174@GraphGeneration.gov + LAW_1174 + 11 + 4 + 2.816934988338571 + 125.93108259215286 + + + LAW + LAW_1177@GraphGeneration.gov + LAW_1177 + 9 + 4 + 47.85827976297634 + 132.46184126217872 + + + LAW + LAW_1182@GraphGeneration.gov + LAW_1182 + 9 + 4 + 30.65965630021528 + 125.0034039858106 + + + LAW + LAW_1184@GraphGeneration.gov + LAW_1184 + 10 + 4 + 0.24356241276023058 + 141.18566397951784 + + + LAW + LAW_1187@GraphGeneration.gov + LAW_1187 + 9 + 4 + 25.45351075593728 + 134.35460072550367 + + + LAW + LAW_1191@GraphGeneration.gov + LAW_1191 + 10 + 4 + 31.899504073471814 + 134.79505368971445 + + + LAW + LAW_1259@GraphGeneration.gov + LAW_1259 + 12 + 4 + 106.24299157453046 + 129.25725788372105 + + + LAW + LAW_1260@GraphGeneration.gov + LAW_1260 + 10 + 4 + 104.08869196334811 + 142.12652357916903 + + + LAW + LAW_1264@GraphGeneration.gov + LAW_1264 + 9 + 4 + 99.68308387350976 + 135.64153899232227 + + + LAW + LAW_1271@GraphGeneration.gov + LAW_1271 + 6 + 4 + 131.99556893104497 + 138.12024913163907 + + + LAW + LAW_1286@GraphGeneration.gov + LAW_1286 + 10 + 4 + 84.83603738606048 + 119.53466154436816 + + + LAW + LAW_1349@GraphGeneration.gov + LAW_1349 + 7 + 4 + 183.84299802759978 + 138.7553299405073 + + + LAW + LAW_1351@GraphGeneration.gov + LAW_1351 + 9 + 4 + 168.50376927020488 + 128.42819510458378 + + + LAW + LAW_1355@GraphGeneration.gov + LAW_1355 + 7 + 4 + 163.25143136840742 + 124.00791147454912 + + + LAW + LAW_1364@GraphGeneration.gov + LAW_1364 + 9 + 4 + 179.0302099668044 + 139.38984600984043 + + + LAW + LAW_1366@GraphGeneration.gov + LAW_1366 + 8 + 4 + 134.11821902701857 + 118.67831015357127 + + + LAW + LAW_1370@GraphGeneration.gov + LAW_1370 + 8 + 4 + 150.6127558643724 + 117.2240106850402 + + + LAW + LAW_1373@GraphGeneration.gov + LAW_1373 + 10 + 4 + 155.6818749212738 + 116.37949861080722 + + + LAW + LAW_1374@GraphGeneration.gov + LAW_1374 + 11 + 4 + 141.516776767036 + 138.326350619266 + + + LAW + LAW_1375@GraphGeneration.gov + LAW_1375 + 12 + 4 + 186.08113509119414 + 123.97708019180509 + + + LAW + LAW_1441@GraphGeneration.gov + LAW_1441 + 11 + 4 + 1.43463511129438 + 168.7070477839887 + + + LAW + LAW_1442@GraphGeneration.gov + LAW_1442 + 8 + 4 + 34.61750625259352 + 151.9009243519754 + + + LAW + LAW_1449@GraphGeneration.gov + LAW_1449 + 8 + 4 + 10.611985578985225 + 171.07741083136003 + + + LAW + LAW_1453@GraphGeneration.gov + LAW_1453 + 6 + 4 + 33.41218084283697 + 165.68591909151286 + + + LAW + LAW_1458@GraphGeneration.gov + LAW_1458 + 8 + 4 + 32.51451662034408 + 156.64649366500686 + + + LAW + LAW_1460@GraphGeneration.gov + LAW_1460 + 7 + 4 + 24.421171821628235 + 156.48555946207054 + + + LAW + LAW_1461@GraphGeneration.gov + LAW_1461 + 6 + 4 + 61.15178504451394 + 161.45254588915174 + + + LAW + LAW_1464@GraphGeneration.gov + LAW_1464 + 11 + 4 + 47.44086213540436 + 166.02248791571267 + + + LAW + LAW_1466@GraphGeneration.gov + LAW_1466 + 11 + 4 + 65.25394984188102 + 167.36114332530713 + + + LAW + LAW_1536@GraphGeneration.gov + LAW_1536 + 11 + 4 + 90.26714847099595 + 163.2094379193536 + + + LAW + LAW_1537@GraphGeneration.gov + LAW_1537 + 7 + 4 + 68.95446614326374 + 159.21274073403652 + + + LAW + LAW_1541@GraphGeneration.gov + LAW_1541 + 11 + 4 + 82.52069106332308 + 168.8625519073996 + + + LAW + LAW_1557@GraphGeneration.gov + LAW_1557 + 9 + 4 + 88.9846319947169 + 163.00658712156942 + + + LAW + LAW_1559@GraphGeneration.gov + LAW_1559 + 7 + 4 + 92.12356005733011 + 147.73160926078802 + + + LAW + LAW_1627@GraphGeneration.gov + LAW_1627 + 9 + 4 + 138.50866569423496 + 151.35792994171914 + + + LAW + LAW_1632@GraphGeneration.gov + LAW_1632 + 8 + 4 + 185.63434185058733 + 162.77064593057707 + + + LAW + LAW_1635@GraphGeneration.gov + LAW_1635 + 11 + 4 + 145.36535719792403 + 144.8953545539802 + + + LAW + LAW_1638@GraphGeneration.gov + LAW_1638 + 9 + 4 + 196.63285658561114 + 165.83845287481546 + + + LAW + LAW_1643@GraphGeneration.gov + LAW_1643 + 10 + 4 + 185.8461409239581 + 157.58905207658464 + + + LAW + LAW_1645@GraphGeneration.gov + LAW_1645 + 12 + 4 + 183.07086261596976 + 166.75734786935107 + + + LAW + LAW_1646@GraphGeneration.gov + LAW_1646 + 6 + 4 + 181.39075150651354 + 170.16696340587677 + + + LAW + LAW_1651@GraphGeneration.gov + LAW_1651 + 12 + 4 + 167.9663661637464 + 150.86348737530773 + + + LAW + LAW_1652@GraphGeneration.gov + LAW_1652 + 7 + 4 + 153.86082750120764 + 169.32381206199474 + + + LAW + LAW_1654@GraphGeneration.gov + LAW_1654 + 11 + 4 + 198.88084152375723 + 149.64361873417076 + + + LAW + LAW_1721@GraphGeneration.gov + LAW_1721 + 9 + 4 + 43.239542033992294 + 188.29822043464122 + + + LAW + LAW_1722@GraphGeneration.gov + LAW_1722 + 6 + 4 + 22.578916463603196 + 180.11048397593436 + + + LAW + LAW_1723@GraphGeneration.gov + LAW_1723 + 9 + 4 + 2.847101195204986 + 173.14711399522432 + + + LAW + LAW_1730@GraphGeneration.gov + LAW_1730 + 9 + 4 + 1.7225553582797797 + 199.89110618272522 + + + LAW + LAW_1738@GraphGeneration.gov + LAW_1738 + 7 + 4 + 34.582477398813346 + 184.79331202893715 + + + LAW + LAW_1739@GraphGeneration.gov + LAW_1739 + 11 + 4 + 2.0106683871331743 + 180.13887880381174 + + + LAW + LAW_1745@GraphGeneration.gov + LAW_1745 + 11 + 4 + 32.44239311890069 + 191.64375210817255 + + + LAW + LAW_1746@GraphGeneration.gov + LAW_1746 + 10 + 4 + 66.40848326889828 + 195.25419018036962 + + + LAW + LAW_1809@GraphGeneration.gov + LAW_1809 + 6 + 4 + 104.93818453172513 + 189.5945772062259 + + + LAW + LAW_1813@GraphGeneration.gov + LAW_1813 + 7 + 4 + 99.75653856997056 + 198.4667193924899 + + + LAW + LAW_1819@GraphGeneration.gov + LAW_1819 + 8 + 4 + 126.22787356673632 + 191.6663162602999 + + + LAW + LAW_1820@GraphGeneration.gov + LAW_1820 + 11 + 4 + 67.86298231018579 + 193.14453030711297 + + + LAW + LAW_1823@GraphGeneration.gov + LAW_1823 + 8 + 4 + 67.21799369142262 + 196.57198122593263 + + + LAW + LAW_1826@GraphGeneration.gov + LAW_1826 + 8 + 4 + 99.6793927076608 + 176.58890981020147 + + + LAW + LAW_1827@GraphGeneration.gov + LAW_1827 + 10 + 4 + 68.13021165270425 + 178.268488200545 + + + LAW + LAW_1828@GraphGeneration.gov + LAW_1828 + 7 + 4 + 101.51407669743887 + 179.66377398360223 + + + LAW + LAW_1829@GraphGeneration.gov + LAW_1829 + 10 + 4 + 99.55688660157418 + 182.47307130430667 + + + LAW + LAW_1831@GraphGeneration.gov + LAW_1831 + 10 + 4 + 78.03694647880327 + 197.97417764158462 + + + LAW + LAW_1832@GraphGeneration.gov + LAW_1832 + 7 + 4 + 118.49819363795467 + 193.22921887249046 + + + LAW + LAW_1835@GraphGeneration.gov + LAW_1835 + 8 + 4 + 121.98353767329849 + 185.40577207818694 + + + LAW + LAW_1838@GraphGeneration.gov + LAW_1838 + 7 + 4 + 76.47448333763667 + 196.5228578324979 + + + LAW + LAW_1903@GraphGeneration.gov + LAW_1903 + 10 + 4 + 192.78474768547716 + 177.07777188534197 + + + LAW + LAW_1905@GraphGeneration.gov + LAW_1905 + 7 + 4 + 189.47422632623267 + 176.24966644353592 + + + LAW + LAW_1917@GraphGeneration.gov + LAW_1917 + 9 + 4 + 176.8147933601147 + 172.32252860895255 + + + LAW + LAW_1921@GraphGeneration.gov + LAW_1921 + 9 + 4 + 171.9273541019585 + 198.58680431387754 + + + EMS + EMS_4@GraphGeneration.gov + EMS_4 + 8 + 5 + 37.92350037100433 + 23.215327632051313 + + + EMS + EMS_5@GraphGeneration.gov + EMS_5 + 7 + 5 + 55.39546587909761 + 0.13755689889921438 + + + EMS + EMS_8@GraphGeneration.gov + EMS_8 + 12 + 5 + 10.935683137372447 + 25.285999400055573 + + + EMS + EMS_14@GraphGeneration.gov + EMS_14 + 12 + 5 + 29.220319266856112 + 20.300040066495633 + + + EMS + EMS_15@GraphGeneration.gov + EMS_15 + 6 + 5 + 44.71807860892047 + 24.50992265667276 + + + EMS + EMS_19@GraphGeneration.gov + EMS_19 + 7 + 5 + 29.346250001141893 + 20.619808701543334 + + + EMS + EMS_28@GraphGeneration.gov + EMS_28 + 9 + 5 + 7.795179982943383 + 2.8147290015144586 + + + EMS + EMS_29@GraphGeneration.gov + EMS_29 + 6 + 5 + 42.940960265362456 + 3.1988517638879603 + + + EMS + EMS_100@GraphGeneration.gov + EMS_100 + 11 + 5 + 77.91806607422646 + 15.206599426321903 + + + EMS + EMS_102@GraphGeneration.gov + EMS_102 + 11 + 5 + 113.99293301996997 + 8.841218242375925 + + + EMS + EMS_104@GraphGeneration.gov + EMS_104 + 9 + 5 + 117.36635419068955 + 21.815628824494183 + + + EMS + EMS_105@GraphGeneration.gov + EMS_105 + 11 + 5 + 129.6763273046301 + 19.855587848098484 + + + EMS + EMS_108@GraphGeneration.gov + EMS_108 + 7 + 5 + 113.42107240634978 + 23.6356817159565 + + + EMS + EMS_109@GraphGeneration.gov + EMS_109 + 7 + 5 + 131.355485470602 + 4.371265502227534 + + + EMS + EMS_112@GraphGeneration.gov + EMS_112 + 12 + 5 + 89.97119310299558 + 8.556594191367026 + + + EMS + EMS_114@GraphGeneration.gov + EMS_114 + 8 + 5 + 105.0393213943286 + 25.238400106894005 + + + EMS + EMS_185@GraphGeneration.gov + EMS_185 + 9 + 5 + 186.47204194818943 + 9.804143865341898 + + + EMS + EMS_187@GraphGeneration.gov + EMS_187 + 6 + 5 + 173.65397563935835 + 25.886024856660068 + + + EMS + EMS_199@GraphGeneration.gov + EMS_199 + 10 + 5 + 139.670501985242 + 21.859152882112568 + + + EMS + EMS_207@GraphGeneration.gov + EMS_207 + 8 + 5 + 182.84638948831287 + 27.862208126990808 + + + EMS + EMS_212@GraphGeneration.gov + EMS_212 + 11 + 5 + 161.52710366668234 + 2.167688096526074 + + + EMS + EMS_213@GraphGeneration.gov + EMS_213 + 11 + 5 + 175.0577195089974 + 9.010508264508488 + + + EMS + EMS_278@GraphGeneration.gov + EMS_278 + 9 + 5 + 41.80959947548156 + 49.47520092334647 + + + EMS + EMS_280@GraphGeneration.gov + EMS_280 + 8 + 5 + 53.52949173527739 + 50.16371611241077 + + + EMS + EMS_281@GraphGeneration.gov + EMS_281 + 6 + 5 + 43.99908207964909 + 34.28781848622826 + + + EMS + EMS_287@GraphGeneration.gov + EMS_287 + 6 + 5 + 52.153228343521036 + 54.79769657336733 + + + EMS + EMS_291@GraphGeneration.gov + EMS_291 + 6 + 5 + 5.248530291735487 + 39.651058692721676 + + + EMS + EMS_293@GraphGeneration.gov + EMS_293 + 8 + 5 + 2.6953364243951006 + 38.070290654468934 + + + EMS + EMS_303@GraphGeneration.gov + EMS_303 + 7 + 5 + 22.671922761824728 + 47.95549331708334 + + + EMS + EMS_304@GraphGeneration.gov + EMS_304 + 9 + 5 + 16.60388883555865 + 35.95141763579733 + + + EMS + EMS_305@GraphGeneration.gov + EMS_305 + 10 + 5 + 53.99095277907012 + 28.83866525564532 + + + EMS + EMS_370@GraphGeneration.gov + EMS_370 + 6 + 5 + 82.62503763663871 + 41.29192764679415 + + + EMS + EMS_388@GraphGeneration.gov + EMS_388 + 10 + 5 + 106.59299570473951 + 37.56290648644228 + + + EMS + EMS_390@GraphGeneration.gov + EMS_390 + 7 + 5 + 112.86755458627198 + 48.08479476996159 + + + EMS + EMS_391@GraphGeneration.gov + EMS_391 + 9 + 5 + 81.07637599767216 + 28.82156417261308 + + + EMS + EMS_395@GraphGeneration.gov + EMS_395 + 7 + 5 + 123.89517462257658 + 38.63809535934438 + + + EMS + EMS_463@GraphGeneration.gov + EMS_463 + 11 + 5 + 180.98353190589205 + 42.58523216879868 + + + EMS + EMS_467@GraphGeneration.gov + EMS_467 + 9 + 5 + 148.50047234394765 + 48.98176655595241 + + + EMS + EMS_471@GraphGeneration.gov + EMS_471 + 7 + 5 + 139.6597178442132 + 49.952211004084816 + + + EMS + EMS_472@GraphGeneration.gov + EMS_472 + 10 + 5 + 140.99529222020166 + 34.15732354256314 + + + EMS + EMS_473@GraphGeneration.gov + EMS_473 + 9 + 5 + 164.3719605054992 + 42.96304512012843 + + + EMS + EMS_474@GraphGeneration.gov + EMS_474 + 6 + 5 + 159.38863795572107 + 40.54334477444894 + + + EMS + EMS_482@GraphGeneration.gov + EMS_482 + 6 + 5 + 140.69659039236188 + 37.65978873940715 + + + EMS + EMS_574@GraphGeneration.gov + EMS_574 + 11 + 5 + 24.92790442186482 + 69.5358368178317 + + + EMS + EMS_579@GraphGeneration.gov + EMS_579 + 11 + 5 + 13.70960049313351 + 79.83183108379002 + + + EMS + EMS_581@GraphGeneration.gov + EMS_581 + 11 + 5 + 30.13110319694395 + 67.05817468613951 + + + EMS + EMS_582@GraphGeneration.gov + EMS_582 + 7 + 5 + 0.21072603985530977 + 70.10913653630422 + + + EMS + EMS_647@GraphGeneration.gov + EMS_647 + 8 + 5 + 120.54968358028617 + 73.2977585578829 + + + EMS + EMS_661@GraphGeneration.gov + EMS_661 + 7 + 5 + 99.9266045696777 + 58.75541634138498 + + + EMS + EMS_665@GraphGeneration.gov + EMS_665 + 11 + 5 + 122.73430854667698 + 59.18219206603793 + + + EMS + EMS_669@GraphGeneration.gov + EMS_669 + 11 + 5 + 115.36235077031976 + 74.49647747272566 + + + EMS + EMS_670@GraphGeneration.gov + EMS_670 + 12 + 5 + 70.82207369086258 + 78.84657562735998 + + + EMS + EMS_671@GraphGeneration.gov + EMS_671 + 7 + 5 + 104.18739070427655 + 82.48499205692103 + + + EMS + EMS_673@GraphGeneration.gov + EMS_673 + 12 + 5 + 88.88059150372801 + 73.53327316539298 + + + EMS + EMS_674@GraphGeneration.gov + EMS_674 + 8 + 5 + 123.24274566630808 + 84.1821610113357 + + + EMS + EMS_737@GraphGeneration.gov + EMS_737 + 12 + 5 + 164.56457981617544 + 76.02905625991059 + + + EMS + EMS_738@GraphGeneration.gov + EMS_738 + 7 + 5 + 188.0436605158725 + 77.46963451929275 + + + EMS + EMS_739@GraphGeneration.gov + EMS_739 + 10 + 5 + 139.07661208313897 + 71.29937391905746 + + + EMS + EMS_742@GraphGeneration.gov + EMS_742 + 11 + 5 + 156.17243154392335 + 73.56827094854002 + + + EMS + EMS_748@GraphGeneration.gov + EMS_748 + 9 + 5 + 177.31554660839936 + 61.649136703889646 + + + EMS + EMS_752@GraphGeneration.gov + EMS_752 + 12 + 5 + 184.080481453756 + 67.11217806068811 + + + EMS + EMS_755@GraphGeneration.gov + EMS_755 + 8 + 5 + 145.59150923247367 + 62.44187071844398 + + + EMS + EMS_758@GraphGeneration.gov + EMS_758 + 9 + 5 + 177.0485021651409 + 71.72794606032728 + + + EMS + EMS_759@GraphGeneration.gov + EMS_759 + 11 + 5 + 195.32709588226393 + 72.97022173423647 + + + EMS + EMS_761@GraphGeneration.gov + EMS_761 + 10 + 5 + 151.72986918029727 + 60.81318170135079 + + + EMS + EMS_762@GraphGeneration.gov + EMS_762 + 9 + 5 + 193.31822429918603 + 74.42459144706024 + + + EMS + EMS_831@GraphGeneration.gov + EMS_831 + 6 + 5 + 9.008834684681855 + 89.25812219914442 + + + EMS + EMS_832@GraphGeneration.gov + EMS_832 + 8 + 5 + 25.734341359908555 + 113.14339598547406 + + + EMS + EMS_833@GraphGeneration.gov + EMS_833 + 11 + 5 + 14.775122828347433 + 107.59495611074365 + + + EMS + EMS_836@GraphGeneration.gov + EMS_836 + 6 + 5 + 29.02671162874377 + 100.16848916015051 + + + EMS + EMS_846@GraphGeneration.gov + EMS_846 + 6 + 5 + 8.452854334345025 + 87.90570886599836 + + + EMS + EMS_849@GraphGeneration.gov + EMS_849 + 6 + 5 + 49.26086385324426 + 112.53195714350703 + + + EMS + EMS_851@GraphGeneration.gov + EMS_851 + 8 + 5 + 2.5825739922494892 + 92.17291674792224 + + + EMS + EMS_857@GraphGeneration.gov + EMS_857 + 6 + 5 + 62.43630161117243 + 104.21396438050186 + + + EMS + EMS_922@GraphGeneration.gov + EMS_922 + 7 + 5 + 73.60118479852899 + 106.52432302864885 + + + EMS + EMS_923@GraphGeneration.gov + EMS_923 + 8 + 5 + 112.05337828780682 + 110.05600709665363 + + + EMS + EMS_927@GraphGeneration.gov + EMS_927 + 7 + 5 + 77.31056975764335 + 110.36078632857064 + + + EMS + EMS_931@GraphGeneration.gov + EMS_931 + 12 + 5 + 94.47296453953226 + 112.34597518840175 + + + EMS + EMS_936@GraphGeneration.gov + EMS_936 + 6 + 5 + 101.1648471021498 + 107.34985603163234 + + + EMS + EMS_937@GraphGeneration.gov + EMS_937 + 8 + 5 + 87.46423704841007 + 100.52057927959368 + + + EMS + EMS_948@GraphGeneration.gov + EMS_948 + 10 + 5 + 122.39846098012359 + 109.09354216005386 + + + EMS + EMS_949@GraphGeneration.gov + EMS_949 + 7 + 5 + 122.84032093671425 + 101.22814290083184 + + + EMS + EMS_950@GraphGeneration.gov + EMS_950 + 7 + 5 + 105.18250299976805 + 96.28625751781733 + + + EMS + EMS_1020@GraphGeneration.gov + EMS_1020 + 7 + 5 + 141.8711457997561 + 97.96604591323246 + + + EMS + EMS_1021@GraphGeneration.gov + EMS_1021 + 9 + 5 + 141.9314729046701 + 86.37273400083532 + + + EMS + EMS_1024@GraphGeneration.gov + EMS_1024 + 6 + 5 + 155.62579382309968 + 95.06056918445223 + + + EMS + EMS_1025@GraphGeneration.gov + EMS_1025 + 12 + 5 + 139.33928255226374 + 104.10611531236695 + + + EMS + EMS_1026@GraphGeneration.gov + EMS_1026 + 8 + 5 + 185.69627010417463 + 109.52827573781065 + + + EMS + EMS_1029@GraphGeneration.gov + EMS_1029 + 7 + 5 + 163.67623382663268 + 90.8378097360167 + + + EMS + EMS_1031@GraphGeneration.gov + EMS_1031 + 12 + 5 + 139.01696963939298 + 106.46127788154055 + + + EMS + EMS_1033@GraphGeneration.gov + EMS_1033 + 6 + 5 + 144.6560934860995 + 95.35004446123483 + + + EMS + EMS_1035@GraphGeneration.gov + EMS_1035 + 7 + 5 + 175.5566005265133 + 95.43507503709664 + + + EMS + EMS_1106@GraphGeneration.gov + EMS_1106 + 8 + 5 + 55.149659110590186 + 129.79881378474514 + + + EMS + EMS_1112@GraphGeneration.gov + EMS_1112 + 9 + 5 + 49.69409333552046 + 122.16165182880025 + + + EMS + EMS_1117@GraphGeneration.gov + EMS_1117 + 12 + 5 + 22.404477618166396 + 115.12315563539765 + + + EMS + EMS_1118@GraphGeneration.gov + EMS_1118 + 11 + 5 + 18.261742579163318 + 122.70594529608258 + + + EMS + EMS_1121@GraphGeneration.gov + EMS_1121 + 8 + 5 + 60.308372209720986 + 120.29077051827282 + + + EMS + EMS_1130@GraphGeneration.gov + EMS_1130 + 10 + 5 + 64.17245375321698 + 123.76938275930841 + + + EMS + EMS_1201@GraphGeneration.gov + EMS_1201 + 10 + 5 + 100.80577820865133 + 138.22036235969318 + + + EMS + EMS_1203@GraphGeneration.gov + EMS_1203 + 6 + 5 + 104.2250850802289 + 114.50512435720091 + + + EMS + EMS_1206@GraphGeneration.gov + EMS_1206 + 9 + 5 + 128.1883058161159 + 139.13403372853955 + + + EMS + EMS_1208@GraphGeneration.gov + EMS_1208 + 6 + 5 + 131.28640458638648 + 131.08246079167304 + + + EMS + EMS_1210@GraphGeneration.gov + EMS_1210 + 11 + 5 + 115.21327153945677 + 124.9392605041629 + + + EMS + EMS_1211@GraphGeneration.gov + EMS_1211 + 8 + 5 + 113.9188598526004 + 122.8609836522822 + + + EMS + EMS_1223@GraphGeneration.gov + EMS_1223 + 6 + 5 + 67.71136826877489 + 128.75438453014178 + + + EMS + EMS_1225@GraphGeneration.gov + EMS_1225 + 8 + 5 + 112.31202008585103 + 118.9667502066422 + + + EMS + EMS_1226@GraphGeneration.gov + EMS_1226 + 12 + 5 + 85.5808450341149 + 115.29973779241782 + + + EMS + EMS_1290@GraphGeneration.gov + EMS_1290 + 6 + 5 + 195.10919516052533 + 135.06067412229123 + + + EMS + EMS_1296@GraphGeneration.gov + EMS_1296 + 6 + 5 + 147.48397378138708 + 131.13598986559742 + + + EMS + EMS_1297@GraphGeneration.gov + EMS_1297 + 7 + 5 + 190.1531940014856 + 139.94982748136528 + + + EMS + EMS_1307@GraphGeneration.gov + EMS_1307 + 9 + 5 + 170.02309967058696 + 118.21151286160918 + + + EMS + EMS_1310@GraphGeneration.gov + EMS_1310 + 10 + 5 + 147.02553001707892 + 132.59339252576794 + + + EMS + EMS_1314@GraphGeneration.gov + EMS_1314 + 10 + 5 + 139.253407869409 + 125.7547120918265 + + + EMS + EMS_1316@GraphGeneration.gov + EMS_1316 + 8 + 5 + 146.80408114488168 + 135.1176651566524 + + + EMS + EMS_1385@GraphGeneration.gov + EMS_1385 + 11 + 5 + 7.3604101125202 + 171.2520418801709 + + + EMS + EMS_1392@GraphGeneration.gov + EMS_1392 + 10 + 5 + 30.549160937719535 + 171.3807023424848 + + + EMS + EMS_1393@GraphGeneration.gov + EMS_1393 + 11 + 5 + 29.07981782268893 + 150.14208443567526 + + + EMS + EMS_1398@GraphGeneration.gov + EMS_1398 + 7 + 5 + 9.702929936205326 + 144.29337990025206 + + + EMS + EMS_1403@GraphGeneration.gov + EMS_1403 + 12 + 5 + 18.57142834181729 + 163.13103116924708 + + + EMS + EMS_1405@GraphGeneration.gov + EMS_1405 + 10 + 5 + 38.2339995069527 + 149.01957234926215 + + + EMS + EMS_1409@GraphGeneration.gov + EMS_1409 + 7 + 5 + 17.868399185237802 + 162.6501336718323 + + + EMS + EMS_1478@GraphGeneration.gov + EMS_1478 + 9 + 5 + 112.99906987845857 + 159.320033069597 + + + EMS + EMS_1479@GraphGeneration.gov + EMS_1479 + 7 + 5 + 129.59636388782891 + 149.14610725253078 + + + EMS + EMS_1484@GraphGeneration.gov + EMS_1484 + 6 + 5 + 89.80274893833376 + 171.1960376332653 + + + EMS + EMS_1487@GraphGeneration.gov + EMS_1487 + 6 + 5 + 90.14501358048267 + 161.12495098805672 + + + EMS + EMS_1496@GraphGeneration.gov + EMS_1496 + 11 + 5 + 109.36138247013544 + 161.35641920025253 + + + EMS + EMS_1499@GraphGeneration.gov + EMS_1499 + 6 + 5 + 112.61174073372129 + 166.21569439329645 + + + EMS + EMS_1500@GraphGeneration.gov + EMS_1500 + 11 + 5 + 95.31749808631184 + 145.87263939275238 + + + EMS + EMS_1501@GraphGeneration.gov + EMS_1501 + 8 + 5 + 97.35475298705869 + 154.3444438230534 + + + EMS + EMS_1568@GraphGeneration.gov + EMS_1568 + 9 + 5 + 191.857070323042 + 156.69039455057342 + + + EMS + EMS_1569@GraphGeneration.gov + EMS_1569 + 10 + 5 + 137.09010843196356 + 164.03094033717423 + + + EMS + EMS_1576@GraphGeneration.gov + EMS_1576 + 10 + 5 + 177.84987698957394 + 154.32104882915124 + + + EMS + EMS_1578@GraphGeneration.gov + EMS_1578 + 9 + 5 + 152.7935473812322 + 150.87210814409383 + + + EMS + EMS_1580@GraphGeneration.gov + EMS_1580 + 12 + 5 + 144.5600462978506 + 143.22191475472835 + + + EMS + EMS_1582@GraphGeneration.gov + EMS_1582 + 8 + 5 + 177.39570521287655 + 153.49638798022255 + + + EMS + EMS_1589@GraphGeneration.gov + EMS_1589 + 12 + 5 + 192.78757196777008 + 152.4783329309889 + + + EMS + EMS_1591@GraphGeneration.gov + EMS_1591 + 10 + 5 + 187.45283830205162 + 148.4509280418774 + + + EMS + EMS_1592@GraphGeneration.gov + EMS_1592 + 12 + 5 + 175.43011079482557 + 162.24697169046442 + + + EMS + EMS_1593@GraphGeneration.gov + EMS_1593 + 11 + 5 + 137.67097195608306 + 151.01064104243625 + + + EMS + EMS_1662@GraphGeneration.gov + EMS_1662 + 10 + 5 + 53.460666372554876 + 184.09941894626547 + + + EMS + EMS_1663@GraphGeneration.gov + EMS_1663 + 10 + 5 + 35.35459181743054 + 182.3449303452015 + + + EMS + EMS_1664@GraphGeneration.gov + EMS_1664 + 9 + 5 + 41.58348463089494 + 180.9650092902167 + + + EMS + EMS_1674@GraphGeneration.gov + EMS_1674 + 9 + 5 + 27.07746939166846 + 183.92859558468749 + + + EMS + EMS_1677@GraphGeneration.gov + EMS_1677 + 10 + 5 + 64.0183090242734 + 176.3914393512334 + + + EMS + EMS_1678@GraphGeneration.gov + EMS_1678 + 8 + 5 + 65.79797633900507 + 190.58731881300088 + + + EMS + EMS_1686@GraphGeneration.gov + EMS_1686 + 10 + 5 + 16.464304364255003 + 191.35718683132905 + + + EMS + EMS_1750@GraphGeneration.gov + EMS_1750 + 6 + 5 + 127.28449077828245 + 189.0030589305404 + + + EMS + EMS_1751@GraphGeneration.gov + EMS_1751 + 6 + 5 + 118.41791319284309 + 197.8092678060444 + + + EMS + EMS_1757@GraphGeneration.gov + EMS_1757 + 11 + 5 + 70.65311918135356 + 181.60930036689186 + + + EMS + EMS_1759@GraphGeneration.gov + EMS_1759 + 10 + 5 + 81.0956547452732 + 178.19098529403198 + + + EMS + EMS_1761@GraphGeneration.gov + EMS_1761 + 9 + 5 + 94.70312630934731 + 182.8331257442632 + + + EMS + EMS_1765@GraphGeneration.gov + EMS_1765 + 8 + 5 + 98.01869858055522 + 181.28886768961797 + + + EMS + EMS_1775@GraphGeneration.gov + EMS_1775 + 9 + 5 + 89.16251637902297 + 175.2152620153196 + + + EMS + EMS_1778@GraphGeneration.gov + EMS_1778 + 10 + 5 + 114.61791930306877 + 194.1765873247449 + + + EMS + EMS_1842@GraphGeneration.gov + EMS_1842 + 9 + 5 + 164.53743023446444 + 176.9071934721059 + + + EMS + EMS_1847@GraphGeneration.gov + EMS_1847 + 8 + 5 + 183.55357962983857 + 198.61850933894294 + + + EMS + EMS_1849@GraphGeneration.gov + EMS_1849 + 9 + 5 + 143.84634939528283 + 172.12316748957522 + + + EMS + EMS_1850@GraphGeneration.gov + EMS_1850 + 8 + 5 + 133.9931037034244 + 178.06484875046155 + + + EMS + EMS_1852@GraphGeneration.gov + EMS_1852 + 7 + 5 + 142.91243309927654 + 184.9446419081314 + + + EMS + EMS_1854@GraphGeneration.gov + EMS_1854 + 7 + 5 + 194.10385117630284 + 176.53458748612408 + + + EMS + EMS_1859@GraphGeneration.gov + EMS_1859 + 8 + 5 + 134.5095002371284 + 171.486057357573 + + + EMS + EMS_1860@GraphGeneration.gov + EMS_1860 + 6 + 5 + 162.36987946559526 + 175.22726907216028 + + + FIRE + FIRE_39@GraphGeneration.gov + FIRE_39 + 7 + 5 + 52.44609539746654 + 3.8402885976844097 + + + FIRE + FIRE_44@GraphGeneration.gov + FIRE_44 + 10 + 5 + 54.38693355844612 + 26.95514122812552 + + + FIRE + FIRE_47@GraphGeneration.gov + FIRE_47 + 7 + 5 + 59.841777783140735 + 23.984736637699463 + + + FIRE + FIRE_52@GraphGeneration.gov + FIRE_52 + 8 + 5 + 26.534525698434585 + 1.741038668468715 + + + FIRE + FIRE_59@GraphGeneration.gov + FIRE_59 + 9 + 5 + 21.407542847202166 + 14.002799275349735 + + + FIRE + FIRE_124@GraphGeneration.gov + FIRE_124 + 12 + 5 + 78.9062618887843 + 20.528897044909666 + + + FIRE + FIRE_127@GraphGeneration.gov + FIRE_127 + 6 + 5 + 73.15480553764512 + 17.740480811962797 + + + FIRE + FIRE_136@GraphGeneration.gov + FIRE_136 + 10 + 5 + 88.7727929419646 + 20.78974219919326 + + + FIRE + FIRE_137@GraphGeneration.gov + FIRE_137 + 9 + 5 + 87.68081882591551 + 16.991539836545932 + + + FIRE + FIRE_141@GraphGeneration.gov + FIRE_141 + 10 + 5 + 87.35431023310679 + 15.222099300250765 + + + FIRE + FIRE_144@GraphGeneration.gov + FIRE_144 + 9 + 5 + 114.9829880204943 + 2.788789331402741 + + + FIRE + FIRE_145@GraphGeneration.gov + FIRE_145 + 7 + 5 + 83.95066256302752 + 9.228464686421534 + + + FIRE + FIRE_149@GraphGeneration.gov + FIRE_149 + 11 + 5 + 74.78103595993863 + 14.279049191803509 + + + FIRE + FIRE_215@GraphGeneration.gov + FIRE_215 + 8 + 5 + 151.49953928764697 + 14.059389209328115 + + + FIRE + FIRE_217@GraphGeneration.gov + FIRE_217 + 11 + 5 + 169.30076425056996 + 9.331427058992011 + + + FIRE + FIRE_219@GraphGeneration.gov + FIRE_219 + 12 + 5 + 140.7306799535243 + 16.606458452330866 + + + FIRE + FIRE_222@GraphGeneration.gov + FIRE_222 + 11 + 5 + 182.63727896605866 + 28.48123622952132 + + + FIRE + FIRE_231@GraphGeneration.gov + FIRE_231 + 7 + 5 + 154.8410819715237 + 14.042783550478973 + + + FIRE + FIRE_234@GraphGeneration.gov + FIRE_234 + 11 + 5 + 198.49187496273527 + 5.536825239326853 + + + FIRE + FIRE_240@GraphGeneration.gov + FIRE_240 + 12 + 5 + 167.43181939902183 + 22.089941210500328 + + + FIRE + FIRE_311@GraphGeneration.gov + FIRE_311 + 7 + 5 + 45.10310229717604 + 40.28771972364731 + + + FIRE + FIRE_318@GraphGeneration.gov + FIRE_318 + 7 + 5 + 20.77074090099468 + 36.4337241968922 + + + FIRE + FIRE_324@GraphGeneration.gov + FIRE_324 + 11 + 5 + 15.067561146191952 + 38.62073132120864 + + + FIRE + FIRE_326@GraphGeneration.gov + FIRE_326 + 11 + 5 + 48.973401607652974 + 44.208769732784134 + + + FIRE + FIRE_335@GraphGeneration.gov + FIRE_335 + 6 + 5 + 9.835928459179067 + 36.668831262390455 + + + FIRE + FIRE_336@GraphGeneration.gov + FIRE_336 + 6 + 5 + 40.28917940211862 + 35.71200051894308 + + + FIRE + FIRE_408@GraphGeneration.gov + FIRE_408 + 12 + 5 + 79.32147840290176 + 50.12050267904334 + + + FIRE + FIRE_410@GraphGeneration.gov + FIRE_410 + 10 + 5 + 82.21072750862756 + 31.677322481768577 + + + FIRE + FIRE_414@GraphGeneration.gov + FIRE_414 + 6 + 5 + 101.99938240289006 + 46.496944552922656 + + + FIRE + FIRE_423@GraphGeneration.gov + FIRE_423 + 10 + 5 + 81.61868901818369 + 39.991164689900785 + + + FIRE + FIRE_424@GraphGeneration.gov + FIRE_424 + 7 + 5 + 120.55916044899881 + 55.53151464176432 + + + FIRE + FIRE_492@GraphGeneration.gov + FIRE_492 + 9 + 5 + 183.41416707130645 + 56.43689275840002 + + + FIRE + FIRE_497@GraphGeneration.gov + FIRE_497 + 12 + 5 + 142.51341481871475 + 37.011028137562135 + + + FIRE + FIRE_501@GraphGeneration.gov + FIRE_501 + 10 + 5 + 145.90081206295878 + 53.53890048981603 + + + FIRE + FIRE_504@GraphGeneration.gov + FIRE_504 + 7 + 5 + 174.65362181680263 + 36.74632663696582 + + + FIRE + FIRE_505@GraphGeneration.gov + FIRE_505 + 9 + 5 + 163.80639763009668 + 52.21035682507149 + + + FIRE + FIRE_513@GraphGeneration.gov + FIRE_513 + 12 + 5 + 187.15271780434614 + 39.88983609896651 + + + FIRE + FIRE_519@GraphGeneration.gov + FIRE_519 + 12 + 5 + 141.95787914713017 + 43.614930082472505 + + + FIRE + FIRE_589@GraphGeneration.gov + FIRE_589 + 12 + 5 + 16.83957785978144 + 75.76995177929261 + + + FIRE + FIRE_590@GraphGeneration.gov + FIRE_590 + 9 + 5 + 66.03013833391796 + 62.14640845623531 + + + FIRE + FIRE_601@GraphGeneration.gov + FIRE_601 + 12 + 5 + 34.7112697538396 + 60.17155638214466 + + + FIRE + FIRE_612@GraphGeneration.gov + FIRE_612 + 6 + 5 + 12.004117616037185 + 71.75851404516972 + + + FIRE + FIRE_677@GraphGeneration.gov + FIRE_677 + 12 + 5 + 78.51433724959648 + 70.25214720708729 + + + FIRE + FIRE_680@GraphGeneration.gov + FIRE_680 + 7 + 5 + 82.61424612727164 + 58.01382226077925 + + + FIRE + FIRE_688@GraphGeneration.gov + FIRE_688 + 10 + 5 + 124.32879886944639 + 60.47477814420351 + + + FIRE + FIRE_689@GraphGeneration.gov + FIRE_689 + 9 + 5 + 85.3197998078081 + 78.35146487412982 + + + FIRE + FIRE_698@GraphGeneration.gov + FIRE_698 + 10 + 5 + 74.91909914268984 + 85.58103591377112 + + + FIRE + FIRE_701@GraphGeneration.gov + FIRE_701 + 7 + 5 + 75.29138633984432 + 57.55773650923262 + + + FIRE + FIRE_704@GraphGeneration.gov + FIRE_704 + 7 + 5 + 105.04942189874025 + 78.76228159366612 + + + FIRE + FIRE_767@GraphGeneration.gov + FIRE_767 + 7 + 5 + 156.7462170169933 + 59.737484376440605 + + + FIRE + FIRE_773@GraphGeneration.gov + FIRE_773 + 7 + 5 + 174.24696351351554 + 60.38381956436396 + + + FIRE + FIRE_774@GraphGeneration.gov + FIRE_774 + 8 + 5 + 144.51219593561922 + 68.3709664245582 + + + FIRE + FIRE_775@GraphGeneration.gov + FIRE_775 + 12 + 5 + 139.98752753907823 + 85.2688498342445 + + + FIRE + FIRE_778@GraphGeneration.gov + FIRE_778 + 12 + 5 + 136.55564924650778 + 78.51654510166958 + + + FIRE + FIRE_781@GraphGeneration.gov + FIRE_781 + 6 + 5 + 137.75780188236885 + 58.53998075186977 + + + FIRE + FIRE_784@GraphGeneration.gov + FIRE_784 + 10 + 5 + 162.43260824206692 + 84.64270860599773 + + + FIRE + FIRE_787@GraphGeneration.gov + FIRE_787 + 8 + 5 + 190.87030944009055 + 77.03448218186972 + + + FIRE + FIRE_788@GraphGeneration.gov + FIRE_788 + 6 + 5 + 152.38068207115893 + 70.28561582442613 + + + FIRE + FIRE_791@GraphGeneration.gov + FIRE_791 + 9 + 5 + 190.52540144218761 + 81.90880301856058 + + + FIRE + FIRE_794@GraphGeneration.gov + FIRE_794 + 10 + 5 + 161.28078650124894 + 59.252211001290476 + + + FIRE + FIRE_863@GraphGeneration.gov + FIRE_863 + 11 + 5 + 65.78687996617722 + 86.2227708507688 + + + FIRE + FIRE_869@GraphGeneration.gov + FIRE_869 + 11 + 5 + 57.1411382708069 + 105.62108660929553 + + + FIRE + FIRE_870@GraphGeneration.gov + FIRE_870 + 6 + 5 + 46.2999757844602 + 89.61465525786073 + + + FIRE + FIRE_871@GraphGeneration.gov + FIRE_871 + 6 + 5 + 35.87375489074635 + 113.94954119089181 + + + FIRE + FIRE_873@GraphGeneration.gov + FIRE_873 + 8 + 5 + 53.81800341461849 + 91.9304629213545 + + + FIRE + FIRE_876@GraphGeneration.gov + FIRE_876 + 11 + 5 + 13.391362840599683 + 92.89600028105048 + + + FIRE + FIRE_878@GraphGeneration.gov + FIRE_878 + 8 + 5 + 25.76095921418859 + 110.60510848051774 + + + FIRE + FIRE_879@GraphGeneration.gov + FIRE_879 + 9 + 5 + 34.03134104183512 + 97.33533153622011 + + + FIRE + FIRE_885@GraphGeneration.gov + FIRE_885 + 12 + 5 + 62.42882552655992 + 96.96187457142386 + + + FIRE + FIRE_955@GraphGeneration.gov + FIRE_955 + 12 + 5 + 115.54526074524415 + 88.03363820553139 + + + FIRE + FIRE_959@GraphGeneration.gov + FIRE_959 + 10 + 5 + 125.16437377355473 + 96.00953594809512 + + + FIRE + FIRE_965@GraphGeneration.gov + FIRE_965 + 11 + 5 + 80.5685162761188 + 108.24150385678215 + + + FIRE + FIRE_967@GraphGeneration.gov + FIRE_967 + 9 + 5 + 97.3069973584539 + 104.09034939430596 + + + FIRE + FIRE_972@GraphGeneration.gov + FIRE_972 + 7 + 5 + 90.4142665014241 + 96.06637483771739 + + + FIRE + FIRE_976@GraphGeneration.gov + FIRE_976 + 7 + 5 + 104.4593086843035 + 87.20066465896794 + + + FIRE + FIRE_977@GraphGeneration.gov + FIRE_977 + 12 + 5 + 126.92295699694525 + 87.79075207115523 + + + FIRE + FIRE_978@GraphGeneration.gov + FIRE_978 + 8 + 5 + 117.83915094255542 + 101.6966851110717 + + + FIRE + FIRE_1044@GraphGeneration.gov + FIRE_1044 + 9 + 5 + 181.65108617781482 + 108.91730541251127 + + + FIRE + FIRE_1049@GraphGeneration.gov + FIRE_1049 + 7 + 5 + 155.75976251170223 + 112.15669128241004 + + + FIRE + FIRE_1050@GraphGeneration.gov + FIRE_1050 + 9 + 5 + 151.93076482687573 + 90.84785763020146 + + + FIRE + FIRE_1055@GraphGeneration.gov + FIRE_1055 + 9 + 5 + 157.22493866930495 + 100.73772982008862 + + + FIRE + FIRE_1061@GraphGeneration.gov + FIRE_1061 + 6 + 5 + 162.55841845385856 + 90.43332795214944 + + + FIRE + FIRE_1062@GraphGeneration.gov + FIRE_1062 + 7 + 5 + 155.53113747413616 + 99.12882428124081 + + + FIRE + FIRE_1063@GraphGeneration.gov + FIRE_1063 + 11 + 5 + 147.1430403912329 + 102.56806336613867 + + + FIRE + FIRE_1067@GraphGeneration.gov + FIRE_1067 + 9 + 5 + 142.90501291985385 + 99.82642677252207 + + + FIRE + FIRE_1068@GraphGeneration.gov + FIRE_1068 + 6 + 5 + 172.51728041834932 + 105.02055280027221 + + + FIRE + FIRE_1140@GraphGeneration.gov + FIRE_1140 + 6 + 5 + 1.349944331582583 + 116.92359501783955 + + + FIRE + FIRE_1143@GraphGeneration.gov + FIRE_1143 + 6 + 5 + 48.99790749360029 + 131.13815524958338 + + + FIRE + FIRE_1149@GraphGeneration.gov + FIRE_1149 + 9 + 5 + 59.423747469545354 + 128.53396618193452 + + + FIRE + FIRE_1159@GraphGeneration.gov + FIRE_1159 + 12 + 5 + 29.760449011248188 + 125.24661606922365 + + + FIRE + FIRE_1162@GraphGeneration.gov + FIRE_1162 + 10 + 5 + 13.10751340999544 + 116.9966167259206 + + + FIRE + FIRE_1227@GraphGeneration.gov + FIRE_1227 + 8 + 5 + 129.2811224622846 + 132.16874103224472 + + + FIRE + FIRE_1233@GraphGeneration.gov + FIRE_1233 + 8 + 5 + 73.89746770234291 + 133.79029250325362 + + + FIRE + FIRE_1235@GraphGeneration.gov + FIRE_1235 + 12 + 5 + 110.2280002047325 + 137.77833011029043 + + + FIRE + FIRE_1242@GraphGeneration.gov + FIRE_1242 + 10 + 5 + 76.21423977529452 + 131.03444074976736 + + + FIRE + FIRE_1249@GraphGeneration.gov + FIRE_1249 + 8 + 5 + 100.82205030332489 + 133.09459147090146 + + + FIRE + FIRE_1253@GraphGeneration.gov + FIRE_1253 + 12 + 5 + 90.27770142352307 + 124.70760159063163 + + + FIRE + FIRE_1254@GraphGeneration.gov + FIRE_1254 + 7 + 5 + 115.4921447582878 + 127.33820600577701 + + + FIRE + FIRE_1320@GraphGeneration.gov + FIRE_1320 + 7 + 5 + 138.4869203092473 + 121.6990114837863 + + + FIRE + FIRE_1323@GraphGeneration.gov + FIRE_1323 + 10 + 5 + 198.90542047255195 + 134.70465862415077 + + + FIRE + FIRE_1325@GraphGeneration.gov + FIRE_1325 + 11 + 5 + 172.30190400418007 + 142.23400719032713 + + + FIRE + FIRE_1327@GraphGeneration.gov + FIRE_1327 + 8 + 5 + 161.47706153889348 + 124.81480953044816 + + + FIRE + FIRE_1329@GraphGeneration.gov + FIRE_1329 + 7 + 5 + 133.40981651984083 + 136.31559880013438 + + + FIRE + FIRE_1331@GraphGeneration.gov + FIRE_1331 + 7 + 5 + 152.86001668888792 + 139.1685808762509 + + + FIRE + FIRE_1336@GraphGeneration.gov + FIRE_1336 + 6 + 5 + 148.22370974957158 + 125.97512252872119 + + + FIRE + FIRE_1337@GraphGeneration.gov + FIRE_1337 + 8 + 5 + 146.2451307846912 + 133.95259289669818 + + + FIRE + FIRE_1340@GraphGeneration.gov + FIRE_1340 + 7 + 5 + 156.01999133909118 + 131.5806169265919 + + + FIRE + FIRE_1342@GraphGeneration.gov + FIRE_1342 + 10 + 5 + 191.60463292750745 + 128.5143883325632 + + + FIRE + FIRE_1412@GraphGeneration.gov + FIRE_1412 + 11 + 5 + 28.1657067480592 + 162.91624361124522 + + + FIRE + FIRE_1418@GraphGeneration.gov + FIRE_1418 + 12 + 5 + 56.20494126124436 + 167.27258057800222 + + + FIRE + FIRE_1429@GraphGeneration.gov + FIRE_1429 + 12 + 5 + 60.86490858973752 + 150.84797050804298 + + + FIRE + FIRE_1431@GraphGeneration.gov + FIRE_1431 + 7 + 5 + 30.455034656433156 + 156.2201138188204 + + + FIRE + FIRE_1433@GraphGeneration.gov + FIRE_1433 + 11 + 5 + 14.017981219949698 + 160.0867011204229 + + + FIRE + FIRE_1435@GraphGeneration.gov + FIRE_1435 + 12 + 5 + 43.206310032728055 + 147.30214052831022 + + + FIRE + FIRE_1438@GraphGeneration.gov + FIRE_1438 + 6 + 5 + 9.06435119867016 + 159.57807425372255 + + + FIRE + FIRE_1439@GraphGeneration.gov + FIRE_1439 + 7 + 5 + 54.50712167647027 + 149.25047111508414 + + + FIRE + FIRE_1440@GraphGeneration.gov + FIRE_1440 + 7 + 5 + 11.587560727502867 + 151.84519837509615 + + + FIRE + FIRE_1503@GraphGeneration.gov + FIRE_1503 + 6 + 5 + 104.7475151392427 + 153.6092558643756 + + + FIRE + FIRE_1504@GraphGeneration.gov + FIRE_1504 + 12 + 5 + 95.01418613532155 + 152.30946989615398 + + + FIRE + FIRE_1514@GraphGeneration.gov + FIRE_1514 + 8 + 5 + 119.23461704118088 + 145.27013543479325 + + + FIRE + FIRE_1517@GraphGeneration.gov + FIRE_1517 + 6 + 5 + 103.20931551420622 + 161.5281095792243 + + + FIRE + FIRE_1518@GraphGeneration.gov + FIRE_1518 + 12 + 5 + 113.77824454050194 + 155.66451404817482 + + + FIRE + FIRE_1522@GraphGeneration.gov + FIRE_1522 + 6 + 5 + 83.53648029509195 + 147.00675119161028 + + + FIRE + FIRE_1526@GraphGeneration.gov + FIRE_1526 + 10 + 5 + 93.25372294842106 + 155.55329719779797 + + + FIRE + FIRE_1531@GraphGeneration.gov + FIRE_1531 + 10 + 5 + 87.20789568191384 + 149.26213072526633 + + + FIRE + FIRE_1595@GraphGeneration.gov + FIRE_1595 + 12 + 5 + 146.3166997834195 + 147.12440230172916 + + + FIRE + FIRE_1597@GraphGeneration.gov + FIRE_1597 + 10 + 5 + 138.00008084626438 + 167.4886479372803 + + + FIRE + FIRE_1598@GraphGeneration.gov + FIRE_1598 + 8 + 5 + 137.10535594380502 + 158.57572504197444 + + + FIRE + FIRE_1612@GraphGeneration.gov + FIRE_1612 + 7 + 5 + 197.09729971753416 + 165.72660560646557 + + + FIRE + FIRE_1615@GraphGeneration.gov + FIRE_1615 + 12 + 5 + 194.5512398709355 + 160.07051639260334 + + + FIRE + FIRE_1621@GraphGeneration.gov + FIRE_1621 + 12 + 5 + 197.85350215805727 + 163.74672421202493 + + + FIRE + FIRE_1622@GraphGeneration.gov + FIRE_1622 + 7 + 5 + 178.62261933165505 + 165.83207821250983 + + + FIRE + FIRE_1624@GraphGeneration.gov + FIRE_1624 + 10 + 5 + 160.95677294511455 + 151.23202695119548 + + + FIRE + FIRE_1692@GraphGeneration.gov + FIRE_1692 + 6 + 5 + 29.373170203944603 + 174.90889705874497 + + + FIRE + FIRE_1702@GraphGeneration.gov + FIRE_1702 + 8 + 5 + 60.69423867302718 + 176.10454053464525 + + + FIRE + FIRE_1704@GraphGeneration.gov + FIRE_1704 + 12 + 5 + 40.95447675007475 + 187.00315923261275 + + + FIRE + FIRE_1707@GraphGeneration.gov + FIRE_1707 + 8 + 5 + 26.167521151110506 + 195.71440773327612 + + + FIRE + FIRE_1712@GraphGeneration.gov + FIRE_1712 + 12 + 5 + 2.806463483172572 + 195.55262793577097 + + + FIRE + FIRE_1714@GraphGeneration.gov + FIRE_1714 + 7 + 5 + 27.509579105339416 + 171.80678583401303 + + + FIRE + FIRE_1782@GraphGeneration.gov + FIRE_1782 + 11 + 5 + 101.42983651211074 + 188.34419088443835 + + + FIRE + FIRE_1784@GraphGeneration.gov + FIRE_1784 + 7 + 5 + 118.57129429654518 + 181.76300529370533 + + + FIRE + FIRE_1786@GraphGeneration.gov + FIRE_1786 + 7 + 5 + 133.25126490555778 + 192.95833867835418 + + + FIRE + FIRE_1787@GraphGeneration.gov + FIRE_1787 + 6 + 5 + 127.36737967322959 + 173.54218641660708 + + + FIRE + FIRE_1792@GraphGeneration.gov + FIRE_1792 + 11 + 5 + 130.22630111169434 + 186.65744840844042 + + + FIRE + FIRE_1794@GraphGeneration.gov + FIRE_1794 + 10 + 5 + 82.48165072863084 + 193.36084532671617 + + + FIRE + FIRE_1807@GraphGeneration.gov + FIRE_1807 + 10 + 5 + 131.94137560695495 + 171.6451324652708 + + + FIRE + FIRE_1808@GraphGeneration.gov + FIRE_1808 + 8 + 5 + 71.09088589524285 + 180.6276649013735 + + + FIRE + FIRE_1871@GraphGeneration.gov + FIRE_1871 + 11 + 5 + 197.80625055987184 + 179.90086657402907 + + + FIRE + FIRE_1875@GraphGeneration.gov + FIRE_1875 + 8 + 5 + 152.78821996155617 + 172.26420099806612 + + + FIRE + FIRE_1876@GraphGeneration.gov + FIRE_1876 + 11 + 5 + 135.07398625752347 + 182.51723508328 + + + FIRE + FIRE_1881@GraphGeneration.gov + FIRE_1881 + 11 + 5 + 158.7912732066102 + 192.92389047173694 + + + FIRE + FIRE_1882@GraphGeneration.gov + FIRE_1882 + 8 + 5 + 181.82066749477684 + 185.87109629825923 + + + FIRE + FIRE_1883@GraphGeneration.gov + FIRE_1883 + 12 + 5 + 139.44192782636736 + 179.55510662833706 + + + FIRE + FIRE_1886@GraphGeneration.gov + FIRE_1886 + 7 + 5 + 162.9348592417605 + 192.7305203427353 + + + FIRE + FIRE_1887@GraphGeneration.gov + FIRE_1887 + 7 + 5 + 171.4562411729933 + 196.87637422478286 + + + FIRE + FIRE_1896@GraphGeneration.gov + FIRE_1896 + 10 + 5 + 168.27569698640457 + 179.90498163990011 + + + LAW + LAW_61@GraphGeneration.gov + LAW_61 + 12 + 5 + 59.46086659267998 + 16.679183236660766 + + + LAW + LAW_63@GraphGeneration.gov + LAW_63 + 12 + 5 + 42.81463723173154 + 11.93792718973866 + + + LAW + LAW_64@GraphGeneration.gov + LAW_64 + 8 + 5 + 61.707169857495586 + 4.080567512219128 + + + LAW + LAW_73@GraphGeneration.gov + LAW_73 + 11 + 5 + 4.607483782674837 + 19.969629084091764 + + + LAW + LAW_82@GraphGeneration.gov + LAW_82 + 11 + 5 + 50.45474179370464 + 12.644785088756372 + + + LAW + LAW_89@GraphGeneration.gov + LAW_89 + 7 + 5 + 26.148939036650752 + 23.895127878082768 + + + LAW + LAW_153@GraphGeneration.gov + LAW_153 + 10 + 5 + 96.2081612703409 + 13.245566902063223 + + + LAW + LAW_158@GraphGeneration.gov + LAW_158 + 8 + 5 + 130.60862609557773 + 25.083446607248565 + + + LAW + LAW_160@GraphGeneration.gov + LAW_160 + 12 + 5 + 95.03871129384869 + 20.588399990603257 + + + LAW + LAW_161@GraphGeneration.gov + LAW_161 + 8 + 5 + 75.77109433170315 + 10.990588004449215 + + + LAW + LAW_162@GraphGeneration.gov + LAW_162 + 9 + 5 + 130.85628794976515 + 8.807261669962115 + + + LAW + LAW_163@GraphGeneration.gov + LAW_163 + 6 + 5 + 125.02335602036722 + 22.82339825435788 + + + LAW + LAW_164@GraphGeneration.gov + LAW_164 + 9 + 5 + 84.35712524639418 + 27.9351758163182 + + + LAW + LAW_168@GraphGeneration.gov + LAW_168 + 11 + 5 + 121.89078156654246 + 19.485765132677095 + + + LAW + LAW_169@GraphGeneration.gov + LAW_169 + 10 + 5 + 101.811551094822 + 18.41030990265005 + + + LAW + LAW_247@GraphGeneration.gov + LAW_247 + 9 + 5 + 184.85866548952953 + 27.31691320501529 + + + LAW + LAW_249@GraphGeneration.gov + LAW_249 + 6 + 5 + 197.11749229923004 + 4.628491932397574 + + + LAW + LAW_255@GraphGeneration.gov + LAW_255 + 12 + 5 + 179.43449865819665 + 15.93360064899215 + + + LAW + LAW_259@GraphGeneration.gov + LAW_259 + 9 + 5 + 187.96087295120364 + 28.270764638943664 + + + LAW + LAW_260@GraphGeneration.gov + LAW_260 + 12 + 5 + 187.55101799955804 + 22.717542971887756 + + + LAW + LAW_268@GraphGeneration.gov + LAW_268 + 10 + 5 + 155.9075819046226 + 14.510689802308322 + + + LAW + LAW_269@GraphGeneration.gov + LAW_269 + 7 + 5 + 168.80433786304403 + 6.38263021134613 + + + LAW + LAW_273@GraphGeneration.gov + LAW_273 + 12 + 5 + 162.5962523977139 + 19.034469655641058 + + + LAW + LAW_339@GraphGeneration.gov + LAW_339 + 10 + 5 + 18.752821384394352 + 53.080642644685796 + + + LAW + LAW_344@GraphGeneration.gov + LAW_344 + 12 + 5 + 14.193639308732099 + 40.82637596187844 + + + LAW + LAW_348@GraphGeneration.gov + LAW_348 + 7 + 5 + 5.05296893753322 + 54.11523596058261 + + + LAW + LAW_361@GraphGeneration.gov + LAW_361 + 8 + 5 + 14.63631953185444 + 48.8194885860945 + + + LAW + LAW_365@GraphGeneration.gov + LAW_365 + 11 + 5 + 23.10046212094433 + 50.7429757427969 + + + LAW + LAW_366@GraphGeneration.gov + LAW_366 + 9 + 5 + 49.899199955925 + 41.10826220860726 + + + LAW + LAW_437@GraphGeneration.gov + LAW_437 + 8 + 5 + 130.8851898229382 + 44.838509839580055 + + + LAW + LAW_442@GraphGeneration.gov + LAW_442 + 8 + 5 + 116.58500600102693 + 46.665902021462855 + + + LAW + LAW_445@GraphGeneration.gov + LAW_445 + 12 + 5 + 126.11101001234907 + 52.094718599566534 + + + LAW + LAW_447@GraphGeneration.gov + LAW_447 + 11 + 5 + 124.15891263249704 + 53.829732873260376 + + + LAW + LAW_449@GraphGeneration.gov + LAW_449 + 8 + 5 + 73.80481336795597 + 55.456595142276896 + + + LAW + LAW_450@GraphGeneration.gov + LAW_450 + 8 + 5 + 96.55005760959473 + 48.114876580012634 + + + LAW + LAW_454@GraphGeneration.gov + LAW_454 + 6 + 5 + 85.31715201715932 + 39.92947298397645 + + + LAW + LAW_458@GraphGeneration.gov + LAW_458 + 9 + 5 + 122.43581082095983 + 49.64599123912521 + + + LAW + LAW_528@GraphGeneration.gov + LAW_528 + 10 + 5 + 141.2149136833519 + 45.06785040620787 + + + LAW + LAW_530@GraphGeneration.gov + LAW_530 + 10 + 5 + 195.80503500898564 + 41.88161403148848 + + + LAW + LAW_537@GraphGeneration.gov + LAW_537 + 8 + 5 + 171.44384233870002 + 30.123544171115167 + + + LAW + LAW_540@GraphGeneration.gov + LAW_540 + 8 + 5 + 164.8258798331107 + 48.40554574771437 + + + LAW + LAW_542@GraphGeneration.gov + LAW_542 + 7 + 5 + 144.5073630733252 + 43.3721712662396 + + + LAW + LAW_543@GraphGeneration.gov + LAW_543 + 11 + 5 + 150.16794818464314 + 30.894423839038375 + + + LAW + LAW_549@GraphGeneration.gov + LAW_549 + 12 + 5 + 183.70302511386117 + 54.04660248817536 + + + LAW + LAW_550@GraphGeneration.gov + LAW_550 + 8 + 5 + 150.38076739097232 + 50.99749418350261 + + + LAW + LAW_615@GraphGeneration.gov + LAW_615 + 9 + 5 + 19.443009518626056 + 73.67863138923516 + + + LAW + LAW_616@GraphGeneration.gov + LAW_616 + 7 + 5 + 45.74319458761509 + 76.47451899812134 + + + LAW + LAW_618@GraphGeneration.gov + LAW_618 + 8 + 5 + 60.834728591098816 + 61.11737002374512 + + + LAW + LAW_622@GraphGeneration.gov + LAW_622 + 10 + 5 + 60.36930181562643 + 73.24377908612036 + + + LAW + LAW_623@GraphGeneration.gov + LAW_623 + 10 + 5 + 64.5103641760652 + 65.66320691323196 + + + LAW + LAW_626@GraphGeneration.gov + LAW_626 + 12 + 5 + 15.43172404396318 + 80.15828773126007 + + + LAW + LAW_628@GraphGeneration.gov + LAW_628 + 9 + 5 + 4.0142047151735305 + 77.96790946892699 + + + LAW + LAW_642@GraphGeneration.gov + LAW_642 + 7 + 5 + 21.47735966690001 + 66.02579246185908 + + + LAW + LAW_707@GraphGeneration.gov + LAW_707 + 9 + 5 + 106.30788680940512 + 66.88887832117187 + + + LAW + LAW_714@GraphGeneration.gov + LAW_714 + 9 + 5 + 113.57104709927968 + 59.840831668831214 + + + LAW + LAW_721@GraphGeneration.gov + LAW_721 + 12 + 5 + 105.00094966476121 + 78.29342320764992 + + + LAW + LAW_726@GraphGeneration.gov + LAW_726 + 10 + 5 + 106.92228616314495 + 70.58011325897762 + + + LAW + LAW_731@GraphGeneration.gov + LAW_731 + 10 + 5 + 109.57300813373757 + 59.29987260625923 + + + LAW + LAW_801@GraphGeneration.gov + LAW_801 + 8 + 5 + 143.05737022020784 + 57.8384409331188 + + + LAW + LAW_809@GraphGeneration.gov + LAW_809 + 8 + 5 + 159.95195256610762 + 68.67649284316728 + + + LAW + LAW_811@GraphGeneration.gov + LAW_811 + 8 + 5 + 156.76638560061707 + 70.24008933060395 + + + LAW + LAW_813@GraphGeneration.gov + LAW_813 + 9 + 5 + 166.10242358785504 + 73.68146928705995 + + + LAW + LAW_818@GraphGeneration.gov + LAW_818 + 7 + 5 + 172.69055198437934 + 62.360105348839966 + + + LAW + LAW_821@GraphGeneration.gov + LAW_821 + 8 + 5 + 134.25781235572657 + 80.39645331188414 + + + LAW + LAW_822@GraphGeneration.gov + LAW_822 + 11 + 5 + 172.26489412233968 + 76.81534571147641 + + + LAW + LAW_889@GraphGeneration.gov + LAW_889 + 8 + 5 + 50.821639965215915 + 95.30847862978318 + + + LAW + LAW_895@GraphGeneration.gov + LAW_895 + 11 + 5 + 39.93115855576791 + 105.45683355173475 + + + LAW + LAW_899@GraphGeneration.gov + LAW_899 + 11 + 5 + 49.56970770910599 + 104.61086681197524 + + + LAW + LAW_906@GraphGeneration.gov + LAW_906 + 7 + 5 + 4.911969677769079 + 97.07812200803282 + + + LAW + LAW_910@GraphGeneration.gov + LAW_910 + 8 + 5 + 36.46298523747435 + 103.95410486752897 + + + LAW + LAW_918@GraphGeneration.gov + LAW_918 + 8 + 5 + 24.092662272958552 + 95.53217685677012 + + + LAW + LAW_986@GraphGeneration.gov + LAW_986 + 11 + 5 + 81.2106109264756 + 92.70982116695893 + + + LAW + LAW_988@GraphGeneration.gov + LAW_988 + 9 + 5 + 100.7326012049693 + 97.57684933176282 + + + LAW + LAW_996@GraphGeneration.gov + LAW_996 + 12 + 5 + 132.2441088146435 + 91.5684288185356 + + + LAW + LAW_1002@GraphGeneration.gov + LAW_1002 + 12 + 5 + 90.78122164851361 + 88.01659242525598 + + + LAW + LAW_1003@GraphGeneration.gov + LAW_1003 + 6 + 5 + 111.73526369459586 + 111.23019960755255 + + + LAW + LAW_1004@GraphGeneration.gov + LAW_1004 + 9 + 5 + 118.60045785287576 + 86.52992632129997 + + + LAW + LAW_1074@GraphGeneration.gov + LAW_1074 + 10 + 5 + 171.50008884700208 + 108.86732230390952 + + + LAW + LAW_1078@GraphGeneration.gov + LAW_1078 + 6 + 5 + 146.53838178906173 + 89.45561432672078 + + + LAW + LAW_1096@GraphGeneration.gov + LAW_1096 + 11 + 5 + 146.13134199993976 + 114.02578003943853 + + + LAW + LAW_1100@GraphGeneration.gov + LAW_1100 + 10 + 5 + 164.29347805056295 + 90.57441033370182 + + + LAW + LAW_1102@GraphGeneration.gov + LAW_1102 + 9 + 5 + 146.53260579746697 + 114.03147145574714 + + + LAW + LAW_1165@GraphGeneration.gov + LAW_1165 + 12 + 5 + 0.507261773198368 + 125.67516135177978 + + + LAW + LAW_1170@GraphGeneration.gov + LAW_1170 + 6 + 5 + 45.81364315670845 + 116.75851929315094 + + + LAW + LAW_1185@GraphGeneration.gov + LAW_1185 + 8 + 5 + 26.379772129324653 + 140.54533179244322 + + + LAW + LAW_1193@GraphGeneration.gov + LAW_1193 + 10 + 5 + 4.3458759043294215 + 126.11591584880269 + + + LAW + LAW_1258@GraphGeneration.gov + LAW_1258 + 11 + 5 + 79.5717283558212 + 129.60328135962902 + + + LAW + LAW_1262@GraphGeneration.gov + LAW_1262 + 10 + 5 + 110.4402998860595 + 115.24066359373033 + + + LAW + LAW_1265@GraphGeneration.gov + LAW_1265 + 10 + 5 + 105.33950439096878 + 135.41254362999715 + + + LAW + LAW_1270@GraphGeneration.gov + LAW_1270 + 6 + 5 + 120.12624640994767 + 117.52887903683934 + + + LAW + LAW_1273@GraphGeneration.gov + LAW_1273 + 6 + 5 + 100.09320880865303 + 128.99089575765987 + + + LAW + LAW_1278@GraphGeneration.gov + LAW_1278 + 7 + 5 + 126.52381497953772 + 130.54231031453708 + + + LAW + LAW_1281@GraphGeneration.gov + LAW_1281 + 7 + 5 + 83.75954903116761 + 114.7082153840923 + + + LAW + LAW_1284@GraphGeneration.gov + LAW_1284 + 7 + 5 + 92.32749319580716 + 123.09023033844196 + + + LAW + LAW_1285@GraphGeneration.gov + LAW_1285 + 8 + 5 + 132.28094000743272 + 119.24617585355904 + + + LAW + LAW_1350@GraphGeneration.gov + LAW_1350 + 8 + 5 + 171.64973803161746 + 139.52056667625197 + + + LAW + LAW_1358@GraphGeneration.gov + LAW_1358 + 8 + 5 + 173.02514815170156 + 139.03093876978753 + + + LAW + LAW_1359@GraphGeneration.gov + LAW_1359 + 12 + 5 + 160.71056504223728 + 137.63604786287868 + + + LAW + LAW_1362@GraphGeneration.gov + LAW_1362 + 8 + 5 + 149.60774845289552 + 117.80285336615931 + + + LAW + LAW_1363@GraphGeneration.gov + LAW_1363 + 7 + 5 + 155.70973717083737 + 126.04798496438362 + + + LAW + LAW_1445@GraphGeneration.gov + LAW_1445 + 6 + 5 + 6.828478865906133 + 145.468745859172 + + + LAW + LAW_1446@GraphGeneration.gov + LAW_1446 + 12 + 5 + 11.027629433168848 + 152.40647733474916 + + + LAW + LAW_1447@GraphGeneration.gov + LAW_1447 + 7 + 5 + 63.146483877995045 + 166.61192546878138 + + + LAW + LAW_1450@GraphGeneration.gov + LAW_1450 + 11 + 5 + 25.801101878895484 + 160.66539042704562 + + + LAW + LAW_1454@GraphGeneration.gov + LAW_1454 + 10 + 5 + 6.034033282289346 + 171.17981716665338 + + + LAW + LAW_1456@GraphGeneration.gov + LAW_1456 + 9 + 5 + 62.38560054249399 + 159.11260703469193 + + + LAW + LAW_1462@GraphGeneration.gov + LAW_1462 + 11 + 5 + 36.36372722955533 + 157.23595663761276 + + + LAW + LAW_1463@GraphGeneration.gov + LAW_1463 + 8 + 5 + 4.802294849685929 + 169.87990723048145 + + + LAW + LAW_1465@GraphGeneration.gov + LAW_1465 + 8 + 5 + 21.383392971638532 + 169.30894566960492 + + + LAW + LAW_1533@GraphGeneration.gov + LAW_1533 + 7 + 5 + 122.40300188821143 + 158.57875508042756 + + + LAW + LAW_1539@GraphGeneration.gov + LAW_1539 + 10 + 5 + 125.82788956169765 + 153.4877998626903 + + + LAW + LAW_1543@GraphGeneration.gov + LAW_1543 + 7 + 5 + 92.23415980676658 + 147.49058760855732 + + + LAW + LAW_1545@GraphGeneration.gov + LAW_1545 + 7 + 5 + 103.18013217731266 + 143.41459305293867 + + + LAW + LAW_1549@GraphGeneration.gov + LAW_1549 + 11 + 5 + 98.03726460921875 + 149.87948278076004 + + + LAW + LAW_1553@GraphGeneration.gov + LAW_1553 + 12 + 5 + 92.26335603636434 + 164.11875354154017 + + + LAW + LAW_1558@GraphGeneration.gov + LAW_1558 + 9 + 5 + 98.67962894714708 + 145.97799007459304 + + + LAW + LAW_1625@GraphGeneration.gov + LAW_1625 + 9 + 5 + 149.3076364095453 + 164.4194808885039 + + + LAW + LAW_1628@GraphGeneration.gov + LAW_1628 + 6 + 5 + 145.87530120302537 + 149.5457028195602 + + + LAW + LAW_1631@GraphGeneration.gov + LAW_1631 + 10 + 5 + 144.79537203767526 + 158.56358073628775 + + + LAW + LAW_1633@GraphGeneration.gov + LAW_1633 + 7 + 5 + 135.06524748876365 + 162.14653327692415 + + + LAW + LAW_1642@GraphGeneration.gov + LAW_1642 + 7 + 5 + 199.32238172345797 + 162.72544885044272 + + + LAW + LAW_1650@GraphGeneration.gov + LAW_1650 + 8 + 5 + 177.51251201018633 + 162.8670609896868 + + + LAW + LAW_1724@GraphGeneration.gov + LAW_1724 + 6 + 5 + 26.995662756555976 + 194.5322095460531 + + + LAW + LAW_1725@GraphGeneration.gov + LAW_1725 + 7 + 5 + 59.48827267723811 + 173.78011051776735 + + + LAW + LAW_1732@GraphGeneration.gov + LAW_1732 + 9 + 5 + 49.18598447198394 + 175.61134769226828 + + + LAW + LAW_1741@GraphGeneration.gov + LAW_1741 + 9 + 5 + 21.403345706306556 + 173.62795686902857 + + + LAW + LAW_1810@GraphGeneration.gov + LAW_1810 + 11 + 5 + 107.01835730977709 + 188.18676367441705 + + + LAW + LAW_1811@GraphGeneration.gov + LAW_1811 + 9 + 5 + 69.71362525302392 + 187.4293313779999 + + + LAW + LAW_1825@GraphGeneration.gov + LAW_1825 + 8 + 5 + 84.95379354608227 + 192.31436405760496 + + + LAW + LAW_1830@GraphGeneration.gov + LAW_1830 + 12 + 5 + 96.35709352794608 + 172.5624388287186 + + + LAW + LAW_1902@GraphGeneration.gov + LAW_1902 + 11 + 5 + 178.52966624373067 + 199.30007104538697 + + + LAW + LAW_1907@GraphGeneration.gov + LAW_1907 + 6 + 5 + 196.15403680412132 + 177.41897475077909 + + + LAW + LAW_1915@GraphGeneration.gov + LAW_1915 + 12 + 5 + 183.50100244961305 + 188.99972556163533 + + + LAW + LAW_1919@GraphGeneration.gov + LAW_1919 + 9 + 5 + 141.07929427905066 + 188.38663281900293 + + + LAW + LAW_1920@GraphGeneration.gov + LAW_1920 + 6 + 5 + 164.7657134611667 + 188.9360438342048 + + + LAW + LAW_1925@GraphGeneration.gov + LAW_1925 + 6 + 5 + 144.47370149780727 + 191.2208448366464 + + + LAW + LAW_1926@GraphGeneration.gov + LAW_1926 + 9 + 5 + 149.54633158558678 + 183.63924723104657 + + + LAW + LAW_1928@GraphGeneration.gov + LAW_1928 + 8 + 5 + 177.64898548006585 + 179.8207930805039 + + + EMS + EMS_1@GraphGeneration.gov + EMS_1 + 8 + 6 + 66.26468345462672 + 2.45357055683403 + + + EMS + EMS_2@GraphGeneration.gov + EMS_2 + 9 + 6 + 35.12341236944062 + 18.908629275209627 + + + EMS + EMS_6@GraphGeneration.gov + EMS_6 + 11 + 6 + 45.679024476393614 + 18.29857579679067 + + + EMS + EMS_11@GraphGeneration.gov + EMS_11 + 8 + 6 + 63.09731639046904 + 27.704680543283498 + + + EMS + EMS_17@GraphGeneration.gov + EMS_17 + 11 + 6 + 59.21946338195637 + 22.184380120119183 + + + EMS + EMS_24@GraphGeneration.gov + EMS_24 + 6 + 6 + 10.128171679253366 + 9.383776443489777 + + + EMS + EMS_93@GraphGeneration.gov + EMS_93 + 9 + 6 + 132.46342634240943 + 20.71127824750598 + + + EMS + EMS_94@GraphGeneration.gov + EMS_94 + 8 + 6 + 89.77382829279756 + 7.109269302661717 + + + EMS + EMS_98@GraphGeneration.gov + EMS_98 + 11 + 6 + 131.394415610872 + 27.834294654513915 + + + EMS + EMS_103@GraphGeneration.gov + EMS_103 + 6 + 6 + 96.73530223634901 + 0.5177782786515722 + + + EMS + EMS_107@GraphGeneration.gov + EMS_107 + 8 + 6 + 112.95859205299624 + 0.16191383300611253 + + + EMS + EMS_115@GraphGeneration.gov + EMS_115 + 11 + 6 + 125.39295542591287 + 17.17407920545546 + + + EMS + EMS_122@GraphGeneration.gov + EMS_122 + 6 + 6 + 129.66735263235157 + 28.000547682251927 + + + EMS + EMS_186@GraphGeneration.gov + EMS_186 + 12 + 6 + 199.50774012576375 + 21.90057950549524 + + + EMS + EMS_190@GraphGeneration.gov + EMS_190 + 12 + 6 + 136.8307351527673 + 24.5622005609981 + + + EMS + EMS_195@GraphGeneration.gov + EMS_195 + 9 + 6 + 181.35690087122168 + 13.487036272518417 + + + EMS + EMS_198@GraphGeneration.gov + EMS_198 + 11 + 6 + 187.82821777249256 + 3.286517043465888 + + + EMS + EMS_201@GraphGeneration.gov + EMS_201 + 10 + 6 + 149.57598782996953 + 13.230006120625132 + + + EMS + EMS_204@GraphGeneration.gov + EMS_204 + 12 + 6 + 134.5212590334014 + 9.75821830230491 + + + EMS + EMS_210@GraphGeneration.gov + EMS_210 + 7 + 6 + 137.5037107868108 + 28.440570826391166 + + + EMS + EMS_211@GraphGeneration.gov + EMS_211 + 11 + 6 + 187.189861493793 + 13.516345798074202 + + + EMS + EMS_214@GraphGeneration.gov + EMS_214 + 11 + 6 + 144.71690041628443 + 10.634184199918668 + + + EMS + EMS_277@GraphGeneration.gov + EMS_277 + 7 + 6 + 37.81443088921228 + 52.65364742975298 + + + EMS + EMS_279@GraphGeneration.gov + EMS_279 + 7 + 6 + 63.06198215430677 + 55.03518541506005 + + + EMS + EMS_282@GraphGeneration.gov + EMS_282 + 8 + 6 + 6.275024224605271 + 50.83939561344232 + + + EMS + EMS_284@GraphGeneration.gov + EMS_284 + 12 + 6 + 6.624154929974665 + 32.01769190941457 + + + EMS + EMS_286@GraphGeneration.gov + EMS_286 + 9 + 6 + 28.047528716448586 + 41.611299525256555 + + + EMS + EMS_290@GraphGeneration.gov + EMS_290 + 7 + 6 + 48.742061934962344 + 56.905227494860306 + + + EMS + EMS_294@GraphGeneration.gov + EMS_294 + 12 + 6 + 30.589553207068192 + 54.331194880365956 + + + EMS + EMS_299@GraphGeneration.gov + EMS_299 + 9 + 6 + 48.10963121165737 + 55.80896630537832 + + + EMS + EMS_301@GraphGeneration.gov + EMS_301 + 10 + 6 + 53.34313167430671 + 42.533549390368414 + + + EMS + EMS_381@GraphGeneration.gov + EMS_381 + 10 + 6 + 89.81472559019723 + 56.76606196337859 + + + EMS + EMS_382@GraphGeneration.gov + EMS_382 + 11 + 6 + 89.97485450811769 + 38.52212912777572 + + + EMS + EMS_384@GraphGeneration.gov + EMS_384 + 12 + 6 + 125.67858134690049 + 54.71641559686523 + + + EMS + EMS_385@GraphGeneration.gov + EMS_385 + 10 + 6 + 101.65274922303345 + 37.10825873652651 + + + EMS + EMS_389@GraphGeneration.gov + EMS_389 + 7 + 6 + 90.65880355232757 + 54.32718910524126 + + + EMS + EMS_392@GraphGeneration.gov + EMS_392 + 8 + 6 + 108.09785387499295 + 43.19334823306389 + + + EMS + EMS_394@GraphGeneration.gov + EMS_394 + 8 + 6 + 105.44135283283867 + 39.55997959622701 + + + EMS + EMS_481@GraphGeneration.gov + EMS_481 + 10 + 6 + 153.34782755495883 + 28.92012566221913 + + + EMS + EMS_485@GraphGeneration.gov + EMS_485 + 12 + 6 + 141.63256877000111 + 42.730028702022736 + + + EMS + EMS_487@GraphGeneration.gov + EMS_487 + 7 + 6 + 151.60657932427455 + 32.97040792583494 + + + EMS + EMS_557@GraphGeneration.gov + EMS_557 + 11 + 6 + 60.530502638347954 + 75.34095094540727 + + + EMS + EMS_558@GraphGeneration.gov + EMS_558 + 12 + 6 + 34.182817810137365 + 67.28245583709798 + + + EMS + EMS_562@GraphGeneration.gov + EMS_562 + 7 + 6 + 53.567395531774984 + 85.46616571562933 + + + EMS + EMS_573@GraphGeneration.gov + EMS_573 + 6 + 6 + 52.91341376009387 + 71.08429482633305 + + + EMS + EMS_648@GraphGeneration.gov + EMS_648 + 8 + 6 + 133.11953944369037 + 62.978083038171974 + + + EMS + EMS_652@GraphGeneration.gov + EMS_652 + 10 + 6 + 98.71430265600196 + 60.840138142102525 + + + EMS + EMS_656@GraphGeneration.gov + EMS_656 + 6 + 6 + 89.60481996165763 + 74.29643046283023 + + + EMS + EMS_657@GraphGeneration.gov + EMS_657 + 10 + 6 + 107.28360213117364 + 68.84622992353952 + + + EMS + EMS_658@GraphGeneration.gov + EMS_658 + 9 + 6 + 123.95766837344208 + 69.89031989222791 + + + EMS + EMS_659@GraphGeneration.gov + EMS_659 + 12 + 6 + 72.92610168134446 + 73.73750857601318 + + + EMS + EMS_660@GraphGeneration.gov + EMS_660 + 12 + 6 + 92.2163715079123 + 69.93178668290403 + + + EMS + EMS_664@GraphGeneration.gov + EMS_664 + 7 + 6 + 125.15356132130792 + 79.05869746655142 + + + EMS + EMS_666@GraphGeneration.gov + EMS_666 + 11 + 6 + 100.60578427896004 + 63.48066666622355 + + + EMS + EMS_668@GraphGeneration.gov + EMS_668 + 8 + 6 + 95.61479618534263 + 80.44777735940804 + + + EMS + EMS_740@GraphGeneration.gov + EMS_740 + 10 + 6 + 144.75307067548636 + 70.55735343140528 + + + EMS + EMS_741@GraphGeneration.gov + EMS_741 + 8 + 6 + 197.89243999502332 + 58.556995083486164 + + + EMS + EMS_743@GraphGeneration.gov + EMS_743 + 6 + 6 + 153.93498970585216 + 62.09636326477876 + + + EMS + EMS_745@GraphGeneration.gov + EMS_745 + 11 + 6 + 177.1389805176084 + 72.12042621950674 + + + EMS + EMS_749@GraphGeneration.gov + EMS_749 + 8 + 6 + 136.5606202649411 + 75.77492601542578 + + + EMS + EMS_750@GraphGeneration.gov + EMS_750 + 8 + 6 + 180.97221885768974 + 58.56893267574057 + + + EMS + EMS_751@GraphGeneration.gov + EMS_751 + 7 + 6 + 144.9288741819409 + 62.22984606314405 + + + EMS + EMS_754@GraphGeneration.gov + EMS_754 + 7 + 6 + 174.5545848553992 + 69.7309614401217 + + + EMS + EMS_757@GraphGeneration.gov + EMS_757 + 8 + 6 + 153.95275299883687 + 82.13512852321841 + + + EMS + EMS_766@GraphGeneration.gov + EMS_766 + 11 + 6 + 144.89390765940507 + 85.313206997174 + + + EMS + EMS_829@GraphGeneration.gov + EMS_829 + 6 + 6 + 45.698443905157674 + 112.52973743567298 + + + EMS + EMS_835@GraphGeneration.gov + EMS_835 + 11 + 6 + 17.17974459819426 + 97.12513181855525 + + + EMS + EMS_837@GraphGeneration.gov + EMS_837 + 10 + 6 + 6.563283384883553 + 90.11740270904478 + + + EMS + EMS_839@GraphGeneration.gov + EMS_839 + 12 + 6 + 53.90267747557608 + 90.59545199001525 + + + EMS + EMS_845@GraphGeneration.gov + EMS_845 + 12 + 6 + 48.592939639725806 + 88.57080386081304 + + + EMS + EMS_848@GraphGeneration.gov + EMS_848 + 10 + 6 + 37.431121986230686 + 113.52748339065954 + + + EMS + EMS_854@GraphGeneration.gov + EMS_854 + 9 + 6 + 24.925666180527948 + 98.69541940967595 + + + EMS + EMS_855@GraphGeneration.gov + EMS_855 + 6 + 6 + 63.91856755972681 + 99.49554300535975 + + + EMS + EMS_858@GraphGeneration.gov + EMS_858 + 10 + 6 + 62.71403449452537 + 105.67521208446144 + + + EMS + EMS_921@GraphGeneration.gov + EMS_921 + 10 + 6 + 97.12309494419605 + 86.7019324910635 + + + EMS + EMS_925@GraphGeneration.gov + EMS_925 + 7 + 6 + 122.5792525783411 + 86.2445838106334 + + + EMS + EMS_928@GraphGeneration.gov + EMS_928 + 10 + 6 + 118.16958030569793 + 100.07780070564411 + + + EMS + EMS_929@GraphGeneration.gov + EMS_929 + 6 + 6 + 78.87276810363987 + 112.42354764212892 + + + EMS + EMS_933@GraphGeneration.gov + EMS_933 + 8 + 6 + 82.40427371192379 + 106.65120899473547 + + + EMS + EMS_942@GraphGeneration.gov + EMS_942 + 7 + 6 + 114.32438262004736 + 110.15884834127864 + + + EMS + EMS_945@GraphGeneration.gov + EMS_945 + 9 + 6 + 111.2266135913125 + 86.33386240310853 + + + EMS + EMS_947@GraphGeneration.gov + EMS_947 + 7 + 6 + 98.9535016494654 + 97.46047828193896 + + + EMS + EMS_1016@GraphGeneration.gov + EMS_1016 + 9 + 6 + 186.48506659363534 + 104.73296177593417 + + + EMS + EMS_1018@GraphGeneration.gov + EMS_1018 + 12 + 6 + 194.35245155306265 + 89.00164049463088 + + + EMS + EMS_1022@GraphGeneration.gov + EMS_1022 + 9 + 6 + 146.24297361586449 + 90.97424741383219 + + + EMS + EMS_1028@GraphGeneration.gov + EMS_1028 + 7 + 6 + 148.4080921297607 + 90.55269209917957 + + + EMS + EMS_1030@GraphGeneration.gov + EMS_1030 + 9 + 6 + 198.2061519829375 + 94.6713343421384 + + + EMS + EMS_1036@GraphGeneration.gov + EMS_1036 + 7 + 6 + 180.8859191878276 + 110.73056462605079 + + + EMS + EMS_1038@GraphGeneration.gov + EMS_1038 + 6 + 6 + 185.79795125322215 + 101.1949330097258 + + + EMS + EMS_1040@GraphGeneration.gov + EMS_1040 + 8 + 6 + 146.0261889881198 + 103.45612580858707 + + + EMS + EMS_1108@GraphGeneration.gov + EMS_1108 + 6 + 6 + 49.3096273527432 + 133.2509520298693 + + + EMS + EMS_1111@GraphGeneration.gov + EMS_1111 + 11 + 6 + 27.918298295069558 + 133.4674731742893 + + + EMS + EMS_1113@GraphGeneration.gov + EMS_1113 + 6 + 6 + 33.583150498733424 + 127.44181445992922 + + + EMS + EMS_1114@GraphGeneration.gov + EMS_1114 + 6 + 6 + 30.782299627754572 + 127.97906468750587 + + + EMS + EMS_1122@GraphGeneration.gov + EMS_1122 + 7 + 6 + 31.301514921580118 + 132.4648871502202 + + + EMS + EMS_1123@GraphGeneration.gov + EMS_1123 + 7 + 6 + 55.51752971715879 + 125.8474634228849 + + + EMS + EMS_1127@GraphGeneration.gov + EMS_1127 + 9 + 6 + 61.93606894439369 + 125.6423651239317 + + + EMS + EMS_1128@GraphGeneration.gov + EMS_1128 + 9 + 6 + 1.2422680760398506 + 139.6908564943871 + + + EMS + EMS_1129@GraphGeneration.gov + EMS_1129 + 6 + 6 + 54.26475226232227 + 128.58741127093722 + + + EMS + EMS_1198@GraphGeneration.gov + EMS_1198 + 8 + 6 + 131.7412378824884 + 117.662531112142 + + + EMS + EMS_1216@GraphGeneration.gov + EMS_1216 + 11 + 6 + 116.73062419184055 + 130.33764283776517 + + + EMS + EMS_1220@GraphGeneration.gov + EMS_1220 + 6 + 6 + 90.1491138250455 + 119.72932796110496 + + + EMS + EMS_1300@GraphGeneration.gov + EMS_1300 + 10 + 6 + 182.08518085687777 + 133.9434105583339 + + + EMS + EMS_1301@GraphGeneration.gov + EMS_1301 + 10 + 6 + 148.32794039400656 + 141.70722104726755 + + + EMS + EMS_1308@GraphGeneration.gov + EMS_1308 + 6 + 6 + 152.83763899149142 + 125.19025935062035 + + + EMS + EMS_1313@GraphGeneration.gov + EMS_1313 + 9 + 6 + 174.91503447933758 + 114.84897502057257 + + + EMS + EMS_1317@GraphGeneration.gov + EMS_1317 + 9 + 6 + 167.57129129397697 + 117.39435071679338 + + + EMS + EMS_1318@GraphGeneration.gov + EMS_1318 + 8 + 6 + 153.96477902872846 + 123.92896613698365 + + + EMS + EMS_1386@GraphGeneration.gov + EMS_1386 + 7 + 6 + 27.144410914366837 + 148.89347040118457 + + + EMS + EMS_1387@GraphGeneration.gov + EMS_1387 + 10 + 6 + 18.367428077505295 + 166.66262396249442 + + + EMS + EMS_1396@GraphGeneration.gov + EMS_1396 + 6 + 6 + 16.346119094213552 + 151.67261834191814 + + + EMS + EMS_1397@GraphGeneration.gov + EMS_1397 + 11 + 6 + 13.317149844400134 + 164.06287743191754 + + + EMS + EMS_1404@GraphGeneration.gov + EMS_1404 + 12 + 6 + 48.74005218339687 + 143.09832655882093 + + + EMS + EMS_1410@GraphGeneration.gov + EMS_1410 + 7 + 6 + 25.392824220999348 + 151.03536724070378 + + + EMS + EMS_1476@GraphGeneration.gov + EMS_1476 + 9 + 6 + 118.30667393816879 + 151.48604091931168 + + + EMS + EMS_1483@GraphGeneration.gov + EMS_1483 + 6 + 6 + 126.48347349668992 + 150.36223061772012 + + + EMS + EMS_1486@GraphGeneration.gov + EMS_1486 + 11 + 6 + 92.64131270764724 + 148.0625644673417 + + + EMS + EMS_1489@GraphGeneration.gov + EMS_1489 + 8 + 6 + 74.24250884605095 + 162.19200033423394 + + + EMS + EMS_1494@GraphGeneration.gov + EMS_1494 + 12 + 6 + 120.07552059918493 + 146.34676580719923 + + + EMS + EMS_1498@GraphGeneration.gov + EMS_1498 + 8 + 6 + 99.9829862164092 + 145.8082474013718 + + + EMS + EMS_1566@GraphGeneration.gov + EMS_1566 + 6 + 6 + 141.44193741011307 + 157.2548871114998 + + + EMS + EMS_1571@GraphGeneration.gov + EMS_1571 + 6 + 6 + 135.33260072119617 + 160.19652404840195 + + + EMS + EMS_1574@GraphGeneration.gov + EMS_1574 + 12 + 6 + 143.04685058933052 + 157.3815903974035 + + + EMS + EMS_1575@GraphGeneration.gov + EMS_1575 + 10 + 6 + 189.24070471813874 + 150.19807239498547 + + + EMS + EMS_1577@GraphGeneration.gov + EMS_1577 + 11 + 6 + 177.95619058412677 + 166.2561458431177 + + + EMS + EMS_1579@GraphGeneration.gov + EMS_1579 + 10 + 6 + 161.14772329874262 + 168.72776870597008 + + + EMS + EMS_1581@GraphGeneration.gov + EMS_1581 + 9 + 6 + 188.04616794558063 + 155.51981649400366 + + + EMS + EMS_1583@GraphGeneration.gov + EMS_1583 + 6 + 6 + 147.72730284845423 + 168.68655996149477 + + + EMS + EMS_1657@GraphGeneration.gov + EMS_1657 + 7 + 6 + 58.361494405018895 + 189.7391196488006 + + + EMS + EMS_1658@GraphGeneration.gov + EMS_1658 + 6 + 6 + 16.309938863564202 + 193.54373836666903 + + + EMS + EMS_1660@GraphGeneration.gov + EMS_1660 + 10 + 6 + 8.100659473907776 + 183.65109373772037 + + + EMS + EMS_1668@GraphGeneration.gov + EMS_1668 + 12 + 6 + 10.112206243368904 + 178.76480041458365 + + + EMS + EMS_1669@GraphGeneration.gov + EMS_1669 + 6 + 6 + 9.899415334923608 + 196.92465802678748 + + + EMS + EMS_1671@GraphGeneration.gov + EMS_1671 + 7 + 6 + 50.099165622955596 + 184.27344975295856 + + + EMS + EMS_1675@GraphGeneration.gov + EMS_1675 + 9 + 6 + 48.37249814823494 + 192.09015605195233 + + + EMS + EMS_1679@GraphGeneration.gov + EMS_1679 + 11 + 6 + 16.107232624872193 + 197.03320641766285 + + + EMS + EMS_1680@GraphGeneration.gov + EMS_1680 + 10 + 6 + 5.2882495849075895 + 179.33850304230455 + + + EMS + EMS_1681@GraphGeneration.gov + EMS_1681 + 6 + 6 + 34.89033727188682 + 199.16454836579217 + + + EMS + EMS_1684@GraphGeneration.gov + EMS_1684 + 10 + 6 + 52.40532161511462 + 179.21553242953368 + + + EMS + EMS_1753@GraphGeneration.gov + EMS_1753 + 11 + 6 + 105.55190758392003 + 178.33137646766022 + + + EMS + EMS_1767@GraphGeneration.gov + EMS_1767 + 7 + 6 + 114.3859280211994 + 196.77164672940796 + + + EMS + EMS_1769@GraphGeneration.gov + EMS_1769 + 12 + 6 + 122.70140607645243 + 195.69301733462336 + + + EMS + EMS_1771@GraphGeneration.gov + EMS_1771 + 9 + 6 + 107.87041007980488 + 192.83343058584305 + + + EMS + EMS_1844@GraphGeneration.gov + EMS_1844 + 7 + 6 + 149.26581065874817 + 178.38568578489753 + + + EMS + EMS_1846@GraphGeneration.gov + EMS_1846 + 8 + 6 + 183.37042286674074 + 172.4336316313108 + + + EMS + EMS_1853@GraphGeneration.gov + EMS_1853 + 10 + 6 + 149.4085664851389 + 185.82834099290875 + + + EMS + EMS_1855@GraphGeneration.gov + EMS_1855 + 9 + 6 + 150.134309740521 + 186.05789461806788 + + + EMS + EMS_1856@GraphGeneration.gov + EMS_1856 + 6 + 6 + 181.66272427519644 + 195.92388044439286 + + + EMS + EMS_1864@GraphGeneration.gov + EMS_1864 + 7 + 6 + 169.02416815794857 + 197.94364019435963 + + + FIRE + FIRE_31@GraphGeneration.gov + FIRE_31 + 8 + 6 + 9.207556300095963 + 20.597746987773224 + + + FIRE + FIRE_35@GraphGeneration.gov + FIRE_35 + 9 + 6 + 45.421599756641584 + 20.09814012543596 + + + FIRE + FIRE_40@GraphGeneration.gov + FIRE_40 + 9 + 6 + 3.9845410851147904 + 8.318756241921205 + + + FIRE + FIRE_45@GraphGeneration.gov + FIRE_45 + 11 + 6 + 21.906299493312694 + 0.028163284625388436 + + + FIRE + FIRE_48@GraphGeneration.gov + FIRE_48 + 10 + 6 + 36.20355864168486 + 19.57914973575831 + + + FIRE + FIRE_49@GraphGeneration.gov + FIRE_49 + 10 + 6 + 14.882516887710652 + 24.880215448031922 + + + FIRE + FIRE_50@GraphGeneration.gov + FIRE_50 + 11 + 6 + 37.79667829351956 + 0.6941723116521891 + + + FIRE + FIRE_53@GraphGeneration.gov + FIRE_53 + 11 + 6 + 15.177328163906926 + 21.476711760161812 + + + FIRE + FIRE_54@GraphGeneration.gov + FIRE_54 + 11 + 6 + 56.421430008476 + 11.50272665336304 + + + FIRE + FIRE_55@GraphGeneration.gov + FIRE_55 + 12 + 6 + 9.572052347328164 + 22.77566790208278 + + + FIRE + FIRE_58@GraphGeneration.gov + FIRE_58 + 10 + 6 + 65.83103193971151 + 7.945329429143868 + + + FIRE + FIRE_126@GraphGeneration.gov + FIRE_126 + 8 + 6 + 87.17912628431834 + 26.283413158549475 + + + FIRE + FIRE_129@GraphGeneration.gov + FIRE_129 + 12 + 6 + 100.71869708301953 + 0.08981087765922119 + + + FIRE + FIRE_131@GraphGeneration.gov + FIRE_131 + 8 + 6 + 66.96121677775665 + 12.886633838632276 + + + FIRE + FIRE_133@GraphGeneration.gov + FIRE_133 + 6 + 6 + 128.59489781042475 + 10.672179593210059 + + + FIRE + FIRE_134@GraphGeneration.gov + FIRE_134 + 10 + 6 + 121.48441685979553 + 1.3981919302513817 + + + FIRE + FIRE_139@GraphGeneration.gov + FIRE_139 + 8 + 6 + 110.9719484215506 + 12.344081258154304 + + + FIRE + FIRE_140@GraphGeneration.gov + FIRE_140 + 11 + 6 + 117.7833535860358 + 3.682180086831407 + + + FIRE + FIRE_142@GraphGeneration.gov + FIRE_142 + 8 + 6 + 131.31352825246674 + 13.494755034430181 + + + FIRE + FIRE_143@GraphGeneration.gov + FIRE_143 + 11 + 6 + 79.6495787501356 + 4.850691922096338 + + + FIRE + FIRE_146@GraphGeneration.gov + FIRE_146 + 7 + 6 + 76.15369633010567 + 20.96530301207304 + + + FIRE + FIRE_150@GraphGeneration.gov + FIRE_150 + 12 + 6 + 77.95031831702559 + 11.824956962074985 + + + FIRE + FIRE_225@GraphGeneration.gov + FIRE_225 + 12 + 6 + 167.81623480810805 + 10.687171801619828 + + + FIRE + FIRE_226@GraphGeneration.gov + FIRE_226 + 10 + 6 + 145.78938560707888 + 8.611136845710194 + + + FIRE + FIRE_227@GraphGeneration.gov + FIRE_227 + 12 + 6 + 135.68339411558563 + 4.818755589119588 + + + FIRE + FIRE_228@GraphGeneration.gov + FIRE_228 + 7 + 6 + 147.55378102749745 + 3.9651175941342234 + + + FIRE + FIRE_229@GraphGeneration.gov + FIRE_229 + 8 + 6 + 187.24101056797096 + 18.485904649495687 + + + FIRE + FIRE_230@GraphGeneration.gov + FIRE_230 + 9 + 6 + 187.61015296931924 + 4.688485777590636 + + + FIRE + FIRE_238@GraphGeneration.gov + FIRE_238 + 8 + 6 + 165.5260757588631 + 23.177248848479557 + + + FIRE + FIRE_239@GraphGeneration.gov + FIRE_239 + 8 + 6 + 144.00792273610617 + 10.799619054164461 + + + FIRE + FIRE_242@GraphGeneration.gov + FIRE_242 + 7 + 6 + 193.74861669930496 + 16.359268148865063 + + + FIRE + FIRE_308@GraphGeneration.gov + FIRE_308 + 11 + 6 + 19.39079797631056 + 47.72048935529895 + + + FIRE + FIRE_309@GraphGeneration.gov + FIRE_309 + 7 + 6 + 37.963547650242795 + 51.67623306298722 + + + FIRE + FIRE_313@GraphGeneration.gov + FIRE_313 + 6 + 6 + 21.145605515875552 + 50.54196054843541 + + + FIRE + FIRE_315@GraphGeneration.gov + FIRE_315 + 9 + 6 + 32.47721149689665 + 38.75140305313905 + + + FIRE + FIRE_319@GraphGeneration.gov + FIRE_319 + 9 + 6 + 5.246474065577826 + 43.806794444060515 + + + FIRE + FIRE_320@GraphGeneration.gov + FIRE_320 + 10 + 6 + 55.169070872989096 + 52.75583440908757 + + + FIRE + FIRE_323@GraphGeneration.gov + FIRE_323 + 9 + 6 + 18.05382773523233 + 54.67715370375733 + + + FIRE + FIRE_329@GraphGeneration.gov + FIRE_329 + 9 + 6 + 29.430616156761424 + 49.46853314345006 + + + FIRE + FIRE_332@GraphGeneration.gov + FIRE_332 + 11 + 6 + 52.17595303523966 + 51.99672023785168 + + + FIRE + FIRE_399@GraphGeneration.gov + FIRE_399 + 10 + 6 + 92.73316156174131 + 41.2870729148936 + + + FIRE + FIRE_401@GraphGeneration.gov + FIRE_401 + 11 + 6 + 113.5540587946084 + 41.49999758646793 + + + FIRE + FIRE_402@GraphGeneration.gov + FIRE_402 + 7 + 6 + 99.9915741527879 + 38.25166780482435 + + + FIRE + FIRE_404@GraphGeneration.gov + FIRE_404 + 8 + 6 + 79.36090178260781 + 51.551534539438556 + + + FIRE + FIRE_405@GraphGeneration.gov + FIRE_405 + 9 + 6 + 121.61135242113099 + 51.46155184432605 + + + FIRE + FIRE_407@GraphGeneration.gov + FIRE_407 + 8 + 6 + 113.40062212067251 + 45.29164526966383 + + + FIRE + FIRE_411@GraphGeneration.gov + FIRE_411 + 9 + 6 + 84.27917069769484 + 36.910708854687904 + + + FIRE + FIRE_412@GraphGeneration.gov + FIRE_412 + 8 + 6 + 98.83960778311692 + 52.11629611870038 + + + FIRE + FIRE_415@GraphGeneration.gov + FIRE_415 + 12 + 6 + 76.47704397356199 + 51.72934148917494 + + + FIRE + FIRE_418@GraphGeneration.gov + FIRE_418 + 10 + 6 + 66.70678590140238 + 40.864810749211486 + + + FIRE + FIRE_419@GraphGeneration.gov + FIRE_419 + 11 + 6 + 95.30983813993177 + 55.60356108419889 + + + FIRE + FIRE_422@GraphGeneration.gov + FIRE_422 + 11 + 6 + 71.37503275758276 + 44.41977695860838 + + + FIRE + FIRE_494@GraphGeneration.gov + FIRE_494 + 7 + 6 + 141.0061585356385 + 33.827108426712414 + + + FIRE + FIRE_500@GraphGeneration.gov + FIRE_500 + 7 + 6 + 148.66653844200394 + 50.22315361510498 + + + FIRE + FIRE_503@GraphGeneration.gov + FIRE_503 + 11 + 6 + 152.2649994095763 + 53.07734675659121 + + + FIRE + FIRE_507@GraphGeneration.gov + FIRE_507 + 9 + 6 + 147.4327657380386 + 42.08259520444051 + + + FIRE + FIRE_511@GraphGeneration.gov + FIRE_511 + 9 + 6 + 172.39357862813665 + 44.14988013410325 + + + FIRE + FIRE_515@GraphGeneration.gov + FIRE_515 + 8 + 6 + 195.23197402712594 + 42.270345926941005 + + + FIRE + FIRE_516@GraphGeneration.gov + FIRE_516 + 7 + 6 + 134.494663609205 + 43.53105154083578 + + + FIRE + FIRE_518@GraphGeneration.gov + FIRE_518 + 12 + 6 + 153.77334391000647 + 40.26956772346261 + + + FIRE + FIRE_583@GraphGeneration.gov + FIRE_583 + 8 + 6 + 6.281086780663052 + 61.03509225328853 + + + FIRE + FIRE_584@GraphGeneration.gov + FIRE_584 + 8 + 6 + 44.75926210212255 + 77.48766962791811 + + + FIRE + FIRE_594@GraphGeneration.gov + FIRE_594 + 12 + 6 + 60.98007700648892 + 68.80695699038593 + + + FIRE + FIRE_596@GraphGeneration.gov + FIRE_596 + 7 + 6 + 54.40295551115383 + 66.2760993226399 + + + FIRE + FIRE_600@GraphGeneration.gov + FIRE_600 + 8 + 6 + 51.392173549879985 + 67.26328382908098 + + + FIRE + FIRE_602@GraphGeneration.gov + FIRE_602 + 11 + 6 + 13.28431740225163 + 57.63611867259152 + + + FIRE + FIRE_606@GraphGeneration.gov + FIRE_606 + 8 + 6 + 6.633717596743842 + 82.29797905602932 + + + FIRE + FIRE_676@GraphGeneration.gov + FIRE_676 + 12 + 6 + 117.56772049623882 + 64.39876991444267 + + + FIRE + FIRE_681@GraphGeneration.gov + FIRE_681 + 7 + 6 + 66.96422306905843 + 81.9980623768112 + + + FIRE + FIRE_683@GraphGeneration.gov + FIRE_683 + 7 + 6 + 125.91062816954619 + 77.55982522915315 + + + FIRE + FIRE_685@GraphGeneration.gov + FIRE_685 + 10 + 6 + 81.07357105433485 + 68.38646417762412 + + + FIRE + FIRE_687@GraphGeneration.gov + FIRE_687 + 11 + 6 + 107.39903538101672 + 78.68222252595922 + + + FIRE + FIRE_695@GraphGeneration.gov + FIRE_695 + 7 + 6 + 130.78653395671233 + 73.87860077769528 + + + FIRE + FIRE_697@GraphGeneration.gov + FIRE_697 + 8 + 6 + 124.12994116661656 + 79.8418252699014 + + + FIRE + FIRE_702@GraphGeneration.gov + FIRE_702 + 12 + 6 + 84.29385208417686 + 60.6630092685321 + + + FIRE + FIRE_768@GraphGeneration.gov + FIRE_768 + 12 + 6 + 194.75821406377162 + 59.00367912720661 + + + FIRE + FIRE_770@GraphGeneration.gov + FIRE_770 + 6 + 6 + 148.25430089340165 + 81.3836275785727 + + + FIRE + FIRE_771@GraphGeneration.gov + FIRE_771 + 8 + 6 + 148.8307253060276 + 85.06462492631087 + + + FIRE + FIRE_772@GraphGeneration.gov + FIRE_772 + 11 + 6 + 170.7867919677484 + 70.75201948591109 + + + FIRE + FIRE_782@GraphGeneration.gov + FIRE_782 + 10 + 6 + 141.47679538329334 + 64.66782932677717 + + + FIRE + FIRE_783@GraphGeneration.gov + FIRE_783 + 9 + 6 + 142.89005007753042 + 75.5471459789196 + + + FIRE + FIRE_796@GraphGeneration.gov + FIRE_796 + 10 + 6 + 198.30670019345717 + 80.34394369843746 + + + FIRE + FIRE_859@GraphGeneration.gov + FIRE_859 + 7 + 6 + 27.110081979373163 + 97.56295667856254 + + + FIRE + FIRE_860@GraphGeneration.gov + FIRE_860 + 7 + 6 + 55.86898024640101 + 86.30164494616555 + + + FIRE + FIRE_867@GraphGeneration.gov + FIRE_867 + 8 + 6 + 65.17515111503153 + 111.58286537755315 + + + FIRE + FIRE_872@GraphGeneration.gov + FIRE_872 + 12 + 6 + 55.2356086002192 + 111.31886694379484 + + + FIRE + FIRE_874@GraphGeneration.gov + FIRE_874 + 6 + 6 + 47.203188239981635 + 99.47328739621749 + + + FIRE + FIRE_881@GraphGeneration.gov + FIRE_881 + 12 + 6 + 18.16262225809106 + 90.51569856525714 + + + FIRE + FIRE_883@GraphGeneration.gov + FIRE_883 + 12 + 6 + 6.825549678560165 + 114.24758566041038 + + + FIRE + FIRE_960@GraphGeneration.gov + FIRE_960 + 8 + 6 + 113.01143264643622 + 101.93012402916396 + + + FIRE + FIRE_966@GraphGeneration.gov + FIRE_966 + 10 + 6 + 89.54125061694936 + 95.91886249514764 + + + FIRE + FIRE_969@GraphGeneration.gov + FIRE_969 + 7 + 6 + 94.30676398711242 + 89.89653067965159 + + + FIRE + FIRE_970@GraphGeneration.gov + FIRE_970 + 7 + 6 + 99.24276597936718 + 97.89900175783461 + + + FIRE + FIRE_971@GraphGeneration.gov + FIRE_971 + 9 + 6 + 117.91308517262607 + 114.16864970660592 + + + FIRE + FIRE_980@GraphGeneration.gov + FIRE_980 + 11 + 6 + 123.02133825433441 + 112.13421115687031 + + + FIRE + FIRE_1043@GraphGeneration.gov + FIRE_1043 + 7 + 6 + 164.33358186038546 + 113.99156706013079 + + + FIRE + FIRE_1045@GraphGeneration.gov + FIRE_1045 + 8 + 6 + 158.77445016415675 + 111.342470388103 + + + FIRE + FIRE_1060@GraphGeneration.gov + FIRE_1060 + 7 + 6 + 161.01007125441276 + 107.70638153277524 + + + FIRE + FIRE_1065@GraphGeneration.gov + FIRE_1065 + 10 + 6 + 141.89203315218847 + 86.26318894341084 + + + FIRE + FIRE_1072@GraphGeneration.gov + FIRE_1072 + 10 + 6 + 190.1684905549835 + 86.92185257699445 + + + FIRE + FIRE_1135@GraphGeneration.gov + FIRE_1135 + 11 + 6 + 54.14873959748308 + 134.25369607820187 + + + FIRE + FIRE_1136@GraphGeneration.gov + FIRE_1136 + 9 + 6 + 55.70355602047234 + 130.68743568159783 + + + FIRE + FIRE_1139@GraphGeneration.gov + FIRE_1139 + 11 + 6 + 22.376155162658474 + 141.2873220604604 + + + FIRE + FIRE_1142@GraphGeneration.gov + FIRE_1142 + 9 + 6 + 16.889055718894216 + 130.70425946227863 + + + FIRE + FIRE_1146@GraphGeneration.gov + FIRE_1146 + 6 + 6 + 53.762410943440905 + 122.08650907285373 + + + FIRE + FIRE_1153@GraphGeneration.gov + FIRE_1153 + 11 + 6 + 26.150905569537137 + 139.62322579550948 + + + FIRE + FIRE_1156@GraphGeneration.gov + FIRE_1156 + 8 + 6 + 65.34679178525211 + 120.23883361069302 + + + FIRE + FIRE_1157@GraphGeneration.gov + FIRE_1157 + 12 + 6 + 33.59377399046832 + 131.92662881458205 + + + FIRE + FIRE_1160@GraphGeneration.gov + FIRE_1160 + 8 + 6 + 64.98778558643457 + 125.20009503305988 + + + FIRE + FIRE_1161@GraphGeneration.gov + FIRE_1161 + 8 + 6 + 42.64444158247167 + 133.69842521855986 + + + FIRE + FIRE_1163@GraphGeneration.gov + FIRE_1163 + 9 + 6 + 25.04356488445454 + 121.07674305613308 + + + FIRE + FIRE_1238@GraphGeneration.gov + FIRE_1238 + 11 + 6 + 110.62408702798118 + 129.62060826552047 + + + FIRE + FIRE_1244@GraphGeneration.gov + FIRE_1244 + 9 + 6 + 118.84252829936173 + 140.44955538168207 + + + FIRE + FIRE_1246@GraphGeneration.gov + FIRE_1246 + 11 + 6 + 84.17951398115542 + 115.8841758801842 + + + FIRE + FIRE_1248@GraphGeneration.gov + FIRE_1248 + 11 + 6 + 133.16174681653064 + 136.8216900942656 + + + FIRE + FIRE_1256@GraphGeneration.gov + FIRE_1256 + 8 + 6 + 92.48442046336483 + 117.85628396478934 + + + FIRE + FIRE_1326@GraphGeneration.gov + FIRE_1326 + 10 + 6 + 198.2808285790175 + 118.04780507457667 + + + FIRE + FIRE_1334@GraphGeneration.gov + FIRE_1334 + 9 + 6 + 170.8536105632048 + 117.02941995694789 + + + FIRE + FIRE_1338@GraphGeneration.gov + FIRE_1338 + 6 + 6 + 185.00484414271187 + 115.74430485753258 + + + FIRE + FIRE_1341@GraphGeneration.gov + FIRE_1341 + 6 + 6 + 142.32984843706737 + 114.50342553575243 + + + FIRE + FIRE_1343@GraphGeneration.gov + FIRE_1343 + 6 + 6 + 172.8637116210469 + 132.33891677375794 + + + FIRE + FIRE_1346@GraphGeneration.gov + FIRE_1346 + 12 + 6 + 191.46617596844746 + 137.67048501919768 + + + FIRE + FIRE_1347@GraphGeneration.gov + FIRE_1347 + 10 + 6 + 174.755116597576 + 139.19132107825294 + + + FIRE + FIRE_1348@GraphGeneration.gov + FIRE_1348 + 11 + 6 + 160.25244916800324 + 123.15512614358968 + + + FIRE + FIRE_1411@GraphGeneration.gov + FIRE_1411 + 6 + 6 + 10.161007144369643 + 147.95967963953132 + + + FIRE + FIRE_1413@GraphGeneration.gov + FIRE_1413 + 11 + 6 + 52.57386074791479 + 152.1744858387756 + + + FIRE + FIRE_1415@GraphGeneration.gov + FIRE_1415 + 7 + 6 + 35.94909124160886 + 148.4863781888748 + + + FIRE + FIRE_1416@GraphGeneration.gov + FIRE_1416 + 11 + 6 + 55.65487182809714 + 158.4991351307982 + + + FIRE + FIRE_1420@GraphGeneration.gov + FIRE_1420 + 6 + 6 + 16.096458204347567 + 148.95074853977135 + + + FIRE + FIRE_1421@GraphGeneration.gov + FIRE_1421 + 11 + 6 + 24.17113637584608 + 148.86110888448135 + + + FIRE + FIRE_1423@GraphGeneration.gov + FIRE_1423 + 9 + 6 + 57.642119600088826 + 150.81436038022113 + + + FIRE + FIRE_1425@GraphGeneration.gov + FIRE_1425 + 11 + 6 + 54.198042454371745 + 156.7690714763112 + + + FIRE + FIRE_1426@GraphGeneration.gov + FIRE_1426 + 10 + 6 + 7.622730711700728 + 169.32270697566958 + + + FIRE + FIRE_1427@GraphGeneration.gov + FIRE_1427 + 6 + 6 + 28.236746226497072 + 159.2461999564838 + + + FIRE + FIRE_1428@GraphGeneration.gov + FIRE_1428 + 11 + 6 + 38.16746776503991 + 170.47152691716363 + + + FIRE + FIRE_1430@GraphGeneration.gov + FIRE_1430 + 9 + 6 + 45.78359413207609 + 143.0110134302749 + + + FIRE + FIRE_1505@GraphGeneration.gov + FIRE_1505 + 12 + 6 + 70.11985071544575 + 152.69140751700795 + + + FIRE + FIRE_1507@GraphGeneration.gov + FIRE_1507 + 9 + 6 + 119.8742639610463 + 143.14737014999636 + + + FIRE + FIRE_1509@GraphGeneration.gov + FIRE_1509 + 9 + 6 + 107.58256754046181 + 155.0879771777383 + + + FIRE + FIRE_1511@GraphGeneration.gov + FIRE_1511 + 12 + 6 + 124.28672148957689 + 163.57050909042545 + + + FIRE + FIRE_1520@GraphGeneration.gov + FIRE_1520 + 9 + 6 + 108.6643668624817 + 151.82501599022225 + + + FIRE + FIRE_1523@GraphGeneration.gov + FIRE_1523 + 11 + 6 + 89.63066515400679 + 159.55264915551004 + + + FIRE + FIRE_1525@GraphGeneration.gov + FIRE_1525 + 9 + 6 + 86.02313171871442 + 147.53850628756817 + + + FIRE + FIRE_1527@GraphGeneration.gov + FIRE_1527 + 12 + 6 + 75.47939098327255 + 154.93040089484654 + + + FIRE + FIRE_1532@GraphGeneration.gov + FIRE_1532 + 9 + 6 + 121.49856602927872 + 142.9265350317031 + + + FIRE + FIRE_1596@GraphGeneration.gov + FIRE_1596 + 6 + 6 + 152.3584933032279 + 163.7355683352391 + + + FIRE + FIRE_1599@GraphGeneration.gov + FIRE_1599 + 7 + 6 + 160.50669818018832 + 146.20609523989384 + + + FIRE + FIRE_1607@GraphGeneration.gov + FIRE_1607 + 6 + 6 + 144.39782923076643 + 166.80533341563873 + + + FIRE + FIRE_1610@GraphGeneration.gov + FIRE_1610 + 6 + 6 + 140.39176377179191 + 166.25164285261866 + + + FIRE + FIRE_1611@GraphGeneration.gov + FIRE_1611 + 12 + 6 + 187.20879742318152 + 153.35836156178513 + + + FIRE + FIRE_1613@GraphGeneration.gov + FIRE_1613 + 10 + 6 + 148.25323723234436 + 161.64097942555844 + + + FIRE + FIRE_1614@GraphGeneration.gov + FIRE_1614 + 6 + 6 + 179.47450712407561 + 165.11834753376633 + + + FIRE + FIRE_1620@GraphGeneration.gov + FIRE_1620 + 10 + 6 + 193.84415308688313 + 146.3508637164472 + + + FIRE + FIRE_1691@GraphGeneration.gov + FIRE_1691 + 9 + 6 + 23.852298291564377 + 178.32333449468496 + + + FIRE + FIRE_1693@GraphGeneration.gov + FIRE_1693 + 11 + 6 + 55.72566177157897 + 181.02619481612012 + + + FIRE + FIRE_1696@GraphGeneration.gov + FIRE_1696 + 11 + 6 + 66.09285810928519 + 175.57601013870604 + + + FIRE + FIRE_1697@GraphGeneration.gov + FIRE_1697 + 8 + 6 + 24.156823736682274 + 197.37179801935756 + + + FIRE + FIRE_1715@GraphGeneration.gov + FIRE_1715 + 6 + 6 + 27.585786336894888 + 178.99150539688912 + + + FIRE + FIRE_1780@GraphGeneration.gov + FIRE_1780 + 11 + 6 + 118.36466193079211 + 188.15831148422504 + + + FIRE + FIRE_1785@GraphGeneration.gov + FIRE_1785 + 12 + 6 + 77.05040821455879 + 177.81720572831364 + + + FIRE + FIRE_1796@GraphGeneration.gov + FIRE_1796 + 6 + 6 + 88.00665520592314 + 186.27752461163618 + + + FIRE + FIRE_1797@GraphGeneration.gov + FIRE_1797 + 7 + 6 + 74.69414182601287 + 198.65713278313223 + + + FIRE + FIRE_1798@GraphGeneration.gov + FIRE_1798 + 8 + 6 + 82.8809799583146 + 184.68451035581455 + + + FIRE + FIRE_1799@GraphGeneration.gov + FIRE_1799 + 8 + 6 + 126.68840665764303 + 173.59189071302583 + + + FIRE + FIRE_1801@GraphGeneration.gov + FIRE_1801 + 12 + 6 + 89.89881365517522 + 171.91553348551815 + + + FIRE + FIRE_1802@GraphGeneration.gov + FIRE_1802 + 9 + 6 + 119.2426436863307 + 187.80548293855648 + + + FIRE + FIRE_1805@GraphGeneration.gov + FIRE_1805 + 12 + 6 + 85.15679981614639 + 183.36847712218804 + + + FIRE + FIRE_1873@GraphGeneration.gov + FIRE_1873 + 9 + 6 + 159.16577103140128 + 185.95996911003166 + + + FIRE + FIRE_1874@GraphGeneration.gov + FIRE_1874 + 10 + 6 + 191.96018493588883 + 184.24701804908207 + + + FIRE + FIRE_1884@GraphGeneration.gov + FIRE_1884 + 9 + 6 + 180.36691859133066 + 177.59699654882795 + + + FIRE + FIRE_1891@GraphGeneration.gov + FIRE_1891 + 10 + 6 + 141.72496067328512 + 187.60066185618373 + + + FIRE + FIRE_1894@GraphGeneration.gov + FIRE_1894 + 10 + 6 + 190.68754358597317 + 189.185165677892 + + + FIRE + FIRE_1895@GraphGeneration.gov + FIRE_1895 + 9 + 6 + 189.95748484569287 + 173.05686239190305 + + + FIRE + FIRE_1897@GraphGeneration.gov + FIRE_1897 + 9 + 6 + 191.04159002152346 + 190.49559927789846 + + + FIRE + FIRE_1900@GraphGeneration.gov + FIRE_1900 + 10 + 6 + 136.5070549507386 + 191.86132558267707 + + + LAW + LAW_62@GraphGeneration.gov + LAW_62 + 11 + 6 + 8.071273555046082 + 12.983129183943626 + + + LAW + LAW_69@GraphGeneration.gov + LAW_69 + 7 + 6 + 22.457525292347547 + 2.2780251771050604 + + + LAW + LAW_74@GraphGeneration.gov + LAW_74 + 6 + 6 + 24.501214946422607 + 7.365776996240113 + + + LAW + LAW_76@GraphGeneration.gov + LAW_76 + 11 + 6 + 58.3741650234566 + 25.745734312931337 + + + LAW + LAW_79@GraphGeneration.gov + LAW_79 + 10 + 6 + 66.6551943841176 + 27.120873412362254 + + + LAW + LAW_80@GraphGeneration.gov + LAW_80 + 10 + 6 + 30.366749288681824 + 14.14170306318767 + + + LAW + LAW_84@GraphGeneration.gov + LAW_84 + 12 + 6 + 41.35180394430549 + 24.22648405349615 + + + LAW + LAW_87@GraphGeneration.gov + LAW_87 + 8 + 6 + 53.63163811232599 + 28.37922233299979 + + + LAW + LAW_90@GraphGeneration.gov + LAW_90 + 11 + 6 + 21.638061148094103 + 20.08424983073117 + + + LAW + LAW_156@GraphGeneration.gov + LAW_156 + 9 + 6 + 68.56330165315899 + 23.746307753618325 + + + LAW + LAW_159@GraphGeneration.gov + LAW_159 + 9 + 6 + 121.43069204033137 + 12.640202580713698 + + + LAW + LAW_165@GraphGeneration.gov + LAW_165 + 12 + 6 + 86.03343911389659 + 19.63364834546613 + + + LAW + LAW_167@GraphGeneration.gov + LAW_167 + 6 + 6 + 117.53178723354674 + 22.986645827511484 + + + LAW + LAW_172@GraphGeneration.gov + LAW_172 + 9 + 6 + 91.38471475853808 + 25.758997200178776 + + + LAW + LAW_174@GraphGeneration.gov + LAW_174 + 11 + 6 + 116.04565307722552 + 16.391372685776695 + + + LAW + LAW_176@GraphGeneration.gov + LAW_176 + 9 + 6 + 71.50498111726684 + 18.562896791993552 + + + LAW + LAW_179@GraphGeneration.gov + LAW_179 + 7 + 6 + 112.46770024529553 + 8.223430017603903 + + + LAW + LAW_248@GraphGeneration.gov + LAW_248 + 8 + 6 + 198.29179423204738 + 4.586398286375653 + + + LAW + LAW_257@GraphGeneration.gov + LAW_257 + 11 + 6 + 151.98190969922558 + 11.01647804217379 + + + LAW + LAW_261@GraphGeneration.gov + LAW_261 + 9 + 6 + 167.23528020117223 + 9.605322524521434 + + + LAW + LAW_262@GraphGeneration.gov + LAW_262 + 10 + 6 + 193.68463114556425 + 4.789596024875412 + + + LAW + LAW_264@GraphGeneration.gov + LAW_264 + 12 + 6 + 193.33245011066128 + 17.52999521849482 + + + LAW + LAW_265@GraphGeneration.gov + LAW_265 + 12 + 6 + 140.72258905692127 + 20.577452733427606 + + + LAW + LAW_266@GraphGeneration.gov + LAW_266 + 9 + 6 + 151.25504954251295 + 19.87806697788139 + + + LAW + LAW_270@GraphGeneration.gov + LAW_270 + 7 + 6 + 195.49708177585234 + 18.52052664174878 + + + LAW + LAW_343@GraphGeneration.gov + LAW_343 + 10 + 6 + 1.9768479926903784 + 49.46077881054438 + + + LAW + LAW_345@GraphGeneration.gov + LAW_345 + 12 + 6 + 0.31165428189122346 + 46.6160987228401 + + + LAW + LAW_353@GraphGeneration.gov + LAW_353 + 11 + 6 + 24.289428184553465 + 30.751263577537365 + + + LAW + LAW_355@GraphGeneration.gov + LAW_355 + 7 + 6 + 59.565048702120826 + 32.29093290431986 + + + LAW + LAW_360@GraphGeneration.gov + LAW_360 + 6 + 6 + 62.70857698743547 + 51.67189310940903 + + + LAW + LAW_363@GraphGeneration.gov + LAW_363 + 7 + 6 + 55.73606386172908 + 53.11821324019623 + + + LAW + LAW_430@GraphGeneration.gov + LAW_430 + 11 + 6 + 100.778771920546 + 54.98787415666344 + + + LAW + LAW_433@GraphGeneration.gov + LAW_433 + 8 + 6 + 79.72220399704074 + 51.7522451340223 + + + LAW + LAW_434@GraphGeneration.gov + LAW_434 + 10 + 6 + 94.14541776180721 + 42.918339382534946 + + + LAW + LAW_435@GraphGeneration.gov + LAW_435 + 11 + 6 + 93.04719122638049 + 47.570813055468804 + + + LAW + LAW_438@GraphGeneration.gov + LAW_438 + 7 + 6 + 126.79747731938411 + 44.307004708908 + + + LAW + LAW_441@GraphGeneration.gov + LAW_441 + 9 + 6 + 102.83887340546883 + 45.55974995262498 + + + LAW + LAW_444@GraphGeneration.gov + LAW_444 + 10 + 6 + 127.60797537144622 + 55.28008444071192 + + + LAW + LAW_446@GraphGeneration.gov + LAW_446 + 6 + 6 + 113.86737493402586 + 47.043781281639255 + + + LAW + LAW_448@GraphGeneration.gov + LAW_448 + 7 + 6 + 132.14416620181882 + 50.11259670517509 + + + LAW + LAW_453@GraphGeneration.gov + LAW_453 + 6 + 6 + 84.94042422469869 + 49.477302432964755 + + + LAW + LAW_457@GraphGeneration.gov + LAW_457 + 10 + 6 + 73.22149150988199 + 43.87687140356069 + + + LAW + LAW_521@GraphGeneration.gov + LAW_521 + 11 + 6 + 179.5393304358358 + 35.36578107615213 + + + LAW + LAW_524@GraphGeneration.gov + LAW_524 + 7 + 6 + 172.96709440681315 + 42.35805242083244 + + + LAW + LAW_527@GraphGeneration.gov + LAW_527 + 8 + 6 + 167.5442581627492 + 45.528332847208155 + + + LAW + LAW_529@GraphGeneration.gov + LAW_529 + 9 + 6 + 165.97189719587217 + 44.40798725258254 + + + LAW + LAW_533@GraphGeneration.gov + LAW_533 + 10 + 6 + 197.46721748289667 + 48.71137508778557 + + + LAW + LAW_536@GraphGeneration.gov + LAW_536 + 10 + 6 + 196.31241811112983 + 31.52967000831231 + + + LAW + LAW_541@GraphGeneration.gov + LAW_541 + 7 + 6 + 189.1784796092055 + 39.307269869942665 + + + LAW + LAW_545@GraphGeneration.gov + LAW_545 + 7 + 6 + 161.7826237961951 + 31.26518281371564 + + + LAW + LAW_613@GraphGeneration.gov + LAW_613 + 9 + 6 + 16.493413358786025 + 59.41614390964615 + + + LAW + LAW_617@GraphGeneration.gov + LAW_617 + 10 + 6 + 19.78093651473376 + 70.71909048260733 + + + LAW + LAW_620@GraphGeneration.gov + LAW_620 + 11 + 6 + 20.467361524134976 + 74.63086448389578 + + + LAW + LAW_621@GraphGeneration.gov + LAW_621 + 12 + 6 + 51.709609402314676 + 77.10434476877013 + + + LAW + LAW_634@GraphGeneration.gov + LAW_634 + 10 + 6 + 42.6241357901327 + 64.57913072881172 + + + LAW + LAW_636@GraphGeneration.gov + LAW_636 + 9 + 6 + 55.744240983167174 + 61.06750599405438 + + + LAW + LAW_639@GraphGeneration.gov + LAW_639 + 8 + 6 + 56.594758372408045 + 59.70331318729627 + + + LAW + LAW_705@GraphGeneration.gov + LAW_705 + 10 + 6 + 83.45753932476758 + 84.87643939836397 + + + LAW + LAW_708@GraphGeneration.gov + LAW_708 + 6 + 6 + 71.13618229147158 + 70.4675261592083 + + + LAW + LAW_712@GraphGeneration.gov + LAW_712 + 11 + 6 + 125.88002500797725 + 76.3246761189794 + + + LAW + LAW_717@GraphGeneration.gov + LAW_717 + 10 + 6 + 85.5271383508973 + 69.60286283831738 + + + LAW + LAW_722@GraphGeneration.gov + LAW_722 + 8 + 6 + 83.00986383382191 + 82.19855389201946 + + + LAW + LAW_733@GraphGeneration.gov + LAW_733 + 12 + 6 + 73.82572904470409 + 75.1585348864616 + + + LAW + LAW_798@GraphGeneration.gov + LAW_798 + 9 + 6 + 139.72064110727814 + 58.63865691514377 + + + LAW + LAW_800@GraphGeneration.gov + LAW_800 + 10 + 6 + 192.1480710481861 + 60.573308589439506 + + + LAW + LAW_805@GraphGeneration.gov + LAW_805 + 12 + 6 + 151.0175443611817 + 85.47392332190039 + + + LAW + LAW_806@GraphGeneration.gov + LAW_806 + 10 + 6 + 150.09519684410387 + 64.38414672020221 + + + LAW + LAW_808@GraphGeneration.gov + LAW_808 + 9 + 6 + 137.50664683911063 + 66.6900645259366 + + + LAW + LAW_812@GraphGeneration.gov + LAW_812 + 8 + 6 + 181.84955922858688 + 63.553412881934754 + + + LAW + LAW_815@GraphGeneration.gov + LAW_815 + 10 + 6 + 164.909938316095 + 78.90454923038894 + + + LAW + LAW_819@GraphGeneration.gov + LAW_819 + 11 + 6 + 176.28604676723555 + 64.28422499584188 + + + LAW + LAW_820@GraphGeneration.gov + LAW_820 + 6 + 6 + 134.65538340756228 + 64.9272706756608 + + + LAW + LAW_824@GraphGeneration.gov + LAW_824 + 8 + 6 + 198.21688239719845 + 77.40434553325744 + + + LAW + LAW_890@GraphGeneration.gov + LAW_890 + 10 + 6 + 25.79684412542179 + 107.26812190544926 + + + LAW + LAW_891@GraphGeneration.gov + LAW_891 + 9 + 6 + 45.36051653856339 + 108.52519563496215 + + + LAW + LAW_893@GraphGeneration.gov + LAW_893 + 8 + 6 + 16.460790967339722 + 108.68927951391859 + + + LAW + LAW_894@GraphGeneration.gov + LAW_894 + 8 + 6 + 2.1884066494535155 + 86.84878631831627 + + + LAW + LAW_898@GraphGeneration.gov + LAW_898 + 6 + 6 + 23.306792543684125 + 107.78729592455817 + + + LAW + LAW_900@GraphGeneration.gov + LAW_900 + 8 + 6 + 30.63229283432906 + 107.14147092441976 + + + LAW + LAW_902@GraphGeneration.gov + LAW_902 + 8 + 6 + 6.786495389101662 + 111.88145265975136 + + + LAW + LAW_908@GraphGeneration.gov + LAW_908 + 7 + 6 + 19.818463725218983 + 92.85028258328046 + + + LAW + LAW_983@GraphGeneration.gov + LAW_983 + 8 + 6 + 87.06789628087722 + 101.28531042695022 + + + LAW + LAW_984@GraphGeneration.gov + LAW_984 + 7 + 6 + 94.02142780278879 + 98.431348839014 + + + LAW + LAW_985@GraphGeneration.gov + LAW_985 + 9 + 6 + 76.14888640226611 + 104.13979888215593 + + + LAW + LAW_987@GraphGeneration.gov + LAW_987 + 8 + 6 + 67.34004736816422 + 94.67285044019222 + + + LAW + LAW_990@GraphGeneration.gov + LAW_990 + 12 + 6 + 112.34345179340482 + 93.53761009806713 + + + LAW + LAW_994@GraphGeneration.gov + LAW_994 + 12 + 6 + 131.18900064837015 + 108.94596111319481 + + + LAW + LAW_997@GraphGeneration.gov + LAW_997 + 7 + 6 + 127.36191456856807 + 92.46062591833696 + + + LAW + LAW_998@GraphGeneration.gov + LAW_998 + 6 + 6 + 82.48967555469837 + 95.85015817084069 + + + LAW + LAW_999@GraphGeneration.gov + LAW_999 + 9 + 6 + 128.900539297871 + 90.13062520294874 + + + LAW + LAW_1005@GraphGeneration.gov + LAW_1005 + 12 + 6 + 67.03205880684392 + 100.50176987686007 + + + LAW + LAW_1007@GraphGeneration.gov + LAW_1007 + 6 + 6 + 69.59030203922872 + 98.65035686237148 + + + LAW + LAW_1075@GraphGeneration.gov + LAW_1075 + 12 + 6 + 171.39873260551457 + 95.01381249070296 + + + LAW + LAW_1076@GraphGeneration.gov + LAW_1076 + 6 + 6 + 151.4370021611704 + 95.20887675797145 + + + LAW + LAW_1079@GraphGeneration.gov + LAW_1079 + 9 + 6 + 147.04462550640895 + 105.87508318827712 + + + LAW + LAW_1086@GraphGeneration.gov + LAW_1086 + 11 + 6 + 175.1963280756591 + 103.90172042295427 + + + LAW + LAW_1087@GraphGeneration.gov + LAW_1087 + 10 + 6 + 170.9955893881085 + 92.89860144603641 + + + LAW + LAW_1088@GraphGeneration.gov + LAW_1088 + 11 + 6 + 140.02377915660077 + 90.3571228086752 + + + LAW + LAW_1094@GraphGeneration.gov + LAW_1094 + 8 + 6 + 135.99701190481673 + 87.33892270877176 + + + LAW + LAW_1095@GraphGeneration.gov + LAW_1095 + 7 + 6 + 166.96948377396524 + 90.81905126809933 + + + LAW + LAW_1098@GraphGeneration.gov + LAW_1098 + 8 + 6 + 139.47795595614284 + 103.88306922671036 + + + LAW + LAW_1099@GraphGeneration.gov + LAW_1099 + 10 + 6 + 199.3355891524452 + 104.02678034813296 + + + LAW + LAW_1101@GraphGeneration.gov + LAW_1101 + 7 + 6 + 174.6293739429142 + 94.70993882836437 + + + LAW + LAW_1168@GraphGeneration.gov + LAW_1168 + 9 + 6 + 50.54252944001924 + 129.28021836451012 + + + LAW + LAW_1173@GraphGeneration.gov + LAW_1173 + 11 + 6 + 57.948827146065746 + 129.15442780857617 + + + LAW + LAW_1175@GraphGeneration.gov + LAW_1175 + 8 + 6 + 39.37951498002639 + 139.5561816689234 + + + LAW + LAW_1176@GraphGeneration.gov + LAW_1176 + 9 + 6 + 64.59815736954052 + 134.83038343572477 + + + LAW + LAW_1179@GraphGeneration.gov + LAW_1179 + 6 + 6 + 17.273239613624792 + 119.5593932115376 + + + LAW + LAW_1180@GraphGeneration.gov + LAW_1180 + 7 + 6 + 62.90690026518288 + 129.5037053690226 + + + LAW + LAW_1183@GraphGeneration.gov + LAW_1183 + 7 + 6 + 29.13309995950299 + 128.14461642568952 + + + LAW + LAW_1186@GraphGeneration.gov + LAW_1186 + 8 + 6 + 54.22439901383653 + 137.93210121857678 + + + LAW + LAW_1192@GraphGeneration.gov + LAW_1192 + 8 + 6 + 11.65735559767862 + 133.8583696343689 + + + LAW + LAW_1194@GraphGeneration.gov + LAW_1194 + 12 + 6 + 53.13082553428375 + 130.83181921305706 + + + LAW + LAW_1257@GraphGeneration.gov + LAW_1257 + 11 + 6 + 98.24654754099703 + 123.30070252154643 + + + LAW + LAW_1263@GraphGeneration.gov + LAW_1263 + 9 + 6 + 118.98698385348237 + 119.35121322183741 + + + LAW + LAW_1269@GraphGeneration.gov + LAW_1269 + 7 + 6 + 67.95163084703252 + 116.5468891695808 + + + LAW + LAW_1272@GraphGeneration.gov + LAW_1272 + 11 + 6 + 104.13652461562778 + 139.62109523406522 + + + LAW + LAW_1274@GraphGeneration.gov + LAW_1274 + 10 + 6 + 91.9688402424747 + 118.08843167264834 + + + LAW + LAW_1279@GraphGeneration.gov + LAW_1279 + 10 + 6 + 68.86061849521225 + 129.63362206480815 + + + LAW + LAW_1280@GraphGeneration.gov + LAW_1280 + 8 + 6 + 98.31407059659583 + 138.87046532009558 + + + LAW + LAW_1282@GraphGeneration.gov + LAW_1282 + 11 + 6 + 68.36760596396095 + 140.34544234865007 + + + LAW + LAW_1352@GraphGeneration.gov + LAW_1352 + 7 + 6 + 175.25629931829315 + 135.1145295135168 + + + LAW + LAW_1353@GraphGeneration.gov + LAW_1353 + 7 + 6 + 135.3790747545418 + 126.17765650579945 + + + LAW + LAW_1356@GraphGeneration.gov + LAW_1356 + 11 + 6 + 144.90457211644394 + 138.34279004402367 + + + LAW + LAW_1357@GraphGeneration.gov + LAW_1357 + 11 + 6 + 163.40387304632182 + 117.02075564288718 + + + LAW + LAW_1368@GraphGeneration.gov + LAW_1368 + 11 + 6 + 180.50251665599842 + 114.88742257840586 + + + LAW + LAW_1369@GraphGeneration.gov + LAW_1369 + 11 + 6 + 169.61872798111827 + 136.46571620994305 + + + LAW + LAW_1371@GraphGeneration.gov + LAW_1371 + 12 + 6 + 176.0920580157724 + 129.12652414987056 + + + LAW + LAW_1377@GraphGeneration.gov + LAW_1377 + 7 + 6 + 169.70337241879835 + 134.59146259146755 + + + LAW + LAW_1443@GraphGeneration.gov + LAW_1443 + 11 + 6 + 50.92211053466439 + 171.24731011345162 + + + LAW + LAW_1444@GraphGeneration.gov + LAW_1444 + 12 + 6 + 16.863496583499018 + 167.56493366043185 + + + LAW + LAW_1452@GraphGeneration.gov + LAW_1452 + 9 + 6 + 63.81581196193265 + 149.40731440434354 + + + LAW + LAW_1467@GraphGeneration.gov + LAW_1467 + 12 + 6 + 64.20594869348896 + 150.25902665657216 + + + LAW + LAW_1469@GraphGeneration.gov + LAW_1469 + 10 + 6 + 44.53232500588525 + 165.86156408907274 + + + LAW + LAW_1470@GraphGeneration.gov + LAW_1470 + 10 + 6 + 30.95813087727774 + 160.65303660504682 + + + LAW + LAW_1534@GraphGeneration.gov + LAW_1534 + 11 + 6 + 86.10399416979334 + 167.9997605695715 + + + LAW + LAW_1547@GraphGeneration.gov + LAW_1547 + 6 + 6 + 103.33094130991981 + 166.67370077128055 + + + LAW + LAW_1550@GraphGeneration.gov + LAW_1550 + 12 + 6 + 91.41578794845239 + 144.1346631408702 + + + LAW + LAW_1551@GraphGeneration.gov + LAW_1551 + 11 + 6 + 120.31701459625981 + 151.9423362542079 + + + LAW + LAW_1552@GraphGeneration.gov + LAW_1552 + 8 + 6 + 73.4966158370113 + 147.6482364759146 + + + LAW + LAW_1554@GraphGeneration.gov + LAW_1554 + 9 + 6 + 120.66029576124936 + 146.3485253736143 + + + LAW + LAW_1560@GraphGeneration.gov + LAW_1560 + 7 + 6 + 119.84136723286386 + 146.19696213838785 + + + LAW + LAW_1629@GraphGeneration.gov + LAW_1629 + 6 + 6 + 195.89866745882824 + 162.96794633821642 + + + LAW + LAW_1630@GraphGeneration.gov + LAW_1630 + 9 + 6 + 182.46792225684834 + 157.96202008019176 + + + LAW + LAW_1636@GraphGeneration.gov + LAW_1636 + 6 + 6 + 185.78024835079134 + 169.46819781350464 + + + LAW + LAW_1637@GraphGeneration.gov + LAW_1637 + 11 + 6 + 162.2939040570675 + 163.9321459523377 + + + LAW + LAW_1641@GraphGeneration.gov + LAW_1641 + 10 + 6 + 160.74974495273497 + 159.5199860753686 + + + LAW + LAW_1647@GraphGeneration.gov + LAW_1647 + 10 + 6 + 191.0730204205159 + 151.4342258881016 + + + LAW + LAW_1648@GraphGeneration.gov + LAW_1648 + 10 + 6 + 141.02444942434033 + 164.1797870643768 + + + LAW + LAW_1717@GraphGeneration.gov + LAW_1717 + 8 + 6 + 34.96835078625864 + 198.13131947831718 + + + LAW + LAW_1718@GraphGeneration.gov + LAW_1718 + 6 + 6 + 26.709856700528267 + 174.65103610971227 + + + LAW + LAW_1720@GraphGeneration.gov + LAW_1720 + 7 + 6 + 57.77954549235006 + 174.97105858584862 + + + LAW + LAW_1726@GraphGeneration.gov + LAW_1726 + 10 + 6 + 49.71003985160487 + 185.4261408423239 + + + LAW + LAW_1727@GraphGeneration.gov + LAW_1727 + 6 + 6 + 60.66829756339196 + 197.2667025131988 + + + LAW + LAW_1728@GraphGeneration.gov + LAW_1728 + 10 + 6 + 35.174264467696624 + 198.99151942426496 + + + LAW + LAW_1733@GraphGeneration.gov + LAW_1733 + 6 + 6 + 53.97833884467537 + 177.25916969501625 + + + LAW + LAW_1736@GraphGeneration.gov + LAW_1736 + 9 + 6 + 34.941827017757845 + 188.97617064706824 + + + LAW + LAW_1744@GraphGeneration.gov + LAW_1744 + 8 + 6 + 45.817979384057445 + 184.01463447584794 + + + LAW + LAW_1812@GraphGeneration.gov + LAW_1812 + 6 + 6 + 116.63056961109797 + 176.4373279852318 + + + LAW + LAW_1816@GraphGeneration.gov + LAW_1816 + 7 + 6 + 85.4973585970373 + 183.4112687272665 + + + LAW + LAW_1817@GraphGeneration.gov + LAW_1817 + 6 + 6 + 116.28070453680263 + 189.16062164869675 + + + LAW + LAW_1821@GraphGeneration.gov + LAW_1821 + 9 + 6 + 81.77460756728718 + 189.78898777420017 + + + LAW + LAW_1833@GraphGeneration.gov + LAW_1833 + 10 + 6 + 89.89911048491061 + 175.71721071529797 + + + LAW + LAW_1834@GraphGeneration.gov + LAW_1834 + 9 + 6 + 87.05930557731436 + 173.1951911742013 + + + LAW + LAW_1901@GraphGeneration.gov + LAW_1901 + 6 + 6 + 149.12160713384222 + 175.1228821150548 + + + LAW + LAW_1904@GraphGeneration.gov + LAW_1904 + 12 + 6 + 173.4209039569393 + 177.03420648141292 + + + LAW + LAW_1909@GraphGeneration.gov + LAW_1909 + 7 + 6 + 161.51565828673768 + 174.1061945612829 + + + LAW + LAW_1910@GraphGeneration.gov + LAW_1910 + 11 + 6 + 141.56000714576862 + 198.17539763373048 + + + LAW + LAW_1911@GraphGeneration.gov + LAW_1911 + 8 + 6 + 194.93625852791274 + 186.7283914950643 + + + LAW + LAW_1922@GraphGeneration.gov + LAW_1922 + 12 + 6 + 137.16975832617118 + 173.1068172467817 + + + LAW + LAW_1923@GraphGeneration.gov + LAW_1923 + 9 + 6 + 148.19877916228577 + 182.2620972223647 + + + CALR + [(28.192974734694552, 17.415591290078353), (28.211560677969743, 17.417480365770604)], [(28.222871283729518, 17.436209445042987), (28.207670873695655, 17.450480065927863)], [(28.197962638798337, 17.44237681208586), (28.211097266306446, 17.421581300802735)], [(28.196125962449905, 17.419753705924883), (28.19273563431036, 17.415580693034325)], [(28.193845480491383, 17.45697527618969), (28.178372954948596, 17.432770445033768)], [(28.20386448013184, 17.455219082428894), (28.221219191476514, 17.4304435101126)], [(28.208798314609464, 17.454853876399486), (28.20653004934609, 17.459203481209563)], [(28.22668850507996, 17.409504312040692), (28.209779152863423, 17.43231370920954)], [(28.218232574869702, 17.411888726092503), (28.229185120843013, 17.429181020651086)], [(28.203726199350974, 17.44793599807924), (28.224413848314814, 17.44680751994396)], [(28.220324841088303, 17.451847667020644), (28.230589548456916, 17.435525915298598)], [(28.218701503573758, 17.448567459353562), (28.242534147856002, 17.458357484948433)], [(28.21805929092155, 17.453432028927075), (28.22519368272828, 17.456530820701094)], [(28.196211275960653, 17.43362402990572), (28.17387119485596, 17.42645828977122)], [(28.2208920093369, 17.440063461713624), (28.209415603405148, 17.46229589159039)], [(28.21355655267654, 17.413652181400842), (28.220841943833825, 17.411582268932218)], [(28.186896768027097, 17.457638806477505), (28.19846487861809, 17.433553269746156)], [(28.18268213945676, 17.412744914325735), (28.171110790893074, 17.424377249686255)], [(28.210153038522233, 17.438806250696487), (28.233507147993958, 17.446656062544932)], [(28.22081457868258, 17.41260364707714), (28.197293670796483, 17.40515081621297)], [(28.177653978747117, 17.446072470659153), (28.154213401393143, 17.422064825910166)], [(28.185809008336303, 17.43508152996227), (28.174164063611773, 17.411814673875167)], [(28.193057545130728, 17.40939277115761), (28.19203957544722, 17.40465525596183)], [(28.21056581082882, 17.447084406662103), (28.19018957257021, 17.453887309510577)], [(28.204588001572684, 17.41809308635037), (28.22084113388628, 17.414316983366195)], [(28.18611853075481, 17.44317684048204), (28.199853401123047, 17.463677247160195)], [(28.218300061415846, 17.44893166420752), (28.238281462666176, 17.437643459040963)], [(28.18735066565492, 17.439185653216676), (28.186176019051988, 17.432009203801947)], [(28.182701192813273, 17.44093552418812), (28.1951913680219, 17.45620547116343)], [(28.224544031407003, 17.43602178793673), (28.21976739213124, 17.41449729182272)], [(28.186302161698816, 17.440462454423514), (28.180528964989843, 17.45172369241225)], [(28.210924434601523, 17.44182650320359), (28.22717612706119, 17.419728917224216)], [(28.185618901220725, 17.428927969297884), (28.196625832329094, 17.446635379206334)], [(28.215243968211922, 17.42960859800682), (28.229862014310083, 17.405056784707284)], [(28.185790946772222, 17.43039190062945), (28.161314497219813, 17.407326564496987)], [(28.18039773131813, 17.434610941173645), (28.17294169293922, 17.436055764027312)], [(28.213465756577975, 17.411889382268907), (28.207824405306052, 17.42285929892228)], [(28.180034915450328, 17.456263364285256), (28.183424886562612, 17.462323529055126)], [(28.195912784361944, 17.416350108877694), (28.176961656932708, 17.41281412818986)], [(28.225968458145545, 17.433444944031162), (28.22142217669614, 17.426901824882556)], [(28.18841507632662, 17.457016203610337), (28.175103575813328, 17.47875356025594)], [(28.196227078375916, 17.415165973278636), (28.185635226908644, 17.401489327732932)], [(28.216932499985212, 17.44738922390857), (28.20043347708565, 17.471282150985406)], [(28.209862432977673, 17.41135644198893), (28.216181756818944, 17.419072570075272)], [(28.20872185530604, 17.434762998563496), (28.229936155078757, 17.45974135963739)], [(28.180714984273944, 17.435757034993795), (28.17923868225607, 17.435919411589065)], [(28.199709321568832, 17.438002598565365), (28.21828509546324, 17.41732874646586)], [(28.20525731978783, 17.449721086387893), (28.227385442166266, 17.42657152761901)], [(28.184162283922838, 17.436889385574034), (28.186917238823586, 17.442669534875694)], [(28.198084269583262, 17.458562113829274), (28.20198253265997, 17.478050815207393)] + CALL_91@GraphGeneration.gov + CALL_91 + + + CALR + [(126.40264495399387, 25.73246460917249), (126.41142702277672, 25.72833882813784)], [(126.41690723485442, 25.73398884958931), (126.40116208522316, 25.720222535636314)], [(126.42878602297291, 25.75251353535813), (126.41446582737137, 25.73740820436559)], [(126.39485362972322, 25.734378962247483), (126.37901407326353, 25.738209988600126)], [(126.41315441532491, 25.712714835090242), (126.38848934653515, 25.73084233832396)], [(126.4424871072922, 25.7233010505723), (126.44033131306026, 25.699117162262976)], [(126.43538093522706, 25.73638700413864), (126.44237145083514, 25.74040982739848)], [(126.41792683219809, 25.749482193400578), (126.43804727326437, 25.749282754056306)], [(126.41477244404362, 25.73206777777815), (126.39980623531504, 25.742784757176256)], [(126.42569888545783, 25.748049636627773), (126.42691357874283, 25.76798150456041)], [(126.39718655642132, 25.74216476356844), (126.4110261781727, 25.758471455733904)], [(126.43893078254288, 25.721082783123762), (126.42669379348082, 25.733553164429132)], [(126.4080156365891, 25.719822201948602), (126.42589677165842, 25.70900691294754)], [(126.40603131776201, 25.716376648310288), (126.41105564108425, 25.70723826364015)], [(126.4310188689147, 25.71787294067981), (126.45527332570451, 25.69901252591847)], [(126.41183364748917, 25.761828993953614), (126.42321310353388, 25.758797922069622)], [(126.42675950692436, 25.758547981174765), (126.43075925904304, 25.75168654684621)], [(126.43214649782153, 25.761430312354864), (126.43703778893124, 25.771307386442906)], [(126.41371431411459, 25.741304235135182), (126.41542678369719, 25.757775423822267)], [(126.42761849538286, 25.750657598202046), (126.40618743080915, 25.729401714194807)], [(126.41673367785815, 25.72742617394062), (126.40773522664583, 25.720193365676618)], [(126.4423793784044, 25.75259377380968), (126.46158872685814, 25.746318967695334)], [(126.41116378631526, 25.756732433733465), (126.3930765619807, 25.738891821167144)], [(126.41042219104126, 25.732077373268933), (126.43541696677563, 25.715402954345084)], [(126.43362426262635, 25.72619595380997), (126.42477442524837, 25.734850036790135)], [(126.40460810006549, 25.716771172636406), (126.41731057019693, 25.72186649467374)], [(126.4055161326795, 25.71536322910475), (126.41035518367354, 25.720835960380754)], [(126.41893337315787, 25.75517027143117), (126.42048428788554, 25.772274336271586)], [(126.41620583918727, 25.740874021090924), (126.39838468589312, 25.727598530162695)], [(126.41575552158069, 25.71626966372106), (126.40429144351559, 25.734136642634166)], [(126.42377943641769, 25.72526181482516), (126.40314430902626, 25.724812082691837)], [(126.4401031172939, 25.745420865935085), (126.45810606104764, 25.749192535388328)], [(126.44095971610491, 25.744115760293138), (126.42729862647192, 25.753191983110362)], [(126.3977207027213, 25.737361957831002), (126.41347617414098, 25.749990723370967)], [(126.39354890058902, 25.761792025729743), (126.37329354496873, 25.765896002532845)], [(126.42516632864181, 25.754896379031052), (126.43330780581273, 25.74820473284452)], [(126.43996588596565, 25.732989347319965), (126.41578816162794, 25.715171277278525)], [(126.40227001089488, 25.720067167962007), (126.38774042536852, 25.697393365985974)], [(126.42044148687974, 25.749410138973627), (126.40224554053414, 25.751764066598838)], [(126.41924646758557, 25.714428619249922), (126.40583220078129, 25.700944952671325)], [(126.44154704451482, 25.744365154564246), (126.46081971164561, 25.725918438283166)], [(126.39834492762192, 25.748786902587486), (126.37587765772139, 25.76833869156376)], [(126.40631865141302, 25.72825917028076), (126.42677082966297, 25.74473291176955)], [(126.43489803232768, 25.76232442228689), (126.41642474153204, 25.77643456246859)], [(126.39587435029203, 25.72651284306595), (126.37971343221825, 25.70807994047752)], [(126.39819863282399, 25.74217906160528), (126.37624750657251, 25.75131961214156)], [(126.40903141144159, 25.722510445865257), (126.42251276461353, 25.719973698376336)], [(126.43650874291993, 25.744050357636567), (126.42469602368271, 25.723683097362077)], [(126.4137270785693, 25.736811693862325), (126.40370399139539, 25.725093539795246)], [(126.44062468779303, 25.737305560494914), (126.42597894552166, 25.758164688984277)] + CALL_183@GraphGeneration.gov + CALL_183 + + + CALR + [(169.91087761996346, 19.19728301396311), (169.8993215235341, 19.184462120917818)], [(169.88857305103343, 19.240130902666195), (169.89609954176117, 19.2576249743385)], [(169.88946949227582, 19.2184597936859), (169.87659680859593, 19.20292090602027)], [(169.89891910612621, 19.23219313547583), (169.90794779270666, 19.207800678063347)], [(169.91531599605005, 19.21704438813331), (169.8967076874796, 19.207905091839333)], [(169.92069082405828, 19.2026153593433), (169.90990263745815, 19.197418897458533)], [(169.90675174248676, 19.20330810312753), (169.8884048632234, 19.209924620912012)], [(169.91970887608886, 19.217214940376234), (169.90900604219354, 19.193458894239388)], [(169.8874849834112, 19.238548052819862), (169.87098732510847, 19.25032233912598)], [(169.90781507655964, 19.197950527599293), (169.9281223851319, 19.208762729609973)], [(169.89170206418152, 19.23537037994303), (169.90987349431947, 19.238632616958856)], [(169.88450265023104, 19.21830638409907), (169.9077909945297, 19.22808708306259)], [(169.87717273351095, 19.21796581224818), (169.85339772714832, 19.20593891297069)], [(169.89194755222724, 19.200106028377604), (169.87884919096936, 19.20723693778627)], [(169.8793112375289, 19.203564803407666), (169.87303067163487, 19.204482291825173)], [(169.9009880396458, 19.225526900669024), (169.87892344824957, 19.241244177546886)], [(169.9113944271277, 19.2010725195278), (169.9311997950514, 19.210399588523995)], [(169.92195978648283, 19.210651567761982), (169.91268198495138, 19.21198157868879)], [(169.91857294199792, 19.217236093364225), (169.93801719471736, 19.2225429047954)], [(169.9041938013455, 19.241473233366612), (169.92693088325402, 19.26284773076718)], [(169.91583842366265, 19.234689076169662), (169.9059749977809, 19.212282201468593)], [(169.92245108970866, 19.23489402397383), (169.90534091057953, 19.21664826205276)], [(169.9045568748467, 19.22628314024962), (169.9024028279257, 19.215094139534223)], [(169.88472327583023, 19.2438023364582), (169.87951225807134, 19.226600010296966)], [(169.90089899315427, 19.217825114989683), (169.92539090305698, 19.209907768614425)], [(169.88320893595758, 19.21532078692773), (169.86327138237667, 19.194389461025057)], [(169.9216192943834, 19.208390728237582), (169.9245056280324, 19.193541033258846)], [(169.89299966571062, 19.213627413535935), (169.89700982454923, 19.198733145289154)], [(169.89486322569294, 19.210841332311094), (169.89763708647493, 19.23298903809964)], [(169.91569051108388, 19.19576841119223), (169.9216270075197, 19.218220532856215)], [(169.91213182943594, 19.228315006638773), (169.9029249955781, 19.24495427763784)], [(169.89994962950288, 19.20207997293547), (169.8766904522473, 19.198722466127542)], [(169.89742036144003, 19.21668749895295), (169.90599491909805, 19.23644276778002)], [(169.89212766617297, 19.233075737214943), (169.87446100848507, 19.209399531885275)], [(169.91114518620577, 19.23883942227009), (169.9325534069199, 19.24138864863035)], [(169.89128286096616, 19.242167393694864), (169.90520158920424, 19.263222078995824)], [(169.91243822003176, 19.238989146766183), (169.93578118330083, 19.234211895593276)], [(169.884763219594, 19.24019538802894), (169.8688742524321, 19.230740495359278)], [(169.90969960950403, 19.239279016507183), (169.89957480764477, 19.22966279320826)], [(169.8787835779844, 19.21350410684055), (169.86057125339704, 19.216963170833797)], [(169.88488793576226, 19.207867698101396), (169.88897726051704, 19.211069919486086)], [(169.92047198925601, 19.245284304170752), (169.90122245357497, 19.226540385810356)], [(169.90358260037874, 19.242374922081613), (169.89783583823854, 19.240980469075332)], [(169.89081259351002, 19.212133726877486), (169.87743703320442, 19.20035836002248)], [(169.8928531846157, 19.197351130721202), (169.91711878146762, 19.207456939011582)], [(169.9028566318376, 19.214088124836238), (169.9040244150663, 19.193344222311016)], [(169.90254445691744, 19.236702961985507), (169.90063002474201, 19.258986304003088)], [(169.8768905805441, 19.241250969139763), (169.85685832220545, 19.233963181370157)], [(169.89782576542814, 19.23408343086982), (169.8832155151794, 19.219765600942832)], [(169.87479351745978, 19.22275595746362), (169.87904083206988, 19.21229538783589)] + CALL_275@GraphGeneration.gov + CALL_275 + + + CALR + [(19.861249240491404, 34.568312233563795), (19.884396590591255, 34.56834241543149)], [(19.858892593180432, 34.567840315708665), (19.83697075764663, 34.57890966482323)], [(19.816914098913767, 34.56531106455968), (19.83580410657321, 34.56696759645567)], [(19.85312926617048, 34.565301283539384), (19.844831234355887, 34.589463718228124)], [(19.85395814609181, 34.57611533012139), (19.87890518098706, 34.599281746138615)], [(19.835209971100234, 34.58243238053935), (19.822701324118697, 34.59532866331894)], [(19.83383054285717, 34.571922859381544), (19.820468179830637, 34.57931883323353)], [(19.828478335336158, 34.58484074481862), (19.844323072196342, 34.59765164244041)], [(19.84827641294649, 34.571320831620426), (19.846616398614913, 34.589606623058756)], [(19.838022489478888, 34.57756529807583), (19.832696599808983, 34.57043796660825)], [(19.825594330841383, 34.58974959977346), (19.81464509469414, 34.586689368610806)], [(19.831275885183892, 34.59322592362046), (19.82804243332442, 34.61272518497687)], [(19.834566679255982, 34.58317941746567), (19.813049655055586, 34.564078987334845)], [(19.84445831101446, 34.59990097645166), (19.834546297041893, 34.578871825367)], [(19.84421298548064, 34.58805369462215), (19.867230887377044, 34.60375612201126)], [(19.848724735564154, 34.597299074966124), (19.834638253716975, 34.57713553783266)], [(19.824335112464155, 34.60281788670054), (19.80245862588204, 34.60714297437677)], [(19.838141578435877, 34.579117288324326), (19.816269449201073, 34.59998948295485)], [(19.827756605818966, 34.59602212978889), (19.84985191549187, 34.61233095446803)], [(19.819945499711505, 34.57070198632481), (19.810796722359363, 34.55153390857791)], [(19.835422624703693, 34.56663658749969), (19.84211144796833, 34.56112599872581)], [(19.821532251537672, 34.58133910614914), (19.7993529278607, 34.583153908661224)], [(19.863470652968175, 34.59042544733469), (19.87068756135864, 34.5744474799377)], [(19.824437443982536, 34.5992140525788), (19.845623849366156, 34.61196027652236)], [(19.832386309883145, 34.576019573845585), (19.818918908266564, 34.583808947625144)], [(19.82952099877992, 34.58675735745693), (19.833063890152882, 34.576771796221415)], [(19.822830273532702, 34.59060618395275), (19.833177993658786, 34.565931386846636)], [(19.84673339354129, 34.60312553474753), (19.868061688342422, 34.59128451640229)], [(19.860248883775814, 34.604149139491106), (19.87001996957681, 34.61629600928974)], [(19.82954604221084, 34.57142327967412), (19.83549954304909, 34.55339784481341)], [(19.83047555556771, 34.567218218675926), (19.834089592763426, 34.58557239339348)], [(19.8336638784771, 34.58731964134183), (19.810123148265628, 34.58160795850909)], [(19.856961597746054, 34.572210591075525), (19.845485675934867, 34.568480303468576)], [(19.82913582542188, 34.595919297268516), (19.84038716914776, 34.588226675518875)], [(19.829042474692827, 34.59090267357278), (19.81420352803036, 34.58576224528702)], [(19.852587576064156, 34.57938507780434), (19.837781462705863, 34.58518722742111)], [(19.81738905009933, 34.589101844665834), (19.838567591860627, 34.58529729740725)], [(19.81522126122346, 34.60048184255409), (19.831630657453115, 34.57900587259991)], [(19.836983184200218, 34.56759448084866), (19.815791326046984, 34.57809999902978)], [(19.841110699323124, 34.57007765655291), (19.82666501833102, 34.59327941352239)], [(19.81418827774882, 34.58724146047187), (19.82114343458634, 34.593463296351466)], [(19.81590809269901, 34.57962678035564), (19.82359273323923, 34.59895492842197)], [(19.85644157530007, 34.56964121955412), (19.837526111331382, 34.55751044220701)], [(19.824923643767086, 34.59619053097671), (19.847944466167903, 34.58698609405265)], [(19.858850094927533, 34.58790743584929), (19.85981114363975, 34.60436592000378)], [(19.840994061554312, 34.5702345488768), (19.856666066195885, 34.5909160387309)], [(19.844473010153404, 34.57373708282569), (19.84985136574482, 34.55545134210794)], [(19.862565691196256, 34.57119922137006), (19.842183521550893, 34.56162883572436)], [(19.82580331831397, 34.57766866005548), (19.815201568008717, 34.59567681082293)], [(19.82256773584722, 34.60310951949664), (19.825447590741124, 34.625895724210615)] + CALL_367@GraphGeneration.gov + CALL_367 + + + CALR + [(124.50848572999426, 42.066073706563515), (124.48686693460857, 42.04795321659233)], [(124.52987320897054, 42.07353400626101), (124.54693118679721, 42.0794130055177)], [(124.51842995710369, 42.054702818878994), (124.5376264827995, 42.07723021204883)], [(124.51532764511931, 42.04787380576922), (124.49978298857715, 42.05531692083052)], [(124.49293634333578, 42.06942897062261), (124.49694533528393, 42.09042101343851)], [(124.53178808735615, 42.07523103796555), (124.55449788041174, 42.05731687748771)], [(124.51686446652565, 42.05849346171109), (124.5337280103844, 42.04083874688373)], [(124.51788725961362, 42.06949457057277), (124.51655051192007, 42.09218230842682)], [(124.52708523905096, 42.07978381995792), (124.51285770329912, 42.093129220069834)], [(124.49914683031237, 42.047273422261554), (124.47846005412987, 42.037230370145586)], [(124.49398923610362, 42.053120314692784), (124.49690071892121, 42.06534159967974)], [(124.5403496343961, 42.08180589790021), (124.52861488274108, 42.0601288187448)], [(124.50706106864254, 42.043862059901535), (124.48502241012424, 42.04983001044632)], [(124.53059493058909, 42.03863623839841), (124.52807963752477, 42.01711198874787)], [(124.52905197558064, 42.06508353045607), (124.5338261849245, 42.046461502439264)], [(124.50578607660506, 42.0403780933565), (124.48289463965429, 42.05184095887307)], [(124.51449479842333, 42.05348356409095), (124.51557034329028, 42.0747013766578)], [(124.52140199600281, 42.045945272817846), (124.51681206078067, 42.067243145725264)], [(124.53733737279309, 42.06814321693005), (124.54038138754937, 42.05876008800366)], [(124.52367056708746, 42.041103166742445), (124.52639090981955, 42.03003186444742)], [(124.53278749691665, 42.041099334404485), (124.52219785191747, 42.03003881297481)], [(124.53357683622785, 42.07143782970288), (124.53057528392435, 42.083580173129995)], [(124.49606019388855, 42.068134726411465), (124.51636800113371, 42.04870645581869)], [(124.52765996410076, 42.066261345527614), (124.51322310995938, 42.0540385815381)], [(124.51649479977301, 42.083780279984325), (124.52465206539082, 42.10304479112108)], [(124.50491667037669, 42.050083608289), (124.49122552209263, 42.05859648967021)], [(124.52536470952593, 42.04458417234342), (124.53670678799335, 42.030349953746835)], [(124.51439209953578, 42.04240725947916), (124.49103053746023, 42.02320064834136)], [(124.52763538139972, 42.0393630839648), (124.50964732715347, 42.02942319796218)], [(124.53760670100203, 42.04829635764337), (124.52607207591986, 42.023302425964786)], [(124.49511959258898, 42.08062338301098), (124.47413781744508, 42.103531891015045)], [(124.53129439531874, 42.071537183764015), (124.52343864755436, 42.06947955111091)], [(124.5372121157035, 42.08508827512067), (124.56176453719127, 42.08062035511859)], [(124.53663595931222, 42.082437340530625), (124.51257993424701, 42.07236891644276)], [(124.5253090560068, 42.038977855693425), (124.52286221218347, 42.06229239988213)], [(124.49680170342164, 42.04375866695351), (124.50099109342625, 42.0255000014774)], [(124.5334575760381, 42.076403911112294), (124.53731571939261, 42.056213581317756)], [(124.5179595472126, 42.07349142415657), (124.53144842873388, 42.06174795941588)], [(124.49944256525548, 42.083018112939214), (124.50055722428104, 42.060672385902144)], [(124.49797766414426, 42.0591799570033), (124.50685306447129, 42.05641000866705)], [(124.51860125447598, 42.03889102332394), (124.52603736693148, 42.02349016596573)], [(124.49347842509827, 42.07220203193132), (124.48354169391322, 42.08259504689269)], [(124.49770735397371, 42.06584202349276), (124.48036213984076, 42.07634895914037)], [(124.52863329461294, 42.03789088139764), (124.52932208131391, 42.037709789859875)], [(124.5118173724469, 42.05107385115182), (124.52935469025, 42.04667894545307)], [(124.49482192894459, 42.08047870754823), (124.50538718736729, 42.08581707599969)], [(124.49475712982748, 42.06079507430483), (124.48881921675212, 42.06455650059843)], [(124.51958640882164, 42.0489455059176), (124.53080593136913, 42.03716094777987)], [(124.50387025963099, 42.043572286720476), (124.51802897178534, 42.030848152012055)], [(124.5130962607024, 42.06008910625879), (124.50415299276612, 42.046976328183014)] + CALL_459@GraphGeneration.gov + CALL_459 + + + CALR + [(174.4567735413034, 54.274112457475354), (174.47785070010931, 54.25554843471346)], [(174.45409857859076, 54.26477370868535), (174.4484106403143, 54.25022038242897)], [(174.46540093384897, 54.247237902478), (174.44226318065355, 54.24683800448953)], [(174.4381086480643, 54.29261429678802), (174.42046472708188, 54.29847397639615)], [(174.44603538643017, 54.28137372190661), (174.46710722571189, 54.287119843818566)], [(174.45788831604995, 54.250607996962295), (174.47939766716033, 54.27039597748568)], [(174.4548575531646, 54.258798723986864), (174.46772404583004, 54.258915708331465)], [(174.46868279384037, 54.26289256874118), (174.47833897582044, 54.24380401459525)], [(174.4510865950233, 54.25250227284954), (174.44765149896477, 54.22994855591494)], [(174.44113926810186, 54.28695891347293), (174.4474067269478, 54.27501754291717)], [(174.44374867970186, 54.280426829929674), (174.45515769747743, 54.29282536763015)], [(174.44208085192798, 54.246421967125514), (174.42110515229743, 54.23681578063472)], [(174.46384493108013, 54.288247124844375), (174.46064912813492, 54.28557084885546)], [(174.46945852426418, 54.25974179066111), (174.47950298732565, 54.28052740202905)], [(174.43297143842736, 54.262352203643076), (174.43737957236502, 54.257314973705945)], [(174.47163085736733, 54.27075991731782), (174.4499859886377, 54.251975041811555)], [(174.43670163146777, 54.26160947849414), (174.44083470230245, 54.24060984680922)], [(174.4281348839364, 54.27219054644021), (174.4381086504494, 54.281446915922494)], [(174.43652570933037, 54.27591891626516), (174.41398620833633, 54.2842539151489)], [(174.45255878115955, 54.274378182713974), (174.46080026662483, 54.273327946843416)], [(174.4421572974693, 54.28121458716215), (174.43787265306287, 54.272787822953866)], [(174.44066146832398, 54.256144000962465), (174.42641742057057, 54.24473491639072)], [(174.42408081874086, 54.25667057660048), (174.44450987748905, 54.25874084493087)], [(174.441104524938, 54.25931641524202), (174.43545285951706, 54.275752463220044)], [(174.46428918576316, 54.270471415024616), (174.44685892105787, 54.264918570339155)], [(174.4357738857279, 54.25284883078961), (174.42120103671192, 54.24269824135535)], [(174.46060054142978, 54.259509618170135), (174.4846490608211, 54.267432214936775)], [(174.46219551325106, 54.28343949911379), (174.4568182399087, 54.291270612587596)], [(174.4334105088445, 54.28875244424124), (174.43158206149712, 54.301022839132465)], [(174.4370229123145, 54.287559220407026), (174.42807582146062, 54.28567061839737)], [(174.43414243222742, 54.25803606718942), (174.42398470627367, 54.27126485890577)], [(174.4227461302536, 54.24770232437481), (174.44139184573592, 54.255545031285145)], [(174.4630474569057, 54.28495141766739), (174.45749650868464, 54.304301849502885)], [(174.42952813012135, 54.27793927369443), (174.42378135517612, 54.26284579448217)], [(174.45884155994466, 54.25258782108013), (174.4428056736382, 54.2458665127843)], [(174.4446423985016, 54.257360032667535), (174.42458132207884, 54.256965042528805)], [(174.43122708013803, 54.29270918515168), (174.4412682888813, 54.309676147383655)], [(174.4377824513285, 54.29035275457279), (174.4370683871915, 54.28630682543084)], [(174.45433262791943, 54.276162688858015), (174.4776085537817, 54.28491023948506)], [(174.43691411772596, 54.2755341713441), (174.4381488768272, 54.26635008682084)], [(174.44283864546543, 54.27124564249231), (174.43197543654654, 54.26701478417546)], [(174.43651843680033, 54.26766401007526), (174.43197279301074, 54.288763400041674)], [(174.46398909439455, 54.252984344968695), (174.44036694710633, 54.277794909124964)], [(174.45647030099676, 54.270901619914056), (174.44364992889743, 54.27471434507354)], [(174.4559834940466, 54.26546661962926), (174.45979770249758, 54.27305499420365)], [(174.42826129428113, 54.270335063317), (174.42125049777707, 54.28397597530483)], [(174.46092839952203, 54.27891855096083), (174.44763040029096, 54.26874609214373)], [(174.44577826220115, 54.25586413719986), (174.4427045552764, 54.248653618110986)], [(174.4422835067076, 54.278471602787086), (174.44474779229836, 54.27067647091475)], [(174.44451566807172, 54.26171570597695), (174.44358076217222, 54.24164288381219)] + CALL_551@GraphGeneration.gov + CALL_551 + + + CALR + [(4.853223252132057, 79.11795331070952), (4.856242322121045, 79.12375130136884)], [(4.88030252368801, 79.07971534915967), (4.872745652413013, 79.08218890152502)], [(4.852253992717737, 79.09128595851315), (4.85732341797531, 79.10657427807901)], [(4.857199495740483, 79.07359817442631), (4.851675701715662, 79.0877080453865)], [(4.859119896910402, 79.1113916703144), (4.849107547411364, 79.11701101896176)], [(4.88295306116602, 79.1093473767956), (4.9004434679796764, 79.11186656989446)], [(4.895496610869434, 79.09598243098108), (4.870609157449964, 79.07871907809246)], [(4.888746577528391, 79.08064307258185), (4.883442799210801, 79.0669831682764)], [(4.8705433287276545, 79.07617926825922), (4.8804638545172985, 79.05537377025931)], [(4.8743807791490905, 79.0967326343975), (4.865404847622412, 79.1082064491411)], [(4.897438049233262, 79.07429508296318), (4.877392191954624, 79.06244418119066)], [(4.866762629045513, 79.09370567813484), (4.8656291142626085, 79.10252178770119)], [(4.895185180295999, 79.0879118140684), (4.8707861848748575, 79.0980750887419)], [(4.866082268713711, 79.10714335719967), (4.866421954633291, 79.08951020432207)], [(4.879211942646426, 79.11690545459588), (4.859648616017665, 79.09882093625798)], [(4.851720291386951, 79.07343095374655), (4.857118472549581, 79.06436200384373)], [(4.858689862855605, 79.08193576883478), (4.850599071727597, 79.08633203099403)], [(4.883334677410399, 79.10726080864536), (4.86502222265436, 79.11114758134727)], [(4.85230956639275, 79.07707661021729), (4.85090914199783, 79.07682739862213)], [(4.889196429843278, 79.09104093092759), (4.878157693366937, 79.10795875192922)], [(4.867662398962214, 79.09787358968242), (4.863075321163318, 79.11615226606142)], [(4.86845483562353, 79.11266214556572), (4.8791641054055015, 79.12231222288729)], [(4.869137979581447, 79.0959958190467), (4.85549374355211, 79.07567942632264)], [(4.885500612591844, 79.10384702689751), (4.88705245130789, 79.09855702828304)], [(4.871099035176493, 79.07347517925923), (4.877245291811854, 79.07253519481705)], [(4.899449517696398, 79.08192636540466), (4.887661745074179, 79.08314089430087)], [(4.879085609730132, 79.07936849745577), (4.871398410486065, 79.05757803737104)], [(4.872170380503046, 79.0820121622043), (4.855573323133909, 79.06922650064544)], [(4.894173770570568, 79.1119408354383), (4.907985580128089, 79.1362436885335)], [(4.882217844142108, 79.09222377091719), (4.873103161517373, 79.0712587190597)], [(4.85774339336028, 79.10260983554973), (4.8550632873409105, 79.11317880416517)], [(4.866544073520899, 79.09949951309983), (4.88446758154535, 79.09391025106999)], [(4.881291972960423, 79.07373848516895), (4.86166901375101, 79.09085507537894)], [(4.853948866740883, 79.11946869011764), (4.839721060250755, 79.09850277748899)], [(4.869973895500317, 79.09884058597743), (4.870018632458229, 79.09816495786934)], [(4.887989995416144, 79.11884440092656), (4.903309888534692, 79.13931634105444)], [(4.8543602623809115, 79.11607386614564), (4.829874364409566, 79.11126114161664)], [(4.868980662168435, 79.07311811435767), (4.855672615632869, 79.08840835315496)], [(4.901046487737085, 79.10035022075658), (4.910106682863485, 79.08673798406817)], [(4.885782886895641, 79.11128948191462), (4.907176517180586, 79.13377924065757)], [(4.877111654895226, 79.08322983408381), (4.8819966416791845, 79.0707580597406)], [(4.865439655139955, 79.10857940734738), (4.843140938835137, 79.12690647962874)], [(4.851963054864562, 79.10202833839503), (4.838904814286317, 79.08168244543876)], [(4.886117947793754, 79.11405434741394), (4.873615490513426, 79.11203785175809)], [(4.864797151866785, 79.1163749410419), (4.8701892109707945, 79.13639262338765)], [(4.8743110258096305, 79.09749480505778), (4.881793286125878, 79.09991351460484)], [(4.897401015070974, 79.08631717888919), (4.89928960353782, 79.08941056615465)], [(4.881920895630835, 79.11955697195857), (4.899378273864393, 79.14314266053093)], [(4.90020952852469, 79.08985241593331), (4.893874255063181, 79.08976813499287)], [(4.86084758990378, 79.11814544806268), (4.879401681535536, 79.12686601535418)] + CALL_643@GraphGeneration.gov + CALL_643 + + + CALR + [(82.52361102919592, 83.10389280140221), (82.516411985999, 83.09578849220738)], [(82.53754216501342, 83.11661199892129), (82.5611586402167, 83.12983649990558)], [(82.52492415527206, 83.10050092750402), (82.54886704667821, 83.07837505637764)], [(82.53986385939002, 83.12856807971131), (82.56132148372426, 83.13303693362487)], [(82.5077400878703, 83.09781162979593), (82.50739872076421, 83.11770495552398)], [(82.5245612411131, 83.08882466495034), (82.53945077428983, 83.10639060285723)], [(82.49635268357086, 83.13123374643428), (82.47449652576677, 83.12782859522264)], [(82.537518338644, 83.09803094886468), (82.52964380012995, 83.1082349227136)], [(82.51254680010815, 83.10503314795059), (82.53620622186101, 83.08130488414908)], [(82.50067836098503, 83.1301713293719), (82.52395297145895, 83.1157949127999)], [(82.53811723814113, 83.11678748657644), (82.52033907626786, 83.13886997373163)], [(82.50145885256254, 83.12690494143234), (82.51426259496287, 83.1102456717486)], [(82.53080816740727, 83.12230264899583), (82.51428464764096, 83.12971169586633)], [(82.53085541575228, 83.11140731310988), (82.54909145715601, 83.0925107885756)], [(82.52923464773669, 83.09453049432271), (82.50914191535254, 83.07813153183818)], [(82.49679534696747, 83.09018849259259), (82.50995377731202, 83.1141288494043)], [(82.50341979884053, 83.1197003347103), (82.4886509639344, 83.1397195065083)], [(82.50391585852547, 83.12615520159528), (82.48466030218452, 83.11987409020175)], [(82.54237713076556, 83.12754090730765), (82.53269217008966, 83.11932533185318)], [(82.50629469117395, 83.13233323209761), (82.51015568934848, 83.10781035899609)], [(82.51442215012474, 83.1258786804849), (82.49518890139056, 83.11258973545462)], [(82.50664436412791, 83.10220697469937), (82.52615481679098, 83.08589104935137)], [(82.52128849430201, 83.11462809156781), (82.5361797511441, 83.13781652772978)], [(82.50824980054641, 83.09924975050806), (82.5137853546769, 83.11590846067328)], [(82.53912135252979, 83.12060315860973), (82.51860818216343, 83.10181976801171)], [(82.52514253064321, 83.09787802449704), (82.50628875443276, 83.100844739804)], [(82.5224444419358, 83.11599827757861), (82.54529608282101, 83.12111362254872)], [(82.49921163175591, 83.11717074967656), (82.50777397416351, 83.09390899497866)], [(82.53656558778889, 83.13159172712784), (82.54298687661283, 83.11121414979861)], [(82.50843456677232, 83.09896710625114), (82.50169952618313, 83.10414671688906)], [(82.52359142208972, 83.12057710734246), (82.51320808123715, 83.13598802800567)], [(82.52926858908, 83.12533124156937), (82.53211861347768, 83.14676749175044)], [(82.53773175978502, 83.12206588098272), (82.51446080119835, 83.12686500705573)], [(82.53207765694457, 83.12204702254347), (82.55517629471161, 83.13066123634064)], [(82.50755614758636, 83.1160191553925), (82.49039945854928, 83.14015846839833)], [(82.54184073454451, 83.09708228775848), (82.52143444781788, 83.10125204098317)], [(82.53371922817036, 83.11794417383523), (82.52518264047643, 83.09515616363373)], [(82.49356933672037, 83.1335481924971), (82.48435261272924, 83.13570594808743)], [(82.50295367073032, 83.11100382877818), (82.52081184507648, 83.1131762394587)], [(82.49415243708515, 83.11405426873647), (82.47757072311822, 83.12934405658864)], [(82.51932747968725, 83.10713941747717), (82.52077877860039, 83.13179070422126)], [(82.53969051886058, 83.11411104829968), (82.56340893935838, 83.12742282148726)], [(82.49759734398901, 83.11188239449838), (82.50749597819447, 83.09289074568439)], [(82.50804630900926, 83.12858677415568), (82.52980115264896, 83.11803659887718)], [(82.50258880027876, 83.09865040453889), (82.50245015330124, 83.10868884635858)], [(82.53339621741938, 83.10269870695275), (82.53410255046683, 83.11968826992693)], [(82.49666987806101, 83.08730351226), (82.49722293724817, 83.0961045669241)], [(82.5132063739125, 83.11960360948073), (82.50976616917293, 83.11585395500873)], [(82.51760549620566, 83.09457926578492), (82.50555310641579, 83.08020872380415)], [(82.51408241791191, 83.0991198129039), (82.49469730264602, 83.09428306200658)] + CALL_735@GraphGeneration.gov + CALL_735 + + + CALR + [(192.08546569879817, 78.60510511221189), (192.07123371013847, 78.60000716422012)], [(192.09610139735537, 78.61610733603709), (192.09469836095764, 78.61896162470379)], [(192.09762985767853, 78.6315900642175), (192.09431577517466, 78.62946286263576)], [(192.10260031493814, 78.60650111046795), (192.11359321330875, 78.61358862567971)], [(192.0899820600547, 78.63184629994575), (192.07273198906233, 78.65607538882793)], [(192.08937358488382, 78.62092389399564), (192.09889116439118, 78.64055593719887)], [(192.07870156747452, 78.61420383845797), (192.08916881178197, 78.63131827327105)], [(192.07488441904388, 78.590075132047), (192.05037106051574, 78.57329137099975)], [(192.0763572001301, 78.60695104414583), (192.05324338706203, 78.60035847703497)], [(192.11072319780132, 78.63079988687244), (192.11677210514253, 78.62952116668949)], [(192.08817155172747, 78.61787918386764), (192.06766784946413, 78.61947882529623)], [(192.07276824389763, 78.6319614503797), (192.0613378744377, 78.63453899852198)], [(192.10381580364853, 78.60898996675208), (192.09626124479811, 78.61031116528868)], [(192.10395450472373, 78.62153408919077), (192.0909349619146, 78.63492675541772)], [(192.10476946444203, 78.59450691766287), (192.11366378574803, 78.61556131568048)], [(192.09593235174856, 78.59237628715313), (192.10841700174646, 78.61621416611935)], [(192.10990088711512, 78.60174042242612), (192.09870663915476, 78.59768023225621)], [(192.1071558568998, 78.6213053138899), (192.13097743679404, 78.6082836866832)], [(192.1015374175552, 78.63012857518507), (192.1164617632354, 78.62796361466944)], [(192.1079201052246, 78.5884915690817), (192.10345667401432, 78.56621551659877)], [(192.10452656936093, 78.61140197434196), (192.08739783267416, 78.62948518506664)], [(192.06856754078493, 78.6235102055557), (192.04688623938793, 78.6183396908248)], [(192.09765270124848, 78.62871420545068), (192.10093567806558, 78.6341861987199)], [(192.079644333334, 78.6016859825485), (192.10332486174607, 78.60506360374917)], [(192.06954400629886, 78.60176566683842), (192.0702369032973, 78.62391690898151)], [(192.08597759819773, 78.6074544912121), (192.07681841649466, 78.61556865677724)], [(192.0880598706291, 78.58704322266428), (192.0887911406485, 78.56500887607939)], [(192.08090600391714, 78.63084980439652), (192.0815087642584, 78.61397242394975)], [(192.07831235265326, 78.60775521984095), (192.06607884393551, 78.62279666429993)], [(192.098984861149, 78.62741606500741), (192.11386551002875, 78.60259987965996)], [(192.0951094265325, 78.60193886348812), (192.07782774273545, 78.62453047837681)], [(192.06634197979793, 78.60108484149406), (192.05126442876139, 78.59062939827832)], [(192.10405681294043, 78.61238567580047), (192.12332983635292, 78.63132611007879)], [(192.06849797905747, 78.60021624222787), (192.08952968552103, 78.58993104970747)], [(192.1078632458154, 78.58619075183155), (192.1273086527267, 78.5891875517945)], [(192.0999090533286, 78.63133689496476), (192.0992425915629, 78.60651564580004)], [(192.07629981790834, 78.61346968476278), (192.10028721245507, 78.63459723814199)], [(192.09501995991673, 78.6131289768706), (192.08835366618445, 78.61563541779829)], [(192.0831460274353, 78.61875496062797), (192.05885270482807, 78.60879130351795)], [(192.08745749061538, 78.58739158047455), (192.11069454718395, 78.60537909569707)], [(192.10552685297276, 78.58775874230405), (192.12353500593272, 78.5827082997049)], [(192.0942336662811, 78.62823461649927), (192.08748872644696, 78.61632364901341)], [(192.08879191444663, 78.60020745202324), (192.10008136826474, 78.59568197200346)], [(192.0824983615426, 78.62328779046676), (192.10386540764247, 78.6082705886804)], [(192.1140613603528, 78.59884900479551), (192.09301135797185, 78.59831571729508)], [(192.06520294786034, 78.59569284608699), (192.0468921048811, 78.60310506535959)], [(192.0949494101089, 78.59615956918184), (192.10396007393643, 78.59226450036398)], [(192.076218693648, 78.62280109459299), (192.08611325529787, 78.60489040316567)], [(192.11004756845244, 78.58676344364433), (192.1055013132556, 78.57985795594708)], [(192.06612782823439, 78.63223563657756), (192.08128580121084, 78.60986644688674)] + CALL_827@GraphGeneration.gov + CALL_827 + + + CALR + [(20.21939982775638, 91.39141797573832), (20.23150814486353, 91.38750134465754)], [(20.21576887793793, 91.36767399653544), (20.21176880660616, 91.36773584682392)], [(20.244260858742507, 91.36051944952044), (20.25400804231537, 91.35787017928044)], [(20.217403937081034, 91.35208400767499), (20.238692811143558, 91.3442375481992)], [(20.258929590159, 91.38663590469024), (20.244400787141537, 91.38784359963238)], [(20.215734591773614, 91.38189665431798), (20.22031641333457, 91.37366882292463)], [(20.225763388463395, 91.358593350031), (20.239384069500368, 91.33465726520865)], [(20.248751373539314, 91.37850453713789), (20.2595676649505, 91.39365873065621)], [(20.22298972574979, 91.36925554814489), (20.24323749992182, 91.36634835980581)], [(20.216211487675864, 91.35772478980276), (20.195276785035023, 91.3577893040174)], [(20.21595554123877, 91.36942305337813), (20.20918240611153, 91.35807991514525)], [(20.24832469128817, 91.37005609731251), (20.267210764127306, 91.36191694080999)], [(20.24586380585014, 91.35658272095262), (20.257271969053413, 91.36016201988113)], [(20.233071183905363, 91.35670493718699), (20.211838850553118, 91.33443079724893)], [(20.217807115975297, 91.35821237660844), (20.19701055402714, 91.35708376890385)], [(20.238756713646154, 91.38344309775616), (20.226743719180924, 91.36692543869181)], [(20.256535462204624, 91.37615617506007), (20.263499750901254, 91.40006511817218)], [(20.228659989080906, 91.37875035721827), (20.23992417609416, 91.3976169130713)], [(20.230013901105416, 91.36320089306409), (20.21279337647675, 91.36347639680102)], [(20.253745086895364, 91.35962571674276), (20.228792763824483, 91.3536942682094)], [(20.258098945357002, 91.37041959238337), (20.264186318475723, 91.39013724278766)], [(20.24322729943394, 91.36679729796188), (20.221923853060723, 91.35513794548172)], [(20.250668519427805, 91.35430951594087), (20.22985106092675, 91.33722753157541)], [(20.258552348424608, 91.385787049407), (20.262574557701694, 91.39917726320121)], [(20.21925994895597, 91.39625591415476), (20.202335301333605, 91.41522305988148)], [(20.24229467664211, 91.37017919787397), (20.238436745152768, 91.3843103433066)], [(20.249845596659373, 91.3733872083857), (20.2312772683764, 91.36104017594141)], [(20.248014889734343, 91.37557625814009), (20.254122881554647, 91.37361962436435)], [(20.239828627645164, 91.35784582091277), (20.264311043708247, 91.35878461020853)], [(20.24580536718601, 91.39634985501411), (20.236558141861824, 91.41345945380232)], [(20.225156997626197, 91.35967284354042), (20.248167904153224, 91.33967806741524)], [(20.231331774948924, 91.36258797972904), (20.21961644771753, 91.37464598566622)], [(20.215304054956576, 91.37183961312022), (20.207789997687176, 91.36317037157261)], [(20.235030121037383, 91.38636088457035), (20.21983124855028, 91.36326415670302)], [(20.238561405776373, 91.37736600926218), (20.21959435894292, 91.35347878734703)], [(20.222663868205355, 91.39169704935185), (20.22065331634129, 91.39995020425224)], [(20.238998521830208, 91.3591356557116), (20.24740264088347, 91.35170289189846)], [(20.2516926721801, 91.35862823964085), (20.237290869526802, 91.34474340667936)], [(20.25993954017645, 91.35551714933868), (20.246261764970704, 91.34180943573267)], [(20.236074284964324, 91.35174530980368), (20.22080916966155, 91.37672019581919)], [(20.237550171805463, 91.39248996384758), (20.238721144426904, 91.37501849527509)], [(20.227994112127995, 91.39250666917978), (20.243377619442402, 91.39912672410333)], [(20.246852248857877, 91.37492479255513), (20.23532092118981, 91.35630067714408)], [(20.246088307715755, 91.38962010145242), (20.224941838659973, 91.39304042650919)], [(20.244780055048956, 91.38739895168618), (20.225826032880263, 91.39664871920526)], [(20.220394866430336, 91.3826813462492), (20.201516463930524, 91.37854360528493)], [(20.232066599824226, 91.3566184717213), (20.212029395995803, 91.3498710422738)], [(20.21791083669612, 91.3724936207127), (20.22297917020732, 91.37666919856925)], [(20.244166265640025, 91.38385603938738), (20.220763800368786, 91.36294446335161)], [(20.235805337664235, 91.38618800932932), (20.244123810646105, 91.39483206142393)] + CALL_919@GraphGeneration.gov + CALL_919 + + + CALR + [(82.64418134106678, 113.13206332585324), (82.62425735532699, 113.13570195443883)], [(82.65133861835676, 113.12916562816423), (82.64384634676554, 113.14856572726822)], [(82.65488220016009, 113.14312752345793), (82.64509594799095, 113.13265815910196)], [(82.66001626395983, 113.1371203606457), (82.65218710966798, 113.12106193242244)], [(82.66677175746815, 113.1270015962191), (82.67320691120172, 113.11364781225072)], [(82.64457207510584, 113.13528085888161), (82.61996240226449, 113.12386031949666)], [(82.64946868561091, 113.15472660246833), (82.6708308771591, 113.1592721620022)], [(82.66265394973605, 113.11831910276555), (82.65289327350102, 113.10057456811474)], [(82.6314952834203, 113.12676236476683), (82.64300587193765, 113.11612939958684)], [(82.66416241792446, 113.15734590087136), (82.64376770491211, 113.15391471417055)], [(82.67944496196704, 113.12054837322333), (82.67300993651581, 113.1084312482038)], [(82.64120291668384, 113.13938230862385), (82.64486999493793, 113.12175689080502)], [(82.66598656017274, 113.1175451329631), (82.66396375516987, 113.10890643303144)], [(82.67522431588526, 113.12529447985065), (82.6876503833671, 113.1119872245896)], [(82.66773558832273, 113.15236090301894), (82.64623713127233, 113.16857553301243)], [(82.65454105076086, 113.12522625406811), (82.65357711367011, 113.14609298286184)], [(82.67319399002005, 113.1586514451317), (82.67478668658339, 113.16970681108752)], [(82.65254355552044, 113.14611815365205), (82.67476254700615, 113.16067646090983)], [(82.65158994196224, 113.11715741863893), (82.63626783305541, 113.1107241895498)], [(82.66938471303372, 113.15673831113011), (82.68295792464355, 113.1511396647529)], [(82.63138316526356, 113.13298041571548), (82.62350664672243, 113.1220171121205)], [(82.65518525122604, 113.14533101949874), (82.65973497565685, 113.1439066896416)], [(82.6757743733462, 113.13463335644123), (82.6628361763466, 113.13388464677678)], [(82.66811858872215, 113.15538051373278), (82.6822904461249, 113.15541563623538)], [(82.67538312313472, 113.12646466056191), (82.65703907710356, 113.12113296017469)], [(82.6391476267401, 113.12539630513544), (82.65121253716737, 113.11608869338356)], [(82.64540167865533, 113.11713670460342), (82.63085434064972, 113.11058947063722)], [(82.6358235803336, 113.13959818306434), (82.64588140434634, 113.11694915167524)], [(82.6502291298092, 113.13555832905475), (82.6602181847698, 113.1107176826912)], [(82.6615913878421, 113.15786841804207), (82.64731115710102, 113.17736899464516)], [(82.63958752497132, 113.12298119729618), (82.62530657386708, 113.13764797268341)], [(82.63057739504394, 113.11308425063692), (82.6507142715913, 113.13049487336022)], [(82.64166808073752, 113.14047226359587), (82.64971147457257, 113.13891863265648)], [(82.65759843232266, 113.1334388604072), (82.64949323648626, 113.12619958506899)], [(82.65538856515026, 113.13896050937262), (82.67351286704243, 113.1426929882265)], [(82.63382659940885, 113.15487620122758), (82.65253974216279, 113.17515139389114)], [(82.63243048080082, 113.1527048196905), (82.61437162363326, 113.12983661854724)], [(82.6394097488181, 113.1554067811811), (82.62528818445865, 113.13099788079644)], [(82.63346818935041, 113.11411937184603), (82.65264524397124, 113.09140128069416)], [(82.67930229175506, 113.1228737905899), (82.66092204711504, 113.13324372651066)], [(82.64676147298142, 113.14590967011395), (82.66275645356856, 113.13855130313584)], [(82.64181776790407, 113.12000287949289), (82.62019357969885, 113.09524720667248)], [(82.66303203779346, 113.146850469287), (82.65651709985332, 113.14616552822262)], [(82.63385565371395, 113.14250246486553), (82.6401901394979, 113.13858840230594)], [(82.64608333337787, 113.12462585035118), (82.63963391807977, 113.11934593216138)], [(82.65302111432779, 113.1374037644042), (82.64931624215819, 113.12280156670327)], [(82.66035812574717, 113.11318561707084), (82.66337699167589, 113.12391918540789)], [(82.67112435874539, 113.14118703872226), (82.66710242536173, 113.11812187500455)], [(82.64950494424241, 113.12040439687382), (82.63080277406156, 113.1031905262493)], [(82.66977452053793, 113.12762824348648), (82.69109562731926, 113.12716442939882)] + CALL_1011@GraphGeneration.gov + CALL_1011 + + + CALR + [(193.34626298554167, 102.27696147845971), (193.3506165573307, 102.28436838386088)], [(193.3415185884503, 102.2713620254902), (193.34983688394635, 102.28835200490131)], [(193.32485374120725, 102.291494985708), (193.3049678659528, 102.29697767206343)], [(193.3619483152898, 102.27894399986967), (193.35661250078513, 102.2697599215791)], [(193.31958263226622, 102.29792827390139), (193.3008411050449, 102.28943307258776)], [(193.36534085603392, 102.29532146576888), (193.37947302134478, 102.2746224857203)], [(193.32010778593914, 102.30304724053995), (193.33240657552224, 102.2887989144404)], [(193.34875224441444, 102.29932106172811), (193.35838540214792, 102.30790894464977)], [(193.35610702283148, 102.27485289057694), (193.37329019836628, 102.26356876751395)], [(193.35766233628314, 102.30599930135642), (193.37269331384084, 102.30533136902129)], [(193.35487884781745, 102.27567163349126), (193.3487752403035, 102.29961541744716)], [(193.35128325129995, 102.29497255213626), (193.34765552530612, 102.31666994267619)], [(193.35869242135269, 102.3132327671399), (193.34930565367438, 102.28954537418853)], [(193.33101622594975, 102.27566374535915), (193.30604655070942, 102.26664996904162)], [(193.3399769666774, 102.28519511426134), (193.34195925509593, 102.29052658574238)], [(193.32423973116553, 102.29769606667962), (193.34782028053806, 102.29501653806172)], [(193.31818705519896, 102.31124321645238), (193.30702089466976, 102.28670950779401)], [(193.35391195969086, 102.27960512238951), (193.36557172117793, 102.28609838116367)], [(193.318740110107, 102.30861101002684), (193.29665010648768, 102.3280408839998)], [(193.36260015506073, 102.29528123920822), (193.34722759268337, 102.28131841747073)], [(193.3187242382402, 102.2896990502145), (193.34192071905153, 102.27870186619381)], [(193.35539586520028, 102.30831439128369), (193.36748414296562, 102.31197219568534)], [(193.32675179134426, 102.29412397023589), (193.33959571334088, 102.3123079523544)], [(193.36383281501122, 102.27648508304192), (193.3643491655515, 102.25940817529849)], [(193.32603378166877, 102.31504771927275), (193.32870015823033, 102.31483141730241)], [(193.36065976914213, 102.29645593487652), (193.3811602295356, 102.30909494069336)], [(193.3561002112274, 102.28953113992019), (193.34050466694876, 102.29861313361859)], [(193.33137944995687, 102.29129861059921), (193.35006257239442, 102.27820483498029)], [(193.35228014178819, 102.31987289263807), (193.3539647703318, 102.31067594330635)], [(193.36197991376102, 102.31038107375862), (193.38127121661213, 102.31171548475385)], [(193.3197163893859, 102.28668445117293), (193.3338755567143, 102.30228402280594)], [(193.3190543104732, 102.286501992188), (193.30482018331347, 102.29199692367375)], [(193.35431417630394, 102.29812460520446), (193.365088576887, 102.27636171295028)], [(193.32215208872086, 102.29677111280502), (193.32763930030313, 102.32075280153974)], [(193.3561825734436, 102.29724305544767), (193.37125863193546, 102.30056587755517)], [(193.32964538337046, 102.2775335024697), (193.31288466900244, 102.26315158759878)], [(193.3580647374825, 102.27806537979396), (193.3672364031838, 102.2963219299004)], [(193.35926874178816, 102.31097753676275), (193.3608514194517, 102.30805339437717)], [(193.3192195107217, 102.31641750827914), (193.34015005359845, 102.3329146749252)], [(193.33096072022448, 102.27417116807254), (193.32669202703818, 102.28610231076335)], [(193.31694471943948, 102.30879936727462), (193.3273461015083, 102.29770820583539)], [(193.32860253027667, 102.27283834938042), (193.31402374571772, 102.28632657593772)], [(193.34711425656673, 102.2973994067249), (193.32703710653593, 102.31960210795341)], [(193.33883131365337, 102.32001413722183), (193.35475151387593, 102.30877798920477)], [(193.34558479077816, 102.3021087953263), (193.32792796523478, 102.30191175969154)], [(193.34557155998064, 102.32020461930475), (193.34708869795605, 102.29770164415457)], [(193.32723610518602, 102.31328431264068), (193.3074191933992, 102.3280931268774)], [(193.34301752182213, 102.31737343837808), (193.35845088398375, 102.29823766956045)], [(193.33257876320343, 102.31083776296386), (193.31062511719466, 102.29638807571406)], [(193.32831358665425, 102.27819264691152), (193.3068774480775, 102.29372209188266)] + CALL_1103@GraphGeneration.gov + CALL_1103 + + + CALR + [(0.7324907664218324, 139.2583942272766), (0.7134738343143134, 139.2833350059802)], [(0.7671775491930368, 139.24377902671463), (0.7869780326878775, 139.25575423853084)], [(0.7324705629890134, 139.23273630426925), (0.7490224385279208, 139.255363854424)], [(0.7652804948747125, 139.26912667734928), (0.7510308628380669, 139.25135177680207)], [(0.7745259546055573, 139.26374526446625), (0.7882828528363669, 139.26312614867723)], [(0.7547289189538, 139.26317790429363), (0.7364053412480835, 139.24138135986286)], [(0.7723944454660583, 139.27800674265316), (0.7541320788306667, 139.2781139108078)], [(0.7276182926919902, 139.26939015202183), (0.7508726032461857, 139.25107219846836)], [(0.7275155690738495, 139.2435926045723), (0.7183262815989387, 139.26130083565536)], [(0.7407567375484813, 139.26818535145924), (0.7196136342097391, 139.2776349229235)], [(0.7575796664588562, 139.232401189968), (0.7498314580056261, 139.24067315291038)], [(0.7467320822099476, 139.2429650466579), (0.7459931986323393, 139.23780229839426)], [(0.733690129737558, 139.26790380218907), (0.7261493658620821, 139.2912719334829)], [(0.7515303492889918, 139.2413476024279), (0.7691189798743828, 139.24672012771782)], [(0.7622906414838104, 139.23267407091035), (0.7777317230808715, 139.24930727429356)], [(0.7327614276129318, 139.24706226446727), (0.7306596685935663, 139.24840043172784)], [(0.7696651629392278, 139.24912766506543), (0.746315800975011, 139.26487250869704)], [(0.7731373502634132, 139.2550832538014), (0.7550597944332926, 139.2434575188854)], [(0.7624454370652469, 139.23478541006858), (0.7789199341513771, 139.22186900147918)], [(0.7448723063050847, 139.2717740679163), (0.7317971156812768, 139.2914613079341)], [(0.7360473369790292, 139.23917542302064), (0.7503370031336914, 139.21602150238886)], [(0.7350932065058879, 139.2670337601436), (0.7283483835093678, 139.24291785945402)], [(0.771156971807563, 139.245314881996), (0.7765854930401842, 139.23782861973518)], [(0.7386681366017189, 139.23468569389522), (0.7179695238109911, 139.2379473117476)], [(0.7637249078151567, 139.2473727432281), (0.7462580044930661, 139.23362222482547)], [(0.7478238960418085, 139.23268665742842), (0.7411298320016352, 139.21117856409006)], [(0.7478441371670141, 139.23979325038658), (0.7267282755109148, 139.25543705289553)], [(0.7370404318375701, 139.27080279532), (0.7380833857505313, 139.28571744116732)], [(0.7603331245497111, 139.26258037457148), (0.7566513325423598, 139.2637085770383)], [(0.7413821791386754, 139.25960852502817), (0.7446321913364614, 139.2518214797215)], [(0.7664859513588327, 139.28017238118656), (0.7775102913688593, 139.288302411973)], [(0.7566707059980328, 139.24822003241295), (0.7594567490211244, 139.26812637880712)], [(0.734259445034514, 139.2616815440545), (0.7283850853572658, 139.2819532122258)], [(0.7543093354568241, 139.2681886530151), (0.7764470585320472, 139.25554974024544)], [(0.7251752975438889, 139.26948759114867), (0.7143788657903427, 139.2603387733996)], [(0.7625304714552, 139.2640948419842), (0.7494369124168672, 139.24434902689077)], [(0.7669091998100623, 139.24423257109356), (0.7625286547152279, 139.25802624620997)], [(0.7447030539344065, 139.26959659849723), (0.7505638698909897, 139.26908529452504)], [(0.7609262563824757, 139.280926363295), (0.7804856149710466, 139.27317292331267)], [(0.7621682558467469, 139.2330861671268), (0.7463244975809157, 139.2464259052237)], [(0.7455233028443202, 139.2453043848328), (0.7459083313913153, 139.24566143494985)], [(0.7256300603988367, 139.25635278233517), (0.743483932611509, 139.25109490117822)], [(0.758913843324082, 139.26212870462726), (0.748698041154107, 139.259891411311)], [(0.7528965916616215, 139.24016508422255), (0.7616536897951544, 139.26362592536148)], [(0.7492746059093998, 139.27742020807213), (0.7572918539663918, 139.293873170204)], [(0.7665406249492254, 139.2394384608378), (0.7901837216052044, 139.2222575707196)], [(0.7610153360054952, 139.23227728641356), (0.7577706825928554, 139.25489283184433)], [(0.7285318908172029, 139.2681030692371), (0.733475456559945, 139.29026842089502)], [(0.7496065934419713, 139.23543062136847), (0.748488806048652, 139.24967895985426)], [(0.7655402941999753, 139.2553396674378), (0.753427871035592, 139.24187645067082)] + CALL_1195@GraphGeneration.gov + CALL_1195 + + + CALR + [(112.0575172891964, 117.30390056090442), (112.0427324141244, 117.28171914380235)], [(112.07508417820883, 117.27920985704552), (112.08394359981828, 117.29858953575008)], [(112.09547336370296, 117.29931006126603), (112.08615399808318, 117.29553531798321)], [(112.07591679575685, 117.30112764172196), (112.07988109112362, 117.29207685883063)], [(112.06432030851879, 117.28856928295902), (112.07477488163597, 117.27263277172857)], [(112.094396561351, 117.30289665816426), (112.11905986826632, 117.31706860258319)], [(112.0855308958429, 117.31733696500451), (112.10786607795332, 117.31762225195064)], [(112.07861244057884, 117.28001391521585), (112.05583385450619, 117.29486842786943)], [(112.07074113371016, 117.30977898758668), (112.04727361834205, 117.31500509050959)], [(112.07888021439977, 117.29059870786894), (112.06045592912702, 117.29294661205368)], [(112.06479363790284, 117.3045181808679), (112.04879494231403, 117.3077929635474)], [(112.0800532106261, 117.27232440382825), (112.05543518224738, 117.27177587250873)], [(112.08841386279127, 117.27799200616136), (112.06638437089447, 117.29742887498378)], [(112.05778767966076, 117.29259741877519), (112.04329470791735, 117.29941967125008)], [(112.07672641916102, 117.29041910074828), (112.09641065014523, 117.31076216872198)], [(112.08728001633506, 117.29591696203768), (112.11187225931445, 117.29758016306562)], [(112.09864016172284, 117.31218608395908), (112.10955438334533, 117.28894719371623)], [(112.08313832702024, 117.27598681149985), (112.10124091514669, 117.27815089388577)], [(112.07092756002278, 117.30728852613333), (112.0690704240774, 117.31258116106139)], [(112.07045210036362, 117.30686449669183), (112.05505050145895, 117.3009140899639)], [(112.09657209192187, 117.3076223960985), (112.1105738415972, 117.28517203460413)], [(112.09165452306335, 117.27783579554017), (112.07099388263855, 117.28315988754683)], [(112.06323692108786, 117.30524487152125), (112.06205736771061, 117.29053917237827)], [(112.06709233906498, 117.282222819763), (112.07704794172673, 117.26409795393761)], [(112.05863744486653, 117.28349900874072), (112.04942161561145, 117.27197478735684)], [(112.09621173259966, 117.27909326142704), (112.11608150067592, 117.30095468096626)], [(112.10271622092958, 117.27128227715106), (112.08723896322712, 117.27451196823624)], [(112.07242607214471, 117.29509454125073), (112.09421929436526, 117.30007477627943)], [(112.08602727739901, 117.30734471902606), (112.08286857433099, 117.30542384816874)], [(112.06131925670576, 117.26997748580796), (112.04547130846684, 117.25459141942667)], [(112.06828517151811, 117.2692561831417), (112.09083596636475, 117.24849567016497)], [(112.09792041632141, 117.2682451320366), (112.07293618964164, 117.26572079774716)], [(112.07915212594357, 117.28493485070749), (112.09888533404761, 117.26494506930247)], [(112.05826434959931, 117.284541739495), (112.08276743960002, 117.28850921449893)], [(112.06030524377998, 117.30129012887276), (112.06179333761517, 117.28494801589012)], [(112.10283755463516, 117.27023090987552), (112.11886037533655, 117.24537035494832)], [(112.09128646475814, 117.31200954798287), (112.0863729245765, 117.32126937684312)], [(112.10362180332083, 117.29342466409923), (112.12593895763413, 117.2726406900314)], [(112.09683673747847, 117.30630111371384), (112.11610954160035, 117.2870824491037)], [(112.10194001330396, 117.30870575757508), (112.0905371064737, 117.31441581172392)], [(112.09473596788251, 117.29256696496763), (112.09967269440435, 117.27015580721236)], [(112.10037010145679, 117.28601134783851), (112.11780410664552, 117.27018557253683)], [(112.09763055010761, 117.29234126221301), (112.10200565937387, 117.27460237190121)], [(112.08082928842173, 117.28614203582428), (112.09872636129808, 117.28295122062748)], [(112.09070040536461, 117.3175554051807), (112.07180532797818, 117.31270110325423)], [(112.05758753861154, 117.28748688742134), (112.03904909424095, 117.27707672776586)], [(112.05687652867354, 117.31642601958397), (112.08051793715113, 117.31348767880212)], [(112.0586640019043, 117.29778568778222), (112.04052594319921, 117.28203535192314)], [(112.05902811747413, 117.28418319288329), (112.05193661734098, 117.28213364252834)], [(112.07498883565991, 117.2929554593039), (112.06846045294893, 117.31761448881726)] + CALL_1287@GraphGeneration.gov + CALL_1287 + + + CALR + [(178.6767548239067, 124.33664587304243), (178.66621577757186, 124.3135685917251)], [(178.6994773707021, 124.34669956843332), (178.7179358100699, 124.36971065982864)], [(178.70392122989543, 124.38274450151546), (178.7192556851807, 124.39316691423953)], [(178.71536413164222, 124.37833846006568), (178.73755148588435, 124.3638448937214)], [(178.71726241248624, 124.35359835677622), (178.70233220601955, 124.35644859965043)], [(178.6826747706655, 124.37117750788885), (178.68250035152326, 124.36054262497368)], [(178.70264474015363, 124.34488186240256), (178.68612550628836, 124.32863443010059)], [(178.68705553322073, 124.37164012936088), (178.66718796965537, 124.36498197346191)], [(178.70780916847423, 124.37985883231109), (178.73248651115858, 124.40110387227375)], [(178.7162262882757, 124.37710536583744), (178.7219890988848, 124.39203618983635)], [(178.71943863733847, 124.36882935826182), (178.70553734694883, 124.37775571651017)], [(178.69500178211842, 124.37331191852515), (178.6891707067012, 124.37034979074556)], [(178.690052014229, 124.34925763923705), (178.67961746859424, 124.32998394242641)], [(178.71569574715033, 124.37873655790875), (178.69723187675703, 124.37057798620637)], [(178.71154422119855, 124.36254582321439), (178.69876738481315, 124.38656662707444)], [(178.6832519083019, 124.3518370144818), (178.68186669114883, 124.33497832341358)], [(178.6828593458311, 124.36445439651163), (178.69177683562094, 124.36010953496475)], [(178.6941963618943, 124.3817135977459), (178.70755141328533, 124.39982381190251)], [(178.69474552848203, 124.3579195827542), (178.6866099012522, 124.33930814448793)], [(178.6919172125442, 124.34558105609328), (178.7118088430375, 124.33093514822735)], [(178.69039285555957, 124.34327545539287), (178.71438843149716, 124.33386933297041)], [(178.71130289276044, 124.37030456478446), (178.69373568137487, 124.36056319856282)], [(178.6912272629824, 124.37917145422418), (178.7017677291945, 124.40071127069642)], [(178.67587367698528, 124.38002287618875), (178.66203848876495, 124.38445706828787)], [(178.71949136176568, 124.37682343513352), (178.70423343851863, 124.36599932263924)], [(178.68181083793323, 124.37645992861387), (178.65769190035257, 124.36681401284109)], [(178.6937313775717, 124.37999403944042), (178.69985297367336, 124.37800090563937)], [(178.6991131599868, 124.36659092031897), (178.68684988964068, 124.35311313852655)], [(178.71290640790232, 124.34674124691499), (178.71213362708528, 124.3289826413)], [(178.7035997148054, 124.34319724954081), (178.68725236392635, 124.33974350475825)], [(178.70379566426547, 124.37782176665486), (178.72066192927645, 124.36058602960128)], [(178.70471163134465, 124.37907868082016), (178.68059649513444, 124.37210851658536)], [(178.69793392271404, 124.35753648413053), (178.68020318727628, 124.34016820144124)], [(178.70983896646518, 124.35699295726924), (178.72495193536577, 124.3601484943091)], [(178.69503155665487, 124.37924966917492), (178.71260200297033, 124.38673331217655)], [(178.7046643912748, 124.3557138302883), (178.70835043520765, 124.33429857791447)], [(178.70386630037348, 124.37650762433955), (178.7010653987088, 124.36527448052453)], [(178.7241236665972, 124.3642539227943), (178.69984151057, 124.38027321622313)], [(178.72166527734592, 124.36226087493648), (178.72902730607797, 124.36110123893042)], [(178.6790464544961, 124.36831421963815), (178.69000437550545, 124.35480872192817)], [(178.6806517665921, 124.35658667876355), (178.70085580898834, 124.36776003300065)], [(178.678213687503, 124.34424117329009), (178.6860527735873, 124.35354071907985)], [(178.68026544259155, 124.34110899164901), (178.6722704371041, 124.3449626101106)], [(178.7223322471133, 124.34094475356439), (178.74690005020196, 124.32414170864423)], [(178.68504266175324, 124.3584668982736), (178.6793423715963, 124.37986637004241)], [(178.69764105510026, 124.34869923738286), (178.70742092105237, 124.356144234524)], [(178.68585494222333, 124.36437966638678), (178.6694148081001, 124.34270230845792)], [(178.68722826454942, 124.3817698460023), (178.68870390668081, 124.36373625098412)], [(178.7208807751554, 124.37172559375762), (178.6992739815352, 124.36378763812016)], [(178.70058043852515, 124.35936238864498), (178.7113222800087, 124.34996026661572)] + CALL_1379@GraphGeneration.gov + CALL_1379 + + + CALR + [(25.793830415434137, 156.68592262583098), (25.79386759046882, 156.66490547871658)], [(25.803478113771348, 156.7038562251108), (25.823303534248247, 156.70107872718617)], [(25.81266141119138, 156.67782405426018), (25.81426927729917, 156.65379053953893)], [(25.842620024241956, 156.68537753282808), (25.865018208551007, 156.67408404139627)], [(25.830769641170107, 156.70009243867463), (25.832980307732093, 156.70917454160661)], [(25.819251250914704, 156.7040239270342), (25.819998581735586, 156.72726854899489)], [(25.8027753544117, 156.7014404727958), (25.807024256618185, 156.72472885586646)], [(25.818417673576587, 156.6636966335134), (25.830026961165327, 156.66339610232174)], [(25.82493920360983, 156.69180380223514), (25.819972697651302, 156.6872644092486)], [(25.84128821312878, 156.66052826407577), (25.86101516760729, 156.6546153902422)], [(25.839002893512408, 156.6783854709616), (25.827694495718674, 156.68221822035534)], [(25.817281229592624, 156.70437650640739), (25.803961035424667, 156.6961864210909)], [(25.80047716880567, 156.7029882623466), (25.804227622271615, 156.72191373107933)], [(25.82622486431979, 156.66368858078187), (25.801477297947685, 156.65794071193926)], [(25.814816382445375, 156.67639781184707), (25.805200036745287, 156.65708447817337)], [(25.823165955217608, 156.67249143379922), (25.840953432695645, 156.67554022885832)], [(25.799952814815857, 156.69950664727585), (25.814090344186617, 156.67715232673467)], [(25.805916181920605, 156.69081923936207), (25.784550139299306, 156.6801412568045)], [(25.83652763736234, 156.69507818367225), (25.833623855420385, 156.67787993848168)], [(25.826825051029285, 156.68845536250993), (25.802322751965384, 156.678687406833)], [(25.808096517805904, 156.70059712572598), (25.80749584359135, 156.6957283289377)], [(25.839253563853873, 156.66475764305835), (25.83387697639864, 156.66233820398924)], [(25.806724735482153, 156.67188634582345), (25.82563064437975, 156.67748873423076)], [(25.8108770082835, 156.6978718432943), (25.8290338197979, 156.70307590280078)], [(25.83588854888928, 156.66036416987492), (25.83039272827277, 156.68291065910964)], [(25.806586312764576, 156.69069131542722), (25.79212071589721, 156.67939873178875)], [(25.839597655532227, 156.68804933261225), (25.81741069189921, 156.70207364326933)], [(25.84291397065452, 156.6989111910386), (25.842681906308876, 156.6909005347585)], [(25.84170662599487, 156.65840401214825), (25.86010993638829, 156.65661161356385)], [(25.839427237283573, 156.66065276464835), (25.85767794967066, 156.68104683946308)], [(25.831853310121, 156.69265950078068), (25.852430400122422, 156.6876078976251)], [(25.823678617641495, 156.69121799566167), (25.83174874333902, 156.67573787669434)], [(25.819509290827085, 156.66844991506107), (25.80091295719179, 156.6482626858227)], [(25.834501001038475, 156.7041538886923), (25.821870126132584, 156.69263081800082)], [(25.810962107798897, 156.65683788214358), (25.83064120627578, 156.67436228225998)], [(25.821842735409003, 156.6608508258936), (25.796922172140842, 156.6712073385651)], [(25.798026665916236, 156.66814847416268), (25.804358812853796, 156.66904963958854)], [(25.836721732638985, 156.67104382170737), (25.84893823482885, 156.65940276126898)], [(25.80685456849023, 156.659582398144), (25.8118220866547, 156.63472883445556)], [(25.84220859674178, 156.69500732282037), (25.8237866257066, 156.67498506394242)], [(25.832937563086947, 156.67447510155762), (25.845223459998724, 156.68562248777104)], [(25.833987013881192, 156.68829732178284), (25.822756776700597, 156.68498076209988)], [(25.82821756139512, 156.6603767072113), (25.804718828619844, 156.68370823794052)], [(25.832975346006446, 156.6732070362976), (25.828109020020232, 156.6763323385783)], [(25.837783037186597, 156.70000568258135), (25.814132082021924, 156.71009569068738)], [(25.814221818540936, 156.7004545094058), (25.79046536399938, 156.7096268152616)], [(25.799993873032268, 156.67932569072383), (25.821631799522724, 156.6767686856252)], [(25.804182649081277, 156.7038727766538), (25.822399441541315, 156.6819761290876)], [(25.80856618047867, 156.65643771979052), (25.808725991065476, 156.67665268547415)], [(25.793959243443894, 156.6785715909022), (25.78562216033951, 156.66666071613014)] + CALL_1471@GraphGeneration.gov + CALL_1471 + + + CALR + [(71.30529400710132, 159.69954579043275), (71.28182676964595, 159.7161441053811)], [(71.27974910329294, 159.7200060023932), (71.28242745495062, 159.7431044070106)], [(71.30074578251711, 159.7122251844581), (71.32307292541944, 159.68861553393856)], [(71.30011466527355, 159.69233210148866), (71.2781324282422, 159.7080265971041)], [(71.3032556332566, 159.7162136333786), (71.31987842392276, 159.71534764120278)], [(71.30432302852725, 159.73895200331634), (71.29466721432298, 159.71408472193738)], [(71.28256016146389, 159.72698054144726), (71.2778212673205, 159.71294034806286)], [(71.2850694289528, 159.6977347526994), (71.30705607049181, 159.682100892911)], [(71.28615964409886, 159.73711390817888), (71.3009670534839, 159.74857395706343)], [(71.26335138508179, 159.7282519485816), (71.26649454237015, 159.73089480395274)], [(71.26048735307108, 159.7342842105959), (71.26804269614927, 159.73747455270043)], [(71.26512864289371, 159.69895574961868), (71.28988969298706, 159.68692993758725)], [(71.26329401301952, 159.72172069340712), (71.25631808971222, 159.73183532650444)], [(71.30062169011835, 159.72282864724306), (71.2884986408618, 159.72617559966596)], [(71.29373780467384, 159.7335093720846), (71.28159818113157, 159.74065397398314)], [(71.28098164973136, 159.70968057547788), (71.25912635530587, 159.68594880987624)], [(71.2753878357016, 159.7337269539051), (71.25591143284018, 159.73969805588902)], [(71.2673543179149, 159.71659344612846), (71.26652900944595, 159.7140377683854)], [(71.27578249129124, 159.73090609223345), (71.28160579054652, 159.72168948690853)], [(71.30805608754524, 159.7264038173672), (71.31870573106194, 159.70757559880184)], [(71.27174559508671, 159.69668363077906), (71.26969954560214, 159.7018596415527)], [(71.29017732038909, 159.70173630339875), (71.30345550033395, 159.6781589827376)], [(71.28980321667373, 159.73351166583416), (71.29132402185775, 159.72125143997377)], [(71.28758517944762, 159.7041835931118), (71.26752565431534, 159.72687665593833)], [(71.29808651108075, 159.71700549928212), (71.32116331356706, 159.7199085558451)], [(71.30090219054286, 159.69706325622977), (71.27984477710781, 159.70881959402888)], [(71.26383295015623, 159.73962664286182), (71.24753188458057, 159.75777673872588)], [(71.30667804734973, 159.7412862690798), (71.30688563040397, 159.757082273065)], [(71.29228315734528, 159.71799724311504), (71.30452277316788, 159.69924548229)], [(71.30690913478583, 159.71413371155109), (71.29809536427658, 159.72045422290168)], [(71.3086056357854, 159.71990868216344), (71.31269599096356, 159.72281009656294)], [(71.29247266742362, 159.70721867556915), (71.27056278886475, 159.70966273949062)], [(71.28555684570387, 159.72095702459072), (71.27360513840188, 159.70659951616292)], [(71.28895330728544, 159.70288955331023), (71.28810779261401, 159.71345157532747)], [(71.26898093043043, 159.73386820420825), (71.28563165488926, 159.70949417246214)], [(71.28449699334968, 159.7278383575248), (71.28132238748083, 159.7311636428309)], [(71.26338114345363, 159.72382750366384), (71.24938989988848, 159.72365598754874)], [(71.27137078129121, 159.71892495913136), (71.27366046983431, 159.69509040847637)], [(71.29004237335464, 159.70131923857042), (71.26824026425295, 159.69106481702653)], [(71.26927935435982, 159.73896747407943), (71.24985727820221, 159.74746690467995)], [(71.27672755892323, 159.71113411729232), (71.29885037540242, 159.68969134898663)], [(71.29569731357256, 159.7104493772465), (71.3094458527273, 159.6922097579198)], [(71.28256397425781, 159.73713127061228), (71.29915378818473, 159.75234709084697)], [(71.29520525821754, 159.70878917402405), (71.29879313380461, 159.68492757905466)], [(71.3041420942759, 159.71457278521135), (71.32440255107926, 159.7095434392067)], [(71.27790261398283, 159.73560449282706), (71.29591862582416, 159.7420510521444)], [(71.29135727455268, 159.71828906519843), (71.30320637177817, 159.70051284820815)], [(71.27139750884804, 159.7333798677096), (71.28374324860297, 159.72349307174636)], [(71.28727188300108, 159.71425907057468), (71.28853369300788, 159.73918578366792)], [(71.28559715390362, 159.7165580818004), (71.30968831853453, 159.7321307553238)] + CALL_1563@GraphGeneration.gov + CALL_1563 + + + CALR + [(165.44241141325193, 145.40751468398773), (165.44129366575862, 145.42895208841855)], [(165.43400426082974, 145.40429764710026), (165.41008826058808, 145.40086759876738)], [(165.47570464775967, 145.37086220099894), (165.47470352269042, 145.39526713652066)], [(165.4679190196674, 145.36387264874216), (165.47433279287168, 145.3739152578356)], [(165.45118226427778, 145.40210769341024), (165.46588429775164, 145.3828434820354)], [(165.44784637647055, 145.3783560672535), (165.46712167639689, 145.3732628325983)], [(165.46319972638844, 145.40454637887245), (165.4472949696907, 145.38893972024866)], [(165.4810885031986, 145.386298012183), (165.4907760087474, 145.37880517638968)], [(165.46205104661294, 145.36381711657788), (165.45220575973178, 145.37303956039653)], [(165.44319476751397, 145.38374795040647), (165.42733361726917, 145.3731089705266)], [(165.43912053905075, 145.37884524427074), (165.4329179256832, 145.401408418712)], [(165.44005127015117, 145.39708836318377), (165.42352159313555, 145.3914532764678)], [(165.4748343343059, 145.36625843248245), (165.4792592917545, 145.35903784069464)], [(165.4339020969745, 145.38855861993753), (165.4145423434426, 145.41249975866344)], [(165.43439510862032, 145.38419821574084), (165.41973824371127, 145.40218924565033)], [(165.4709012964644, 145.39421035734182), (165.45616866214152, 145.38365643465963)], [(165.44843718579742, 145.36946542561907), (165.44679235798938, 145.38569902436927)], [(165.45582699652977, 145.37011984734013), (165.44220962434355, 145.39387649626605)], [(165.47216067830766, 145.39229293169035), (165.45848698752602, 145.3707957992554)], [(165.47639105921806, 145.39347681586014), (165.47053834329782, 145.41093249090983)], [(165.44584433941574, 145.35963344464267), (165.43154302312712, 145.35994745369533)], [(165.47975125915372, 145.3672347510043), (165.46310021590634, 145.3423932900746)], [(165.44450147676568, 145.38482543099187), (165.42196433397805, 145.3608295144869)], [(165.44698746658318, 145.3756146296975), (165.4646751634074, 145.38546451557463)], [(165.46994097160098, 145.3717895902611), (165.47601448448157, 145.38913537593726)], [(165.47209358029525, 145.40463799595304), (165.45689264481598, 145.38570123219833)], [(165.43352924778645, 145.40524657148418), (165.451137604217, 145.39782634949208)], [(165.46932661094127, 145.4051323887782), (165.4883409524534, 145.393586594696)], [(165.4393920886665, 145.39516596187494), (165.43559471414895, 145.41172317501034)], [(165.43894492431895, 145.3689102319123), (165.44661779022306, 145.35393403845993)], [(165.4728055881842, 145.3589170927649), (165.47741224995607, 145.3568822810105)], [(165.45321779687833, 145.4002223614872), (165.46289620111446, 145.40228014353997)], [(165.48014547556332, 145.39736037474987), (165.50311224427088, 145.37770440083222)], [(165.48174179755182, 145.38560902770294), (165.48320875912893, 145.3620511904183)], [(165.444161332737, 145.38255050970986), (165.4660188644337, 145.405343112064)], [(165.4479174989805, 145.3998183695135), (165.44055288056106, 145.4135550738288)], [(165.47378668519082, 145.39383380964523), (165.4759131177977, 145.36936008382884)], [(165.48124150263607, 145.4045109641002), (165.48718880702083, 145.4180794166098)], [(165.44869909292416, 145.36947009987367), (165.45593997383918, 145.39445262634052)], [(165.47669036861967, 145.37105904566977), (165.48661267615847, 145.36269286269084)], [(165.44485151284835, 145.36404093462593), (165.4638535107104, 145.35152469856817)], [(165.46014943349414, 145.36215456308378), (165.4628238788986, 145.38648949160077)], [(165.44808311129313, 145.4006420584566), (165.45382446433163, 145.40910742179372)], [(165.47978222979032, 145.40494432881314), (165.5007580634657, 145.40073408329357)], [(165.46649767699432, 145.3885646742391), (165.47418875748278, 145.4051261259165)], [(165.43866602797834, 145.40335860747828), (165.44028232575823, 145.397236158134)], [(165.44842447837257, 145.38333033937243), (165.4603483864233, 145.3875776773331)], [(165.46597627197843, 145.3859375616854), (165.47898796004162, 145.4003869417178)], [(165.4357138140332, 145.40820834951697), (165.41910951164044, 145.42092939693146)], [(165.43372097895337, 145.40566238221044), (165.41066309804233, 145.40931213200605)] + CALL_1655@GraphGeneration.gov + CALL_1655 + + + CALR + [(44.06615435264149, 177.3379766480493), (44.06199659659501, 177.34105720110443)], [(44.09074358624136, 177.31515934405928), (44.080191530315965, 177.30138029840694)], [(44.08303033244203, 177.32205691404548), (44.079368799081685, 177.2985475103287)], [(44.0773910760075, 177.3162673075749), (44.07331891713155, 177.3166311777809)], [(44.09435243234118, 177.33266644044437), (44.09720927381237, 177.35113808026261)], [(44.07383868046588, 177.32995474912244), (44.09641140940722, 177.32655227394227)], [(44.09437037653532, 177.3396839355577), (44.08969718850129, 177.34532225744178)], [(44.07552118193232, 177.3342174009807), (44.091974328017216, 177.315366999728)], [(44.10000067091507, 177.34089839512248), (44.102995012842776, 177.34008937829242)], [(44.08585904007541, 177.33772761337295), (44.10114284878255, 177.35694595103809)], [(44.102259371491364, 177.34449075736626), (44.07937822036226, 177.35827824700894)], [(44.08351111839961, 177.34424756414467), (44.06213329345779, 177.3661396267604)], [(44.08061064930311, 177.34364704260935), (44.09830405902897, 177.3602684045178)], [(44.102407752047654, 177.35194609047142), (44.07950389018829, 177.34339842606985)], [(44.06249615752652, 177.30738250662466), (44.059117541300424, 177.2851582245779)], [(44.072582711097276, 177.31139996894237), (44.076870946078685, 177.32170553080203)], [(44.101945945538105, 177.3542874073039), (44.1218690912307, 177.35799899824772)], [(44.07899851303123, 177.30891663289242), (44.08561387889639, 177.294228992209)], [(44.08632140367917, 177.32200495233678), (44.06468691498397, 177.32743148020197)], [(44.05896700316253, 177.3432071142238), (44.07481195812063, 177.32863649666913)], [(44.0601182548832, 177.32506377300913), (44.05015368816263, 177.3177672750297)], [(44.07642805742831, 177.3527334797723), (44.05193657043589, 177.35315542491597)], [(44.08158563901459, 177.34995046700547), (44.09458927000466, 177.3570739636878)], [(44.07541201683873, 177.3084383469605), (44.10039569208362, 177.31991769275436)], [(44.07421326448588, 177.34888919788142), (44.07593356473474, 177.32617331312835)], [(44.073587029709955, 177.33870574524877), (44.08006209175832, 177.32560015432207)], [(44.08497081208849, 177.3498337858699), (44.10449993855566, 177.3627970163674)], [(44.10217308160898, 177.32920529771312), (44.121377211113284, 177.33507654788139)], [(44.097235082064785, 177.35269880930872), (44.07553482519306, 177.3623931966718)], [(44.091943598461754, 177.33350777612384), (44.10586414303518, 177.3523746892843)], [(44.081339677701216, 177.34958923881783), (44.06509503831523, 177.3737021119943)], [(44.08505288132958, 177.32938895488547), (44.10349140461058, 177.3256274375367)], [(44.096027502580476, 177.3514837358206), (44.081456936224264, 177.3452446710541)], [(44.08605768327106, 177.32252881533006), (44.07360825091767, 177.33910797790287)], [(44.079762606558795, 177.33646874644026), (44.08087352480629, 177.33166708265668)], [(44.078001809984464, 177.3356737319347), (44.05936763966197, 177.34970771904912)], [(44.06389627634254, 177.30595866229623), (44.07593775452007, 177.28613654653424)], [(44.08591785540742, 177.32090780864505), (44.07185090946954, 177.32306320141709)], [(44.083886258470585, 177.323319936231), (44.07854157326081, 177.33788082522398)], [(44.09264373286504, 177.3410279990015), (44.06962361431883, 177.32576631709492)], [(44.08811155770472, 177.344531693234), (44.100729355628815, 177.35970645003388)], [(44.103610240653886, 177.34259473868397), (44.110179865732206, 177.3566884619703)], [(44.09073948163323, 177.3348492521116), (44.100302876897835, 177.3101130266441)], [(44.078723636881406, 177.35100348118326), (44.061505258126545, 177.3745828020972)], [(44.07652849667099, 177.33570201430595), (44.07029782239287, 177.34233614378675)], [(44.085743228516705, 177.31900153978756), (44.06958199831377, 177.30880154363734)], [(44.0753684656375, 177.32131396244176), (44.08407337672991, 177.3385364776596)], [(44.07252322591356, 177.33657110531212), (44.07755961530215, 177.3403322623514)], [(44.103656343158605, 177.3210326540053), (44.10276295884911, 177.3459150884081)], [(44.08439694807512, 177.31172442401987), (44.097704846992215, 177.3138194551985)] + CALL_1747@GraphGeneration.gov + CALL_1747 + + + CALR + [(100.38233674991841, 176.72056053761634), (100.39732456935684, 176.7446471508095)], [(100.41077330371007, 176.6833987269306), (100.42542021113503, 176.6608551005327)], [(100.39082976143477, 176.7276044592409), (100.39715150884894, 176.74444316506327)], [(100.37738634574418, 176.71111390775846), (100.38528881424087, 176.73240893110784)], [(100.38123268646552, 176.70596862775903), (100.36242377346977, 176.69524247746625)], [(100.41957746436546, 176.69201432784496), (100.40215391471595, 176.69641851944777)], [(100.39229803433669, 176.70950379125793), (100.37261915584267, 176.7240161191066)], [(100.3983180760309, 176.71211541630043), (100.39178246646794, 176.71966687170186)], [(100.39172568563718, 176.71949285799283), (100.40125408362579, 176.70958559324274)], [(100.41097361617915, 176.6849546451594), (100.39068015201727, 176.68887542362296)], [(100.41827446693533, 176.68246049172345), (100.43480848335956, 176.69917208967757)], [(100.40597276617659, 176.72542256095792), (100.42261533410306, 176.7140284309969)], [(100.3761392394486, 176.68640466977118), (100.36750454314802, 176.71087418443778)], [(100.40594668731622, 176.71799692687418), (100.38405799364902, 176.73902031175257)], [(100.41611204533983, 176.69589398865836), (100.40035999506075, 176.6800768144491)], [(100.41025080461937, 176.7202342535972), (100.39022292456768, 176.69803950194532)], [(100.38048493052808, 176.68449551799964), (100.40420213668537, 176.70345496348006)], [(100.37156568060047, 176.69857479419267), (100.39625883918174, 176.69796447510694)], [(100.39520212427286, 176.7194071523205), (100.41536147869624, 176.73690672221818)], [(100.38419558556298, 176.70301712361552), (100.38499702804455, 176.69946669696964)], [(100.39183525654337, 176.69936839494417), (100.40023351083211, 176.67725754214197)], [(100.41765746220766, 176.68216819089395), (100.41970973027554, 176.6933389545706)], [(100.40239756888583, 176.70754704764533), (100.385810309486, 176.7003224507119)], [(100.37246261322693, 176.7124303004275), (100.36661297472163, 176.70268889641994)], [(100.37831056236845, 176.72759154880245), (100.35928994986641, 176.74353176201456)], [(100.37800637298412, 176.71149259391788), (100.39838017862547, 176.73518995055946)], [(100.38311301866163, 176.7149509158479), (100.36591051627276, 176.7223019783249)], [(100.40892200551843, 176.71808860877465), (100.39137704001159, 176.7299120231409)], [(100.40686473314534, 176.71252649202737), (100.39499971994519, 176.69273992785756)], [(100.37426025962482, 176.70744777656597), (100.39227874257247, 176.7152860366251)], [(100.38555528811423, 176.69772846370734), (100.36646719200266, 176.67393395995796)], [(100.41369969644308, 176.68462655479823), (100.42905491723981, 176.69892983507123)], [(100.39207682484896, 176.69853661200776), (100.38934087749625, 176.68668004955694)], [(100.40636210567199, 176.69568605971466), (100.42349917119252, 176.67212916553163)], [(100.39087790360098, 176.72602113643748), (100.39025171757572, 176.70887178738343)], [(100.41509399348124, 176.7112522506051), (100.43752217664861, 176.69410192433872)], [(100.41694025076828, 176.68091768392068), (100.41461652260487, 176.69521067706506)], [(100.40203835617167, 176.70725535892333), (100.41458624791115, 176.6912494617687)], [(100.3708854662903, 176.69189697744858), (100.35776030576581, 176.70845089722403)], [(100.40405378237318, 176.70928077097062), (100.42591642928141, 176.7111814134926)], [(100.38481632959986, 176.707216195234), (100.40656074115134, 176.69800818273902)], [(100.3742700492894, 176.68115054276896), (100.38637772370667, 176.65619807193244)], [(100.37385473275677, 176.695787174213), (100.35819914654071, 176.6871796819125)], [(100.41593800494951, 176.71288272311455), (100.42154352578225, 176.72479881808033)], [(100.3823754229288, 176.71611310848522), (100.36968765649546, 176.7387195223214)], [(100.40014749683148, 176.7139136425304), (100.39876477317559, 176.7194223658032)], [(100.39701059129595, 176.72107411748678), (100.41598807195328, 176.7432209501556)], [(100.3811447004315, 176.7212434899088), (100.37361120465685, 176.7269244575528)], [(100.41906291432308, 176.68843342239543), (100.41498570053113, 176.6681463919777)], [(100.40885878847952, 176.72374074911784), (100.40740572666829, 176.72611585465847)] + CALL_1839@GraphGeneration.gov + CALL_1839 + + + CALR + [(190.64087145425094, 195.66780168639224), (190.6471876976333, 195.65324779278075)], [(190.65793413033208, 195.64038248081397), (190.67800027665254, 195.63558152114254)], [(190.61127697017886, 195.64706841429674), (190.61396700416952, 195.67059797861074)], [(190.613382710657, 195.65388239886187), (190.621547500933, 195.65511337622286)], [(190.65145561413976, 195.63582113698192), (190.6302879582545, 195.63905173581202)], [(190.63421714958486, 195.64182182968204), (190.6526319971942, 195.647965343716)], [(190.64097286254162, 195.64614567474257), (190.65832543813772, 195.65613907177115)], [(190.65279331378673, 195.6746625205397), (190.67191332181807, 195.67029945562257)], [(190.6246062885783, 195.67497710300503), (190.61969229905776, 195.66514783971522)], [(190.62834192005838, 195.66208256080873), (190.6529331267554, 195.65087569389684)], [(190.61615975562486, 195.64629340086594), (190.59896429060905, 195.6514650610897)], [(190.6203029940933, 195.6340229196785), (190.59951098218463, 195.64979315265265)], [(190.64706405663006, 195.64142530968158), (190.6293067495477, 195.65011369782175)], [(190.62548006935313, 195.6354928288039), (190.64059929440438, 195.62938568062086)], [(190.65323027238176, 195.65857779969966), (190.65678777140155, 195.66685097302746)], [(190.62491529301553, 195.65975143622373), (190.64009693490658, 195.68195605467795)], [(190.65571589573767, 195.6714464665681), (190.66051483298088, 195.67878366834992)], [(190.61632357237497, 195.65426423735585), (190.62730359962706, 195.66204068148963)], [(190.6423507593815, 195.66271554184613), (190.64344431436305, 195.68438136901364)], [(190.6419639188307, 195.63704752957207), (190.62691632022532, 195.61570137929604)], [(190.61994737159705, 195.64594547602275), (190.63906576421232, 195.63085290608657)], [(190.6525573410218, 195.6735661023715), (190.66228230393017, 195.65382290181316)], [(190.62772830100215, 195.66401096361892), (190.6332679629348, 195.68129075256985)], [(190.61242933907508, 195.67495545608793), (190.59126728122766, 195.6799726890429)], [(190.6387337497848, 195.66934643566108), (190.661584038529, 195.65257217368918)], [(190.65248726617236, 195.64902032802004), (190.64898109872448, 195.66058209740783)], [(190.61495030855227, 195.6680110181368), (190.594989425481, 195.65657390716345)], [(190.6278530707747, 195.65846771367694), (190.61811267089584, 195.63902345869937)], [(190.64923912242304, 195.6663187838087), (190.66491368077862, 195.6875989604084)], [(190.64898557718047, 195.67010849708234), (190.65826975806905, 195.65324851062542)], [(190.64313170609012, 195.64085299899162), (190.65963453409262, 195.65616739510338)], [(190.6319187850608, 195.67340647061033), (190.61970360206882, 195.6531136008313)], [(190.63792425909523, 195.6463806555468), (190.61320722925808, 195.64568788320693)], [(190.63874310315666, 195.62927949621934), (190.6602300025264, 195.63214682721468)], [(190.64676065457138, 195.6422652879118), (190.64171074977807, 195.64176081073532)], [(190.65806541261264, 195.65569928310774), (190.68245486595328, 195.65444595008984)], [(190.6419075140538, 195.66970145647664), (190.65088571765293, 195.67053979024175)], [(190.6277523827463, 195.6572468095835), (190.60283388394873, 195.6476489263654)], [(190.64936035694086, 195.64398863164357), (190.64864448722895, 195.6331216051457)], [(190.6445667111891, 195.66166602109698), (190.62000621268768, 195.64107571844193)], [(190.6353864317928, 195.66840978280408), (190.6567255159688, 195.66717936128876)], [(190.62506243409362, 195.6572025587481), (190.64974361582014, 195.66090219537625)], [(190.628715944111, 195.66183401708918), (190.6311458973602, 195.68485322544734)], [(190.62207698054698, 195.63035172541), (190.62054784607335, 195.65134498017673)], [(190.65493656524325, 195.65782031343997), (190.66818694821544, 195.66500405369567)], [(190.6483021460297, 195.6436890606508), (190.64860789896147, 195.66513136049377)], [(190.6455428435414, 195.65261564994472), (190.64597039306625, 195.65342041069326)], [(190.65425339543975, 195.63825517566193), (190.63021897965652, 195.63962270452683)], [(190.6349234146997, 195.65026931610635), (190.6254561307201, 195.64953721837975)], [(190.65429296548882, 195.63921011336694), (190.64341940999108, 195.61429631900054)] + CALL_1931@GraphGeneration.gov + CALL_1931 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configfiles/inputs/test-medium-911-calls.xml b/configfiles/inputs/test-medium-911-calls.xml new file mode 100644 index 000000000..6a58c0f15 --- /dev/null +++ b/configfiles/inputs/test-medium-911-calls.xml @@ -0,0 +1,34166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configfiles/test-small-911.xml b/configfiles/test-small-911.xml index e6f554bfb..80fd7f54e 100644 --- a/configfiles/test-small-911.xml +++ b/configfiles/test-small-911.xml @@ -9,7 +9,8 @@ 1 - 100 + + 1 25 diff --git a/docs/Developer/CMake.md b/docs/Developer/CMake.md index b0eb6a3e9..fe84ace42 100644 --- a/docs/Developer/CMake.md +++ b/docs/Developer/CMake.md @@ -24,4 +24,6 @@ - Verbose output: https://sidvind.com/wiki/CMake/Verbose_output +# Examples +- To build for profiling on the GPU: cmake .. -D ENABLE_CUDA=YES -DCMAKE_BUILD_TYPE=Profiling diff --git a/docs/Developer/FromCpuToGpu.md b/docs/Developer/FromCpuToGpu.md new file mode 100644 index 000000000..e96a1e3db --- /dev/null +++ b/docs/Developer/FromCpuToGpu.md @@ -0,0 +1,5 @@ +## From CPU to GPU + +Graphitti is a high-performance simulator of graph-based systems, currently being applied to computational neuroscience and emergency communication systems. It runs on both CPUs and GPUs and can simulate very large graphs (tens of thousands of vertices; hundreds of thousands to millions of edges) for long durations (billions of time steps). + +The typical process for implementing a new system using Graphitti is to implement the system on the CPU and then build a corresponding GPU implementation. The CPU implementation is structured such that the GPU can mirror it's implementation. This is done by sharing data members between the implementations in classes such as AllVertices.h and AllEdges.h. Data structures such as DeviceVector.h are also implemented in such a way that they can be shared between implementations without duplicating code. \ No newline at end of file diff --git a/docs/Developer/RegressionTestsDocumentation.md b/docs/Developer/RegressionTestsDocumentation.md new file mode 100644 index 000000000..279a022eb --- /dev/null +++ b/docs/Developer/RegressionTestsDocumentation.md @@ -0,0 +1,63 @@ +# NG911 Tests +This document outlines the parameters used by NG911 regression tests. There are three files required to run an NG911 test; the Configuration file, the Graph file, and the Input calls files. For each of these files, a table is provided showing the main parameters in the file and their values for the existing NG911 tests. + +# Configuration files +| Parameter | test-small-911.xml | test-medium-911.xml | +|:------|:------:|:------:| +| Epoch duration | 900 | 200 | +| Number of epochs | 2 | 1440 | +| Redial probability | 0.85 | 0.85 | +| Average driving speed | 30 | 30 | + +# Graph files +| Parameter | test-small-911.graphml | test-medium-911.graphml | +|:------|:------:|:------:| +| Number of Vertices | 12 | 1932 | +| Number of Caller Regions | 1 | 21 | +| Number of PSAPs | 1 | 21 | +| Min number of trunks for PSAPs | 5 | 5 | +| Max number of trunks for PSAPs | 5 | 10 | +| Min number of servers for PSAPs | 4 | 3 | +| Max number of servers for PSAPs | 4 | 5 | +| Number of EMS Responders | 3 | 630 | +| Number of Law Responders | 4 | 630 | +| Number of Fire Responders | 2 | 630 | +| Min number of trunks for Responders | 5 | 6 | +| Max number of trunks for Responders | 10 | 12 | +| Min number of servers for Responders | 3 | 3 | +| Max number of servers for Responders | 5 | 6 | + +# Input calls files +The parameters for the Input calls table are taken from the cluster_point_process.py file in Graphitti/Tools/InputGeneration/ClusterPointProcess + +| Parameter | test-medium-911-calls.xml | +|:------|:------:| +| Number of emergency calls | 34,119 | +| First (seconds) | 34 | +| Last (seconds) | 32436 | +| Mean Time Interval (seconds) | 62.88 | +| Dead Time after Event (seconds) | 1 | +| Mean Call Interval after incident (seconds) | 20 | +| Mean Duration (seconds) | 204 | +| Minimum Duration (seconds) | 4 | +| Mean Patience Time (seconds) | 50 | +| Mean On-Site Time (seconds) | 1200 | +| Type Ratio Law | 0.33 | +| Type Ratio EMS | 0.33 | +| Type Ratio Fire | 0.33 | +| Prototype 0 mu_r | 0.0005 | +| Prototype 0 sdev_r | 0.0001 | +| Prototype 0 mu_intensity | 500000 | +| Prototype 0 sdev_intensity | 50000 | +| Prototype 1 mu_r | 0.001 | +| Prototype 1 sdev_r | 0.0001 | +| Prototype 1 mu_intensity | 1000000 | +| Prototype 1 sdev_intensity | 60000 | +| Prototype 2 mu_r | 0.0015 | +| Prototype 2 sdev_r | 0.001 | +| Prototype 2 mu_intensity | 1100000 | +| Prototype 2 sdev_intensity | 70000 | +| Prototype 3 mu_r | 0.003 | +| Prototype 3 sdev_r | 0.001 | +| Prototype 3 mu_intensity | 1500000 | +| Prototype 3 sdev_intensity | 60000 |