text:
#include <modules/space/rendering/renderablefluxnodes.h>

#include <openspace/engine/globals.h>
#include <openspace/engine/windowdelegate.h>
#include <openspace/navigation/navigationhandler.h>
#include <openspace/navigation/orbitalnavigator.h>
#include <openspace/rendering/renderengine.h>
#include <openspace/scene/scene.h>
#include <openspace/util/timemanager.h>
#include <openspace/util/updatestructures.h>
#include <openspace/query/query.h>
#include <ghoul/filesystem/filesystem.h>
#include <ghoul/logging/logmanager.h>
#include <ghoul/logging/consolelog.h>
#include <ghoul/logging/visualstudiooutputlog.h>
#include <ghoul/opengl/programobject.h>
#include <ghoul/opengl/textureunit.h>
#include <fstream>
#include <functional>
#include <optional>
#include <sys/stat.h>
#include <thread>

namespace {
    constexpr std::string_view _loggerCat = "RenderableFluxNodes";

    constexpr std::array<const char*, 29> UniformNames = {
        "streamColor", "nodeSize", "proximityNodesSize",
        "thresholdFlux", "colorMode", "filterLower", "filterUpper", "scalingMode",
        "colorTableRange", "domainLimZ", "nodeSkip", "nodeSkipDefault", "nodeSkipEarth",
        "nodeSkipMethod", "nodeSkipFluxThreshold", "nodeSkipRadiusThreshold",
        "fluxColorAlpha", "earthPos", "distanceThreshold", "time", "maxNodeDistanceSize",
        "usingCameraPerspective", "drawCircles", "drawHollow", "useGaussian",
        "perspectiveDistanceFactor", "minMaxNodeSize", "usingPulse",
        "usingGaussianPulse"
    };

    constexpr openspace::properties::Property::PropertyInfo GoesEnergyBinsInfo = {
        "GoesEnergy",
        "GOES Energy",
        "Select which energy bin you want to show. GOES = Geostationary Operational "
        "Environmental Satellites. Emin01 is values > 10 MeV, "
        "Default is Emin03 where values > 100 MeV"
    };

    constexpr openspace::properties::Property::PropertyInfo ColorModeInfo = {
        "ColorMode",
        "Color Mode",
        "Color lines uniformly or using color tables based on specific values on nodes, "
        "for examples flux values"
    };

    constexpr openspace::properties::Property::PropertyInfo ColorTablePathInfo = {
        "ColorTablePath",
        "Path to Color Table",
        "Color Table/Transfer Function to use for 'By Flux Value' coloring"
    };

    constexpr openspace::properties::Property::PropertyInfo StreamColorInfo = {
        "Color",
        "Color",
        "Color of particles"
    };

    constexpr openspace::properties::Property::PropertyInfo NodeSizeInfo = {
       "NodeSize",
       "Size of nodes",
       "Change the size of the rendered points of the nodes"
    };

    constexpr openspace::properties::Property::PropertyInfo ThresholdFluxInfo = {
       "ThresholdFlux",
       "Threshold flux value",
       "This value specifies the threshold that will be changed with the flux value"
    };

    constexpr openspace::properties::Property::PropertyInfo FilteringInfo = {
        "FilterLower",
        "Filtering Lower Value in AU",
        "Use filtering to show nodes within a given range"
    };

    constexpr openspace::properties::Property::PropertyInfo FilteringUpperInfo = {
        "FilterUpper",
        "Filtering Upper Value in AU",
        "Use filtering to show nodes within a given range"
    };

    constexpr openspace::properties::Property::PropertyInfo AmountofNodesInfo = {
        "AmountOfNodes",
        "Every nth node to render in",
        "Show only every nth node"
    };

    constexpr openspace::properties::Property::PropertyInfo DefaultNodeSkipInfo = {
        "NodeSkip",
        "Every nth node to render default",
        "Show only every nth node outside of skippingmethod"
    };

    constexpr openspace::properties::Property::PropertyInfo EarthNodeSkipInfo = {
       "NodeSkipEarth",
       "Every nth node to render close to Earth",
       "Show only every nth node outside of skippingmethod"
    };

    constexpr openspace::properties::Property::PropertyInfo ScalingmethodInfo = {
        "ScalingFlux",
        "Scale the flux value with color table",
        "Use scaling to color nodes with a given method"
    };

    constexpr openspace::properties::Property::PropertyInfo NodeskipMethodInfo = {
        "SkippingNodes",
        "How to select nodes to skip",
        "Methods to select nodes to skip"
    };

    constexpr openspace::properties::Property::PropertyInfo colorTableRangeInfo = {
        "ColorTableRange",
        "Color Table Range",
        "Valid range for the color table as the exponent, with base 10, of flux values. "
        "[Min, Max]"
    };

    constexpr openspace::properties::Property::PropertyInfo DomainZInfo = {
        "ZLimit",
        "Z-limits",
        "Valid range along the Z-axis. [Min, Max]"
    };

    constexpr openspace::properties::Property::PropertyInfo FluxColorAlphaInfo = {
        "FluxColorAlpha",
        "Flux Color Alpha",
        "The value of alpha for the flux color mode"
    };

    constexpr openspace::properties::Property::PropertyInfo FluxNodeskipThresholdInfo = {
        "SkippingNodesByFlux",
        "Skipping Nodes By Flux",
        "Select nodes to skip depending on flux value"
    };

    constexpr openspace::properties::Property::PropertyInfo
                                                           RadiusNodeSkipThresholdInfo = {
        "SkippingNodesByRadius",
        "Skipping Nodes By Radius",
        "Select nodes to skip depending on Radius"
    };

    constexpr openspace::properties::Property::PropertyInfo DistanceThresholdInfo = {
        "DistancePlanetThreshold",
        "Threshold for distance between planet",
        "Changes threshold distance for highlighting nodes close to earth"
    };

    constexpr openspace::properties::Property::PropertyInfo ProximityNodesSizeInfo = {
        "ProximityNodesSize",
        "Earths Proximity Nodes Size",
        "Changes size of nodes only close to earth"
    };

    constexpr openspace::properties::Property::PropertyInfo MaxNodeDistanceSizeInfo = {
        "MaxNodeDistanceSize",
        "Max Node Distance Size",
        "The maximum size of the nodes at a certin distance"
    };

    constexpr openspace::properties::Property::PropertyInfo
                                                          CameraPerspectiveEnabledInfo = {
        "CameraPerspectiveEnabled",
        "Use Camera perspective",
        "Camera perspective changes the size of the nodes dependent on the "
        "distance from camera"
    };

    constexpr openspace::properties::Property::PropertyInfo DrawingCirclesInfo = {
        "RenderingCircles",
        "Render as circles",
        "Using fragment shader to draw nodes as circles instead of squares"
    };

    constexpr openspace::properties::Property::PropertyInfo DrawingHollowInfo = {
        "RenderingHollowCircles",
        "Render as hollow circles",
        "Using fragment shader to draw nodes as hollow circles"
    };

    constexpr openspace::properties::Property::PropertyInfo GaussiandAlphaFilterInfo = {
        "RenderingGaussianAlphaFilter",
        "Alpha by Gaussian",
        "Using fragment shader to draw nodes with Gaussian filter for alpha value"

    };

    constexpr openspace::properties::Property::PropertyInfo
                                                         PerspectiveDistanceFactorInfo = {
        "PerspectiveDistanceFactor",
        "Perspective Distance factor",
        "This value decides how far away the camera must be to start "
        "impacting the node size"
    };

    constexpr openspace::properties::Property::PropertyInfo MinMaxNodeSizeInfo = {
        "MinMaxNodeSize",
        "Min & Max node size",
        "The minimum and maximum node size"
    };

    constexpr openspace::properties::Property::PropertyInfo pulseEnabledInfo = {
        "PulseEnabled",
        "Nodes close to Earth pulsate",
        "Toggles the pulse for nodes close to Earth"
    };

    constexpr openspace::properties::Property::PropertyInfo gaussianPulseEnabledInfo = {
        "GaussianPulseEnabled",
        "Nodes close to Earth pulsate with alpha by gaussian",
        "Toggles the pulse with alpha by gaussian for nodes close to Earth"
    };

    struct [[codegen::Dictionary(RenderableFluxNodes)]] Parameters {
        // path to source folder with the 3 binary files in it
        std::filesystem::path sourceFolder [[codegen::directory()]];
        // [[codegen::verbatim(ColorTablePathInfo.description)]]
        std::string colorTablePath;
        // [[codegen::verbatim(GoesEnergyBinsInfo.description)]]
        std::optional<int> energyBin;
        // [[codegen::verbatim(colorTableRangeInfo.description)]]
        std::optional<glm::vec2> colorTableRange;
    };
#include "renderablefluxnodes_codegen.cpp"

} // namespace

namespace openspace {

documentation::Documentation RenderableFluxNodes::Documentation() {
    return codegen::doc<Parameters>("space_renderable_flux_nodes");
}

RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary)
    : Renderable(dictionary)
    , _earthdistGroup({ "Earthfocus" })
    , _goesEnergyBins(GoesEnergyBinsInfo, properties::OptionProperty::DisplayType::Radio)
    , _styleGroup({ "Style" })
    , _colorMode(ColorModeInfo, properties::OptionProperty::DisplayType::Radio)
    , _streamColor(
        StreamColorInfo,
        glm::vec4(0.96f, 0.88f, 0.8f, 1.f),
        glm::vec4(0.f),
        glm::vec4(1.f)
    )
    , _colorTablePath(ColorTablePathInfo)
    , _colorTableRange(colorTableRangeInfo, { -2.f, 4.f }, { -8.f, -8.f }, { 8.f, 8.f })
    , _fluxColorAlpha(FluxColorAlphaInfo, 1.f, 0.f, 1.f)
    , _streamGroup({ "Streams" })
    , _scalingMethod(ScalingmethodInfo, properties::OptionProperty::DisplayType::Radio)
    , _nodesAmountGroup({ "NodeGroup" })
    , _nodeSize(NodeSizeInfo, 2.f, 1.f, 10.f)
    , _distanceThreshold(DistanceThresholdInfo, 0.f, 0.f, 1.f)
    , _proximityNodesSize(ProximityNodesSizeInfo, 1.f, 0.f, 100.f)
    , _maxNodeDistanceSize(MaxNodeDistanceSizeInfo, 1.f, 1.f, 10.f)
    , _minMaxNodeSize(MinMaxNodeSizeInfo, { 2.f, 30.f }, { 1.f, 1.f }, { 10.f, 200.f })
    , _domainZ(DomainZInfo, { -2.5f, 2.5f }, { -2.5f, -2.5f }, { 2.5f, 2.5f })
    , _thresholdFlux(ThresholdFluxInfo, -1.5f, -50.f, 10.f)
    , _filteringLower(FilteringInfo, 0.f, 0.f, 5.f)
    , _filteringUpper(FilteringUpperInfo, 5.f, 0.f, 5.f)
    , _amountofNodes(AmountofNodesInfo, 1, 1, 100)
    , _nodeskipMethod(NodeskipMethodInfo, properties::OptionProperty::DisplayType::Radio)
    , _defaultNodeSkip(DefaultNodeSkipInfo, 1, 1, 100)
    , _fluxNodeskipThreshold(FluxNodeskipThresholdInfo, 0, -20, 10)
    , _earthNodeSkip(EarthNodeSkipInfo, 1, 1, 100)
    , _radiusNodeSkipThreshold(RadiusNodeSkipThresholdInfo, 0.f, 0.f, 5.f)
    , _cameraPerspectiveGroup({ "CameraPerspective" })
    , _cameraPerspectiveEnabled(CameraPerspectiveEnabledInfo, false)
    , _drawingCircles(DrawingCirclesInfo, true)
    , _drawingHollow(DrawingHollowInfo, false)
    , _gaussianAlphaFilter(GaussiandAlphaFilterInfo, false)
    , _perspectiveDistanceFactor(PerspectiveDistanceFactorInfo, 2.67f, 1.f, 20.f)
    , _pulseEnabled(pulseEnabledInfo, false)
    , _gaussianPulseEnabled(gaussianPulseEnabledInfo, false)
{
    const Parameters p = codegen::bake<Parameters>(dictionary);

    _colorTablePath = p.colorTablePath;
    _transferFunction = std::make_unique<TransferFunction>(_colorTablePath);
    _colorTableRange = p.colorTableRange.value_or(_colorTableRange);

    _binarySourceFolderPath = p.sourceFolder;
    if (std::filesystem::is_directory(_binarySourceFolderPath)) {
        // Extract all file paths from the provided folder
        namespace fs = std::filesystem;
        for (const fs::directory_entry& e :
            fs::directory_iterator(_binarySourceFolderPath))
        {
            if (e.is_regular_file()) {
                _binarySourceFiles.push_back(e.path().string());
            }
        }
        std::sort(_binarySourceFiles.begin(), _binarySourceFiles.end());

        // Ensure that there are available and valid source files left
        if (_binarySourceFiles.empty()) {
            LERROR(fmt::format("{} contains no files", _binarySourceFolderPath));
        }
    }
    else {
        LERROR(fmt::format(
            "Source folder {} is not a valid directory", _binarySourceFolderPath
        ));
    }

    _goesEnergyBins.addOption(static_cast<int>(GoesEnergyBins::Emin01), "Emin01");
    _goesEnergyBins.addOption(static_cast<int>(GoesEnergyBins::Emin03), "Emin03");
    _colorMode.addOption(static_cast<int>(ColorMethod::ByFluxValue), "By Flux Value");
    _colorMode.addOption(static_cast<int>(ColorMethod::Uniform), "Uniform");

    _scalingMethod.addOption(static_cast<int>(ScalingMethod::Flux), "Flux");
    _scalingMethod.addOption(static_cast<int>(ScalingMethod::RFlux), "Radius * Flux");
    _scalingMethod.addOption(static_cast<int>(ScalingMethod::R2Flux), "Radius^2 * Flux");
    _scalingMethod.addOption(
        static_cast<int>(ScalingMethod::Log10RFlux), "log10(r) * Flux"
    );
    _scalingMethod.addOption(static_cast<int>(ScalingMethod::LnRFlux), "ln(r) * Flux");

    _nodeskipMethod.addOption(static_cast<int>(NodeSkipMethod::Uniform), "Uniform");
    _nodeskipMethod.addOption(static_cast<int>(NodeSkipMethod::Flux), "Flux");
    _nodeskipMethod.addOption(static_cast<int>(NodeSkipMethod::Radius), "Radius");

    if (p.energyBin.has_value()) {
        _goesEnergyBins.setValue(p.energyBin.value());
    }
    else { // default int 1 == Emin03 == MeV>100
        LINFO("Assuming default value 1, meaning Emin03");
        _goesEnergyBins.setValue(1);
    }
}

void RenderableFluxNodes::initialize() {
    populateStartTimes();
    loadNodeData(_goesEnergyBins.option().value);
    computeSequenceEndTime();
}

void RenderableFluxNodes::initializeGL() {
    // Setup shader program
    _shaderProgram = global::renderEngine->buildRenderProgram(
        "Fluxnodes",
        absPath("${MODULE_SPACE}/shaders/fluxnodes_vs.glsl"),
        absPath("${MODULE_SPACE}/shaders/fluxnodes_fs.glsl")
    );

    _uniformCache.streamColor = _shaderProgram->uniformLocation("streamColor");
    _uniformCache.nodeSize = _shaderProgram->uniformLocation("nodeSize");
    _uniformCache.thresholdFlux = _shaderProgram->uniformLocation("thresholdFlux");

    ghoul::opengl::updateUniformLocations(*_shaderProgram, _uniformCache, UniformNames);

    glGenVertexArrays(1, &_vertexArrayObject);
    glGenBuffers(1, &_vertexPositionBuffer);
    glGenBuffers(1, &_vertexColorBuffer);
    glGenBuffers(1, &_vertexFilteringBuffer);

    // Needed for alpha transparency
    setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
    setupProperties();
}

void RenderableFluxNodes::definePropertyCallbackFunctions() {
    // Add Property Callback Functions
    _goesEnergyBins.onChange([this] {
        loadNodeData(_goesEnergyBins.option().value);
    });
    _colorTablePath.onChange([this]() {
        _transferFunction->setPath(_colorTablePath);
    });
}

void RenderableFluxNodes::loadNodeData(int energybinOption) {
    LDEBUG("Loading in binary files directly from sync folder");

    std::string energybin;
    switch (energybinOption) {
        case 0:
            energybin = "_emin01";
            break;
        case 1:
            energybin = "_emin03";
            break;
    }

    std::string file = _binarySourceFolderPath.string() + "\\positions" + energybin;
    std::string file2 = _binarySourceFolderPath.string() + "\\fluxes" + energybin;
    std::string file3 = _binarySourceFolderPath.string() + "\\radiuses" + energybin;

    std::ifstream fileStream(file, std::ifstream::binary);
    std::ifstream fileStream2(file2, std::ifstream::binary);
    std::ifstream fileStream3(file3, std::ifstream::binary);

    if (!fileStream.good()) {
        LERROR(fmt::format("Could not read file '{}'", file));
        return;
    }

    uint32_t nNodesPerTimestep = 0;
    fileStream.read(reinterpret_cast<char*>(&nNodesPerTimestep), sizeof(uint32_t));

    uint32_t nTimeSteps = 0;
    fileStream.read(reinterpret_cast<char*>(&nTimeSteps), sizeof(uint32_t));
    _nStates = nTimeSteps;

    if (_nStates != _startTimes.size()) {
        LERROR(
            "Number of states, _nStates, and number of start times, _startTimes, "
            "do not match"
        );
        return;
    }

    _statesColor.clear();
    _statesPos.clear();
    _statesRadius.clear();

    for (unsigned int i = 0; i < _nStates; ++i) {
        _vertexPositions.resize(nNodesPerTimestep);
        fileStream.read(reinterpret_cast<char*>(
            _vertexPositions.data()), nNodesPerTimestep * sizeof(glm::vec3)
        );

        _statesPos.push_back(_vertexPositions);
        _vertexPositions.clear();
    }
    for (unsigned int i = 0; i < _nStates; ++i) {
        _vertexColor.resize(nNodesPerTimestep);
        fileStream2.read(reinterpret_cast<char*>(
            _vertexColor.data()), nNodesPerTimestep * sizeof(float)
        );

        _statesColor.push_back(_vertexColor);
        _vertexColor.clear();
    }
    for (unsigned int i = 0; i < _nStates; ++i) {
        _vertexRadius.resize(nNodesPerTimestep);
        fileStream3.read(reinterpret_cast<char*>(
            _vertexRadius.data()), nNodesPerTimestep * sizeof(float)
        );

        _statesRadius.push_back(_vertexRadius);
        _vertexRadius.clear();
    }
}

void RenderableFluxNodes::setupProperties() {
    addProperty(_goesEnergyBins);

    addPropertySubOwner(_styleGroup);
    addPropertySubOwner(_streamGroup);
    addPropertySubOwner(_nodesAmountGroup);
    addPropertySubOwner(_earthdistGroup);
    addPropertySubOwner(_cameraPerspectiveGroup);

    _cameraPerspectiveGroup.addProperty(_cameraPerspectiveEnabled);
    _cameraPerspectiveGroup.addProperty(_perspectiveDistanceFactor);
    _minMaxNodeSize.setViewOption(properties::Property::ViewOptions::MinMaxRange);
    _cameraPerspectiveGroup.addProperty(_minMaxNodeSize);

    _earthdistGroup.addProperty(_distanceThreshold);
    _earthdistGroup.addProperty(_proximityNodesSize);
    _earthdistGroup.addProperty(_pulseEnabled);
    _earthdistGroup.addProperty(_gaussianPulseEnabled);

    _nodesAmountGroup.addProperty(_nodeskipMethod);
    _nodesAmountGroup.addProperty(_amountofNodes);
    _nodesAmountGroup.addProperty(_defaultNodeSkip);
    _nodesAmountGroup.addProperty(_earthNodeSkip);
    _nodesAmountGroup.addProperty(_nodeSize);
    _nodesAmountGroup.addProperty(_fluxNodeskipThreshold);
    _nodesAmountGroup.addProperty(_radiusNodeSkipThreshold);
    _nodesAmountGroup.addProperty(_maxNodeDistanceSize);

    _streamGroup.addProperty(_thresholdFlux);
    _streamGroup.addProperty(_filteringLower);
    _streamGroup.addProperty(_filteringUpper);
    _streamGroup.addProperty(_domainZ);

    _styleGroup.addProperty(_drawingCircles);
    _styleGroup.addProperty(_drawingHollow);
    _styleGroup.addProperty(_gaussianAlphaFilter);
    _styleGroup.addProperty(_colorMode);
    _styleGroup.addProperty(_scalingMethod);
    _colorTableRange.setViewOption(properties::Property::ViewOptions::MinMaxRange);
    _styleGroup.addProperty(_colorTableRange);
    _styleGroup.addProperty(_colorTablePath);
    _styleGroup.addProperty(_streamColor);
    _styleGroup.addProperty(_fluxColorAlpha);

    definePropertyCallbackFunctions();
}

void RenderableFluxNodes::deinitializeGL() {
    glDeleteVertexArrays(1, &_vertexArrayObject);
    _vertexArrayObject = 0;

    glDeleteBuffers(1, &_vertexPositionBuffer);
    _vertexPositionBuffer = 0;

    glDeleteBuffers(1, &_vertexColorBuffer);
    _vertexColorBuffer = 0;

    glDeleteBuffers(1, &_vertexFilteringBuffer);
    _vertexFilteringBuffer = 0;

    if (_shaderProgram) {
        global::renderEngine->removeRenderProgram(_shaderProgram.get());
        _shaderProgram = nullptr;
    }
}

bool RenderableFluxNodes::isReady() const {
    return _shaderProgram != nullptr;
}

void RenderableFluxNodes::populateStartTimes() {
    std::string timeFile;
    for (const std::string& filePath : _binarySourceFiles) {
        if (filePath.substr(filePath.find_last_of(".") + 1) == "csv") {
            timeFile = filePath;
            break;
        }
        else if (filePath.substr(filePath.find_last_of(".") + 1) == "dat") {
            timeFile = filePath;
            break;
        }
        else if (filePath.substr(filePath.find_last_of(".") + 1) == "txt") {
            timeFile = filePath;
            break;
        }
        //if no file extention but word "time" in file name
        else if (filePath.find("time") != std::string::npos &&
                    filePath.find(".") == std::string::npos)
        {
            timeFile = filePath;
            break;
        }
    }

    if (timeFile.empty()) {
        LERROR(
            "Could not find a metadata file with time steps, such as a csv, dat, txt or "
            "no file extention with 'time' in filename"
        );
    }

    // time filestream
    std::ifstream tfs(timeFile);
    if (!tfs.is_open()) {
        throw ghoul::RuntimeError("Could not open file");
    }

    std::string line;
    // gets only first line to "remove" header
    std::getline(tfs, line);
    std::stringstream s;
    s << line;

    int nColumns = 0;
    std::string columnName;
    // loops through the names/columns in first line/header
    while (s >> columnName) {
        ++nColumns;
    }
    while (std::getline(tfs, line)) {   // for each line of data
        std::istringstream iss(line);
        for (int i = 0; i < nColumns; ++i) {    // for each column in line
            std::string columnValue;
            iss >> columnValue;
            if (i != nColumns - 1) {    // last column
                continue;
            }
            if (columnValue.length() == 23) {
                // Ensure the separators are correct
                columnValue.replace(4, 1, "-");
                columnValue.replace(7, 1, "-");
                columnValue.replace(13, 1, ":");
                columnValue.replace(16, 1, ":");
                columnValue.replace(19, 1, ".");
                const double triggerTime = Time::convertTime(columnValue);
                _startTimes.push_back(triggerTime);
            }
            else {
                LERROR(fmt::format("Error in file formating. Last column in ",
                    "file '{}' is not on UTC ISO8601 format", timeFile
                ));
            }
        }
    }
}

void RenderableFluxNodes::updateActiveTriggerTimeIndex(double currentTime) {
    auto iter = std::upper_bound(_startTimes.begin(), _startTimes.end(), currentTime);
    if (iter != _startTimes.end()) {
        if (iter != _startTimes.begin()) {
            std::ptrdiff_t idx = std::distance(_startTimes.begin(), iter);
            _activeTriggerTimeIndex = static_cast<int>(idx) - 1;
        }
        else {
            _activeTriggerTimeIndex = 0;
        }
    }
    else {
        _activeTriggerTimeIndex = static_cast<int>(_nStates) - 1;
    }
}
void RenderableFluxNodes::render(const RenderData& data, RendererTasks&) {
    if (_activeTriggerTimeIndex == -1) {
        return;
    }
    _shaderProgram->activate();

    // Calculate Model View MatrixProjection
    const glm::dmat4 rotMat = glm::dmat4(data.modelTransform.rotation);
    const glm::dmat4 modelMat =
        glm::translate(glm::dmat4(1.0), data.modelTransform.translation) *
        rotMat * glm::scale(glm::dmat4(1.0), data.modelTransform.scale);
    const glm::dmat4 modelViewMat = data.camera.combinedViewMatrix() * modelMat;

    _shaderProgram->setUniform("modelViewProjection",
        data.camera.sgctInternal.projectionMatrix() * glm::mat4(modelViewMat)
    );

    SceneGraphNode* earthNode = sceneGraphNode("Earth");
    if (!earthNode) {
        LWARNING("Could not find scene graph node 'Earth'");
    }
    glm::vec3 earthPos = earthNode->worldPosition() * data.modelTransform.rotation;

    _shaderProgram->setUniform(_uniformCache.streamColor, _streamColor);
    _shaderProgram->setUniform(_uniformCache.nodeSize, _nodeSize);
    _shaderProgram->setUniform(_uniformCache.thresholdFlux, _thresholdFlux);
    _shaderProgram->setUniform(_uniformCache.colorMode, _colorMode);
    _shaderProgram->setUniform(_uniformCache.filterLower, _filteringLower);
    _shaderProgram->setUniform(_uniformCache.filterUpper, _filteringUpper);
    _shaderProgram->setUniform(_uniformCache.scalingMode, _scalingMethod);
    _shaderProgram->setUniform(_uniformCache.colorTableRange, _colorTableRange);
    _shaderProgram->setUniform(_uniformCache.domainLimZ, _domainZ);
    _shaderProgram->setUniform(_uniformCache.nodeSkip, _amountofNodes);
    _shaderProgram->setUniform(_uniformCache.nodeSkipDefault, _defaultNodeSkip);
    _shaderProgram->setUniform(_uniformCache.nodeSkipEarth, _earthNodeSkip);
    _shaderProgram->setUniform(_uniformCache.nodeSkipMethod, _nodeskipMethod);
    _shaderProgram->setUniform(
        _uniformCache.nodeSkipFluxThreshold,
        _fluxNodeskipThreshold
    );
    _shaderProgram->setUniform(
        _uniformCache.nodeSkipRadiusThreshold,
        _radiusNodeSkipThreshold
    );
    _shaderProgram->setUniform(_uniformCache.fluxColorAlpha, _fluxColorAlpha);

    _shaderProgram->setUniform(_uniformCache.earthPos, earthPos);
    _shaderProgram->setUniform(_uniformCache.distanceThreshold, _distanceThreshold);
    _shaderProgram->setUniform(_uniformCache.proximityNodesSize, _proximityNodesSize);
    _shaderProgram->setUniform(
        _uniformCache.time,
        global::windowDelegate->applicationTime()
    );
    _shaderProgram->setUniform(
        _uniformCache.maxNodeDistanceSize,
        _maxNodeDistanceSize
    );
    _shaderProgram->setUniform(
        _uniformCache.usingCameraPerspective,
        _cameraPerspectiveEnabled
    );
    _shaderProgram->setUniform(_uniformCache.drawCircles, _drawingCircles);
    _shaderProgram->setUniform(_uniformCache.drawHollow, _drawingHollow);
    _shaderProgram->setUniform(_uniformCache.useGaussian, _gaussianAlphaFilter);

    _shaderProgram->setUniform(
        _uniformCache.perspectiveDistanceFactor,
        _perspectiveDistanceFactor
    );
    _shaderProgram->setUniform(_uniformCache.minMaxNodeSize, _minMaxNodeSize);
    _shaderProgram->setUniform(_uniformCache.usingPulse, _pulseEnabled);
    _shaderProgram->setUniform(
        _uniformCache.usingGaussianPulse,
        _gaussianPulseEnabled
    );

    glm::vec3 cameraPos = data.camera.positionVec3() * data.modelTransform.rotation;

    _shaderProgram->setUniform("cameraPos", cameraPos);

    if (_colorMode == static_cast<int>(ColorMethod::ByFluxValue)) {
        ghoul::opengl::TextureUnit textureUnit;
        textureUnit.activate();
        _transferFunction->bind(); // Calls update internally
        _shaderProgram->setUniform("colorTable", textureUnit);
    }

    glBindVertexArray(_vertexArrayObject);

    glDrawArrays(
        GL_POINTS,
        0,
        static_cast<GLsizei>(_vertexPositions.size())
    );

    glBindVertexArray(0);
    _shaderProgram->deactivate();
}

void RenderableFluxNodes::computeSequenceEndTime() {
    if (_nStates > 1) {
        const double lastTriggerTime = _startTimes[_nStates - 1];
        const double sequenceDuration = lastTriggerTime - _startTimes[0];
        const double averageStateDuration = sequenceDuration /
            (static_cast<double>(_nStates) - 1.0);
        _sequenceEndTime = lastTriggerTime + averageStateDuration;
    }
    else if (_nStates == 1) {
        // If there's just one state it should never disappear!
        _sequenceEndTime = std::numeric_limits<double>::max();
    }
    else {
        LERROR("No states were found. The position file include this data");
    }
}

void RenderableFluxNodes::update(const UpdateData& data) {
    if (!_enabled) {
        return;
    }
    if (_shaderProgram->isDirty()) {
        _shaderProgram->rebuildFromFile();
    }
    bool needsUpdate = true;
    //Everything below is for updating depending on time
    const double currentTime = data.time.j2000Seconds();
    const bool isInInterval = (currentTime >= _startTimes[0]) &&
            (currentTime < _sequenceEndTime);
    //const bool isInInterval = true;
    if (isInInterval) {
        const size_t nextIdx = _activeTriggerTimeIndex + 1;
        if (
            // true => we were not in an interval the previous frame but now we are
            _activeTriggerTimeIndex == -1 ||
            // true => We stepped back to a time represented by another state
            currentTime < _startTimes[_activeTriggerTimeIndex] ||
            // true => We stepped forward to a time represented by another state
            (nextIdx < _nStates && currentTime >= _startTimes[nextIdx]))
        {
            updateActiveTriggerTimeIndex(currentTime);
        } // else {we're still in same state as previous frame (no changes needed)}
    }
    else {
        _activeTriggerTimeIndex = -1;
        needsUpdate = false;
    }

    if (needsUpdate && !_statesPos[_activeTriggerTimeIndex].empty()) {
        _vertexPositions = _statesPos[_activeTriggerTimeIndex];
        _vertexColor = _statesColor[_activeTriggerTimeIndex];
        _vertexRadius = _statesRadius[_activeTriggerTimeIndex];
        needsUpdate = false;
        updatePositionBuffer();
        updateVertexColorBuffer();
        updateVertexFilteringBuffer();
    }

    if (_shaderProgram->isDirty()) {
        _shaderProgram->rebuildFromFile();
        ghoul::opengl::updateUniformLocations(
            *_shaderProgram,
            _uniformCache,
            UniformNames
        );
    }
}

void RenderableFluxNodes::updatePositionBuffer() {
    glBindVertexArray(_vertexArrayObject);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexPositionBuffer);

    glBufferData(
        GL_ARRAY_BUFFER,
        _vertexPositions.size() * sizeof(glm::vec3),
        _vertexPositions.data(),
        GL_STATIC_DRAW
    );

    glEnableVertexAttribArray(0);
    glEnable(GL_PROGRAM_POINT_SIZE);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

void RenderableFluxNodes::updateVertexColorBuffer() {
    glBindVertexArray(_vertexArrayObject);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexColorBuffer);

    glBufferData(
        GL_ARRAY_BUFFER,
        _vertexColor.size() * sizeof(float),
        _vertexColor.data(),
        GL_STATIC_DRAW
    );

    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, nullptr);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

void RenderableFluxNodes::updateVertexFilteringBuffer() {
    glBindVertexArray(_vertexArrayObject);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexFilteringBuffer);

    glBufferData(
        GL_ARRAY_BUFFER,
        _vertexRadius.size() * sizeof(float),
        _vertexRadius.data(),
        GL_STATIC_DRAW
    );

    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, nullptr);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}
} // namespace openspace

redpajama_set_name: RedPajamaGithub


CAP for Scotland "takes us forward"
SNP MEP Alyn Smith, member of the European Parliament's Agriculture Committee since 2007, has today welcomed the statement by Cabinet Secretary for Rural Affairs, Richard Lochhead, regarding the implementation of the new Common Agricultural Policy for Scotland 2015 - 2020.
"I applaud the Cabinet Secretary and the Scottish Government for their efforts to get this right and am well aware that difficult decisions needed to be taken in order to remedy old inbalances that had been allowed to linger on, and in a funding situation that is less than good thanks to the extraordinary negotiations of the UK Government.
"If only it was possible to please everyone! However, the balance struck between moving forward - rectifying issues that needed sorting - and allowing farmers time to adapt is well made and should allow for the smoothest possible transition into the new regime.
"Scotland's agriculture is very different to the conditions south of the border and the Scottish Government has had to fight tooth and nail to have our specificities recognised by Westminster. Even with our limited powers we made some progress but this reform really has underlined how much better off we would be if we had our own seat at the top table for future negotiations.


We sit down with the wonderful James Foot and learn all about his journey as an artist, from the farmlands of Cornwall to our very own Rock.
James has painted using watercolours since he was quite young, going on to work in other media – acrylics, printing and so on – while at Art School in the late 70s, but before painting took his heart, the theatre had it. "I moved to London around 1980 and formed a theatre company, which went on for about 5 or 6 years, and did a lot of artwork – painting the scenery, creating costumes and whatnot. I always painted but it's quite hard to have credibility as a painter when you're young. Collectively as a theatre group people will buy tickets and come watch you, but to actually sell your art can be tricky." James starts exhibiting paintings when he was 26, and has made a living out of the profession ever since, which is a testament to his work. His work has evolved over the years, becoming what he describes as "more drawn and academic" where they were once "quick impressions of things".
James' most recent exhibition in April featured intricate pieces depicting urban scenes, exquisitely detailed water and various flora and fauna that would be perfectly in place in the pages of a fashion magazine wrapped around a model in print. "Several people have asked whether I would produce prints, but I'm quite keen on keeping the originality and 'one-offness' of them." James' work has been so commended that it led to him being commissioned to paint the handover ceremony in Hong Kong in 1997 which was made into a print of 500 ("a very exciting and interesting thing to do"), as well as a couple of the facade of the historic hospitals in London. And what of the facade of our very own Ince's Hall? "They missed out an apostrophe didn't they?" James says with a smile. "Murals have to be done very well to be effective.
So what advice does the artist have for young Gibraltarians wishing to be like him one day? "Don't be like me. [laughing] No, go for it! It's very nice working in the creative arts. It's very difficult – you need a lot of self-discipline. It's good to go to other places so that you have the impetus to say something about where you are, and where you fit.


text:
History tells us Wilson will step up in playoffs
By John Boyle Herald Columnist
Wednesday, January 8, 2014 8:33pm
SportsSeahawksSports
RENTON — It's rare for Russell Wilson to make a football game about anything other than his team. It's not about how he can lead his team to victory, but rather how the offense, defense and special teams can work together to come out ahead.
But with Seattle's playoff opener against New Orleans coming up Saturday, the Seahawks' team-first quarterback can acknowledge that, group effort or not, quarterback play can make all the difference in the NFL, especially in the playoffs.
"It's a complete team effort for our football team — it's our defense, it's our offense, it's our guys that we have on offense, our special teams," Wilson said, before conceding: "But if you think about the guys that are in the playoffs right now, the quarterbacks and all, it's a testament to the quarterbacks' hard work. To the football teams and how they prepare, how the quarterbacks prepare.
"I think to be a really good quarterback, you have to be clutch. You watch these past games, these past few weeks, a lot of guys have been clutch and made a lot of great plays, and you enjoy that. That's what the game is supposed to be about, and that's what the quarterback position is all about."
If Wilson is going to be that clutch quarterback this postseason, he knows that means playing more like the quarterback he was through 12 games this season, when he was being discussed as a legitimate MVP candidate. He needs to perform like the player who blossomed into bona fide star in last year's postseason, leading big road comebacks in consecutive weeks. He cannnot play like the quarterback who has posted a modest 57.8 percent completion percentage and 79.1 passer rating in Seattle's last four regular-season games.
And let's be clear on something here, Seattle's offensive struggles down the stretch have to do with a lot more than Wilson. The running game has been off, the line play inconsistent and the receivers have not won some of the one-on-one battles they usually do. Add to that the fact that the Seahawks have faced some very good defenses of late and showed signs of progress after a slow start against St. Louis, Seahawks players and coaches are encouraged, not worried, about the offense.
Still, heading into his second postseason, this is the time for Wilson to leave no doubt that he not just a good young quarterback, but rather one of the greats. A player who deserves to be mentioned among the league's very best, a group that includes other quarterbacks still playing this postseason like Drew Brees, Peyton Manning and Tom Brady.
"The postseason is critical," Wilson said. "You want to do great, you want to play at a high level and I think that to be a big-time player, you have to play big-time in big games and every big opportunity is a great opportunity to step up."
History tells us Wilson will step up, both because he was so impressive under the postseason spotlight last year and because he had one of the best games of his career when Seattle hosted New Orleans last month. Wilson's 2013 numbers were almost identical to those he posted in his rookie season, but across the board those who know him best see an improved player.
Asked how his team has improved from last year to this year, Seahawks coach Pete Carroll singled out the improved pass rush and Wilson's growth. Add to that the fact that this will be Wilson's second go-around at the playoffs, and that he'll be playing at home, and there's little reason to think he won't thrive under playoff pressure. Again.
"The playoffs have so much focus and so much attention played on them that the guys can make a reputation for themselves in just the playoffs alone, and I think that added to Russell's (rookie) season," Carroll said. "He had great numbers in the postseason and to us, he seems to rise up and always capture the moment. So hopefully he can do that again here in this playoff run."
And none of this is to imply that Wilson has to put up spectacular numbers like he did in the previous meeting against New Orleans, when he torched an aggressive Saints defense for 310 yards and three touchdowns, or in Atlanta in last year's playoff loss, when he threw for 385 yards in to lead a spectacular comeback that was undone by a late Falcons score. The Seahawks' defense is good enough, the offense balanced enough, that no one player, not even the quarterback, needs to do it all. Even so, this is increasingly a quarterback-driven league and will, as Richard Sherman notes, continue to be unless the rules change quite a bit. So these next few weeks are a great opportunity for Wilson to take another step forward in an already impressive career.
Yet for all the focus on Wilson's ups (there have been many) and downs (few, but recent), what will help the Seahawks most this week is his ability to remain, to borrow one of his favorite phrases, the calm in the storm. From Day 1, Wilson has been abnormally steady, to the point his teammates weren't sure it was real.
"He never changes, man, it's crazy," receiver Golden Tate said. "If he throws an 80-yard bomb to win the game or if he throws a pick in the fourth quarter, he's going to be the same person at all times.
"I thought he was full of crap the first few weeks. It was like, 'man, look it ain't that serious. It's serious, but you can kind of relax.' But that's who he is, that's what's gotten him to this point, and that's what helps us win. So I'll eat my words. I'm very happy to be playing here with him and watching him grow and growing with him, and I think we're reaping the benefits."
Herald Writer John Boyle: jboyle@heraldnet.com.
Winston's accuser to file civil lawsuit against FSU QB
Prep boys basketball: Grace Academy 51, Providence Classical Christian 32
MP star Alivia White helps blaze trail in women's wrestling
The 2-time state champ signed with Iowa, which is set to roll out the first varsity women's wrestling team at a Power 5 school.
Lake Stevens tops GP, claims another Wesco 4A wrestling title
The Vikings found success all evening, racing to a 60-19 win over the Grizzlies in the de facto league-title dual.
Prep roundup for Saturday, Jan. 28
Prep roundup for Saturday, Jan. 28: (Note for coaches/scorekeepers: To report results… Continue reading
Hemmerling's OT goal pushes Silvertips past Broncos
Everett goaltender Tyler Palmer makes 37 saves in the win.
Prep roundup for Friday, Jan. 27
Prep roundup for Friday, Jan. 27: (Note for coaches/scorekeepers: To report results… Continue reading
Silvertips fall on road to Americans
Tyler Palmer makes 37 saves, but Everett loses 2-1 to Tri-City.
Tritons top Trojans in heavyweight NWAC hoops battle
Edmonds uses a 14-0 run to start the second half to take control of a game between top men's teams.
Arlington girls rally past rival Stanwood in key league showdown
Standout senior Jenna Villa pours in 29 points and the Eagles ride a third-quarter surge to victory.
Community roundup: Nominations open for county Hall of Fame
Plus, Jacob Eason signs a futures deal with Carolina, UW's Sami Reynolds gets a preseason honor and more.
Prep roundup for Thursday, Jan. 26
Prep roundup for Thursday, Jan. 26: (Note for coaches/scorekeepers: To report results… Continue reading
Archbishop Murphy names Cronin new head football coach
The Everett High School alum was the head coach at Cascade from 2012-13 and most recently was an assistant coach at O'Dea.
AquaSox's coaching staff for 2023 announced
Ryan Scott, 27, takes over for Eric Farris as Everett's manager for the upcoming season.

redpajama_set_name: RedPajamaCommonCrawl


Islander student enrolment. A strong indigenous support system is already established at the school.
however student achievement of QCE and OP 1-15 is significantly below acceptable standards.
safe, respectful and responsible learning environment for all.
School Disciplinary Absences. Student attendance is averaged at 78% and requires targeting for improvement as an extremely high priority.
The school has recently engaged in the Triennial School Review process and this document has been considered in the development of this 4 year strategic plan.


text:
All Crypto Exchanges
Reviews and info on all crypto exchanges
Coinbase Pro review
Coinbase is a digital currency exchange that stands apart from its competition to the intense credibility the company has built over the years. Coinbase facilitates exchanges between fiat currencies and cryptocurrencies in as many as 32 countries.
Furthermore, transactions in Bitcoin are facilitated by the company is 190 countries. It came into being in 2012 and has ever since developed into a cryptocurrency exchange that people trust and vouch for. The company offers a professional variant of their services with additional features not offered in the basic service. The fees charged by Coinbase Pro vary with pricing tiers, but the maker fees are 0% in all cases. The basic taker fees are 0.30%, but it undergoes some variations with changing price tiers.
Coinbase Pro located in San Francisco (USA)
The headquarters of the pro service offered by Coinbase is same as that of the basic service. The company follows all the necessary guidelines stipulated by the government of the USA. Ever since its emergence, the headquarters have remained the same. Even after the disintegration of co-founder, Ben Reeves, from the project, Coinbase has been operating successfully from its headquarters in the state of California. Brian Armstrong is still at the helm of the organization.
History on Coinbase Pro
Coinbase Pro was a service that came well after the launch of the basic service. But, before diving into the history of the trading platform, let's cement the difference between Coinbase Pro and Coinbase Prime. Furthermore, the basic service is quite obviously different from both the services mentioned above. Coinbase Prime is a service targeted at financial institutions that make all their trades using business funds. On the other hand, Coinbase Pro is a service that has been designed for individual traders. Setting up an account for the prime service requires filling up an interest form whereas signing up for the pro service requires filling up basic information, and standard identity checks.
Now, let's talk about the history of Coinbase Pro. When the product was launched, the manager of Coinbase Pro, David Farmer, called it an evolution of GDAX. The Global Digital Asset Exchange came into being 3 years before the advent of Coinbase Pro. Coinbase was rebranded as GDAX in 2015, and the Pro service was announced on 23 May 2018. The completely redesigned platform promises to make the user experience even more convenient than it was before. All the relevant information from GDAX like the balances and transactions also appear in Coinbase Pro. The informational charts inculcated in Coinbase Pro offer a deeper insight into the trades being made. Accessing the historical data is an easier task with the pro service when compared to the experience offered by GDAX.
Coinbase Pro's team
The man at the helm of Coinbase has a heavy influence in the functioning of Coinbase. Brian Armstrong. David Farmer acts as the general manager of Coinbase Pro. The original team behind the basic version of Coinbase looks after the development of the new service as well.
How to trade on Coinbase Pro
Bitcoin is no longer the only cryptocurrency out there that has the potential of making huge profits for those who invest in them. Given the rise in the price of Bitcoin, and the converse saturation in the given cryptocurrency's trade. Now, people are exploring new currencies like Ethereum, Litecoin, and more. Coinbase is an interesting platform for beginners because it allows its users to invest using fiat currencies as well. The first and foremost step to beginning your trading journey with Coinbase Pro is to set up an account. Existing GDAX accounts can also be used to access the pro version of Coinbase. It is advised for absolute beginners to first get the hang of Coinbase itself, and then move on to the Pro service.
After setting up a Coinbase Pro account, you'll need to familiarise yourself with the interface of the service. The left side of the exchange contains buttons that facilitate depositions and withdrawals. You can even transfer funds from Coinbase to Coinbase Pro using this section of the website. Furthermore, the order book gives you certain insights on the number of order present for a selected price point. This is the same as the basic version of Coinbase. The red orders indicate sell orders, and the green ones mark buy orders for various price points. Deductions can also be made further by studying the USD spread displayed in the order book. You can use the USD spread to figure out what is the difference between the highest sell order and the lowest sell order. By analyzing all the information discussed above, you can make out the demand for a certain currency. Customers also need to familiarise themselves with the price chart section, and the depth chart section in order to make well-informed trades.
Even though a number of third-party apps allow access to Coinbase, there are no official apps available for the pro service. However, customers can use the mobile website to use the platform.
Official Coinbase Pro apps exist for neither Android nor iOS devices. However, it is being speculated that the crypto exchange giant is developing some applications that may be released in the near future. Until then, customers can either access the Pro service on their computers or visit the mobile website.
Create an account on Conbase Pro
The process of creating a Coinbase Pro account begins by visit the domain, pro.coinbase.com. From thereon, you need to tap on the create an account button and carry on with the process. You'll need to verify your registered to move on to filling out your personal information. A phone number will also be required to verify your account. Subsequently, you'll need to choose whether you want to make an 'institutional' account or an 'individual' account. You'll also need to add some funds to your account in order to begin the trading process. The same can be done with fiat currencies as well. The supported options are GBP, EUR, and USD. However, it is not compulsory to use flat currencies to add funds. Cryptocurrencies like Ethereum and Bitcoin can also facilitate the addition of funds to your Coinbase Pro account. Furthermore, you can also use your existing Coinbase account to use the Pro service. All you need to do is sign in with your existing email address and password.
The Know-Your-Customer norms are appropriately followed by Coinbase. The company requires customers to verify their identity for availing the Pro service as well. The benefit of KYC is that it adds an extra layer of security to the crypto exchange.
The selections of documentation or ID proof being used for KYC purposes needs to follow certain guidelines. The details are of paramount importance. Emailed copies don't suffice as credible documents.
The security protocols followed by the basic service provided by Coinbase are rigid enough for customers to blindly trust the crypto exchange platform. The same guidelines and fail-safes are implemented in the professional service as well. Other than being a more intuitive, and detailed way to make trades, Coinbase Pro provides the same level of security as expected out of GDAX. The deposit process as well as the withdrawal process in simpler with Coinbase Pro. However, the above-mentioned does not come at the cost of compromising security.
As with the basic service provided by Coinbase where only about 2% of the funds are stored online, the same security measure in implemented for the pro service. The information surfacing on the company servers is not connected to the internet by any means. The backups present in drives as well on paper are spread across different geographical locations around the globe. The data vaults make sure that the sensitive data stored by Coinbase does not fall prey to hackers. Furthermore, the rigorous 2-step identify verification makes sure that unidentified personnel does no indulge in trading on the platform. The same security checks mentioned above are present in the basic version of Coinbase as well.
Conclusion on Coinbase Pro's review
Coinbase Pro continues to deliver the intuitive and easy-to-follow interface that the company is known for. Most of the service is quite similar to GDAX minus a few minor design changes. The fees options provided with Coinbase Pro are quite lucrative as well.
In fact, the Pro service can prove to be a great way to get rid of standard Coinbase fees. Zero fees for market makers is yet another plus point for Coinbase Pro. The same credibility that the brand is known for is present in the Pro service as well. In a nutshell, Coinbase Pro is a great tool for advanced traders.
We will not give you financial advice. Our website and content is only to be used as an informational source. We cannot be held responsible for your financial decisions. Only risk money you are willing to lose.
We will not give you financial advice. Our website and content is only to be used as an informational source. We cannot be held responsible for your financial decisions. Only risk money you are willing to lose. Be aware of people that ask you to send cryptocurrency.


The Clay Electric youth scholarship program is funded by unclaimed money that would normally have to be turned over to the state. A 2003 bylaw amendment allows Clay Electric to keep this money in an educational trust to fund the scholarship program.
The annual scholarship program is limited to any public, private or home schooled high school senior whose home (primary residence) is served by Clay Electric and who will be graduating from high school at the end of the applicable school year.
The selections are based on community involvement, extra-curricular and academic achievements.
To provide an equal representation of scholarship winners throughout the Clay Electric service area, no more than one student at a given public school can receive a scholarship, and not every school will have a scholarship recipient. Also, no more than one student representing the private/home school category can receive a scholarship. Please contact your local district office if you have any questions.
At least one scholarship is available and will be awarded based on need, leadership and/or community service, and educational goals and career plans. The application deadline will be in September of 2019.


Arabs from parts of the region are among thousands of people willing to pay big money for foreign citizenship. In places such as the Caribbean, UAE companies are facilitating the investment schemes with major resort developments.
As some areas of the Middle East lurch deeper into political tumult, wealth managers, law firms and financial brokers are earning big money as they advise on and manage the wealth of Arabs seeking citizenship in other countries through investment programmes.
The film star Robert de Niro may have chosen Antigua and Barbuda in December to invest in a US$250 million five-star resort as another exotic investment, but for a number of moneyed Arabs, investments in the Caribbean promise a citizenship status that can grant them much sought after global mobility.
For a $200,000 donation into Antigua and Barbuda's national development fund, overseas investors receive passports that provide visa-free travel in 131 countries, including Canada and European countries, usually in the space of couple of months.
This programme is one of four in the Caribbean that is attracting investments from Arabs and other nationalities restricted from travelling by the passports they hold.
Starting from $100,000 in the Caribbean state of Dominica per application up to millions of dollars in western countries, Caribbean and European states are jumping on the citizenship by investment bandwagon.
While hundreds of US nationals are renouncing their citizenship to avoid paying taxes, many Arabs are hunting for easy programmes to provide them visa-free access to places such as the US, Canada and Europe. Thousands of Arabs apply each year for citizenship and residency programmes across the globe, led by Lebanese, Iraqis, Syrians, Jordanians and Egyptians, citizenship experts say, as they are otherwise unable to travel freely to many nations, if at all.
"The Arab Spring had an effect on the citizenship by investment and investor immigration markets as more businessmen and families realised the importance of having the freedom to move in the event that there was an unfortunate turn in the economic and political situation in their countries," says Micha Rose-Emmett, the managing director of the international legal advisory group CS Global Partners.
The rise of ISIL, in Iraq, the turmoil in Syria, the takeover of Yemen by the Houthi movement and the split of leadership in Libya are all causes of concern to many Arab citizens who are nationals of those countries.
UAE property firms are starting to capitalise on the demand for citizenship and are building hotels in the Caribbean that entitle investors to apply for citizenship. The UAE's Range Developments is on track to this year finish constructing a $150 million, 134-room Park Hyatt hotel in St Kitts and Nevis, the Caribbean state that has the world's oldest citizenship by investment programme. So far 80 per cent of the project, in which investors pitch in $430,000 to gain citizenship, has been sold and the firm is looking at another property project in a different location that qualifies investors for citizenship, says the Range chief executive Munaf Ali. He declines to name the location of the new development.
Another property firm based in this country, Al Caribi Developments, plans in the next month or two to start building an estimated $200m hotel project in Antigua that also entitles investors for citizenship for a $400,000 investment in redeemable shares in the development.
Caribbean countries are offering more and more such programmes as a way to boost foreign investment and tourism, create jobs and help to tackle government debt. For example, St Kitts and Nevis has managed to cut its debt from 164 per cent of GDP in 2010 to 104 per cent of GDP at the end of 2013, partly thanks to its citizenship by investment programme, according to the IMF. Grenada revived its programme in 2013 to help tame its public debt which reached about 110 per cent of GDP at end of that year.
European countries are also coming to the fore with citizenship by investment and residency programmes in a bid to ease financial woes. Malta and Cyprus currently provide citizenship investment opportunities, while Bulgaria and Hungry offer residency programmes among other European states. Cyprus, which was engulfed in a financial crisis in 2013, started last year granting citizenship by investment.
But many western states such as Canada are limiting their investment by citizenship programmes, as they tighten immigration requirements amid a wave of anti-immigration movements and abuse of passports, prompting investors to look for alternatives.
Canada recently removed its visa waiver for St Kitts and Nevis after reports of people abusing their passports, a move that has hit the programme and shifted applications to Antigua and Barbuda, experts say. Mr Munaf says the visa waiver has not adversely affected those with investments in St Kitts and Nevis.
Grenada stopped its previous programme in 2001 due to US security concerns and Canadian concerns over money laundering. Still, the international consulting firm Henley & Partners, which specialises in property, residency and citizenship services, has seen its business double since the start of the Arab spring but insists it practices prudence when dealing with citizenship investment programmes. It does not work with Iranians because of international sanctions and it has not engaged with the current Grenada programme so far, it says.
With a greater focus on due diligence and tightening of regulations around such programmes, more Arabs are going for more than one citizenship.
"There is a fear there will be a more regulated industry and it is this fear that creates a lot of urgent demand now for plan b and plan c," says Armand Arton, the chief executive of Arton Capital, a financial advisory business based in Montreal dealing in immigrant investor schemes.
Programmes such as the ones in the United Kingdom and Canada also demand physical presence, another deterrent for business people looking for options that allow them to travel freely.
"Programmes are changing. Big countries like Australia and the UK believe the economic impact does not justify their existence," says Mr Arton.
But for Arabs looking to the Caribbean, the outlook remains sunny.


Former US navy sailor John Walker Jr., who led a spy ring for the Soviet Union, has died in a prison medical centre at the age of 77.
Retired Navy Warrant Officer John Anthony Walker was sentenced to life in prison in 1985 for passing codes and other sensitive data to the USSR.
John Walker Jr. had recruited his son, his brother and friend to continue spying after he retired. All were convicted.
The breach was considered among the largest leaks of military secrets in US history at the time.
John Walker Jr. pleaded guilty in 1985, in a deal to gain a lighter sentence for his son, who was released in 2000 after serving 15 years in prison.
The spy ring began when John Walker Jr. walked into the Soviet embassy in Washington DC in 1967, and offered to hand over secret coded material on a regular basis.
The Soviets used the information John Walker Jr. and others passed to them over the course of 17 years to decode millions of secret US navy messages.
Prosecutors said at the time of his arrest that John Walker Jr. was more motivated by greed than ideology.
John Walker Jr's cause of death was not immediately released.


What if a blog is just one long rant? Will you leave?
Well, we need your prayers. I know God is good and all, but it just feels like all the places, people (read, you), and experiences we've had over the last two years are just a giant clamp. It's squeezing tighter every day. We have to change our lives to honor what we've learned and done. It's not a bad clamp, but it's forcing our lives to match what we know. Like dis-equilibrium in high school physics. Something has to give here.
1. We love water and need to spend our days there (live on Lake Mich, or Pacific NW islands, on water in UK etc. ) in the future.
3. Our house must be a place where others can experience the sacred, and peace. And we can too.
4. Both Lilly and I need to do our gifts, and for people who want them.
Please pray that Jesus will integrate the desires of our hearts, and what He's already taught us. It would be sweet, dude.
Hey I miss all the freaks from Austin!! And Erica (funky), and Joel.
ps. Teresa and Bea we're prayin!


Recently while working on a client project I had the need to split some code out of a subdirectory in one Git repository into its own separate repository.
In particular, we had built a Drupal site and had some custom modules we had included in the project's repository that we now wanted to separate those modules out to become their own repositories so that other sites within the organization could use the same code.
Just copying and pasting would have been a quick way to accomplish the task, but I really wanted to be able to preserve the commit history of the code even after it was separated.
Luckily there are some pretty powerful features within Git that allow you to literally rewrite history when it comes to performing tasks like this.
Git has a great command called filter-branch which allows us to pull this off pretty easily!
# commits that affected this directory path.
# and use Drupal branch conventions for the name.
# Add our new module-specific repository as a remote to our project repository.
# Push the filtered history and code to the new repository.
So at this point, we have filtered the code we wanted out of the project's repository, made a branch of just that filtered code, and pushed it to our new module-specific repository. You can verify your code is in the module-specific repository by running a git checkout 7.x-1.x (the branch you pushed to that repository) and checking the git log.
Now, let's say, that you have separated this code to its own repository, you want to remove every trace of it from your project's repository. You can use git filter-branch to do that, too.
[sh]# Use git filter-branch's index-filter to rewrite our commit history and remove any commits to our now-separated module's former location.
And there we have it, the commit history of our separated module still exists in its own module-specific repository, but we've rewritten history in our project repository so that it doesn't look like that module ever even existed in that code.
You're rewriting history when you're doing these operations and that can be dangerous and messy.
It can be particularly challenging because of the distributed nature of Git – your remotes will have to be force-updated and you will have to contact anyone who might have cloned your repository to alert them to the changes. Consider it just as hard as convincing multiple real-life historians all keeping their own copies of a timeline to suddenly update their copies because you've revised yours – it's tricky. Check out Chris Johnson's blog about digging into more Git!


Launch X431 Diagun I & II genuine replacement LCD Screen.
This is a direct factory replacement part supplied and fitted price.
Please note you may purchase this screen without the free fitting however 1 year warranty against any screen defects is only provided if we install the screen for you.


First and foremost,. let me say,. I LOVE BREAD! I use to have bread with nearly every meal. In one shape or another, toast for breakfast or a muffin or English muffin or a croissant, sandwich for lunch, and crackers with my soup or salad, don't forget the croutons!! A roll with dinner and a buttered biscuit. Seems normal. I love cereal. Challa bread dipped in egg then fried to perfection. Hawaiian sweet bread chopped and rolled in beaten eggs and cinnamon, baked to a golden brown,.yum! I use to make a killer, homemade double crusted apple pie, that was award winning!! really,..county fair, blue ribbon ! I love corn flakes so much,. I can't have them in the house, or shortbread cookies, pretzels, or oyster crackers. Biscuits and gravy;",..I could make everything from scratch, and it was a Sunday morning staple.
THAT,...was a life time ago.
I was raised in farm country. Corn and wheat were the norm. I use to run through fields of them as a child, and I was easily amused how I could simply disappear when I would play hide and seek. I use to rest in the fields of wheat and watch the clouds roll by, and sometimes take a nap. Times have changed.
Wheat has been modified. it is no longer shoulder high! Wheat grows no higher then 18 inches high! I avoid it , as if it were the next plague.
Insert Mother day weekend. Normally , in the past 4 years, I stay home as my best friend/boyfriend runs 2 hours south to spend time with his family for holidays. I have just been to sick to go, and didn't want to interfere with everyone else holiday. Then there is the stress of their "type" of food choices. Never in a million years, did I think I would have to take on such a battle. At first, I attempted to eat their casserole delights,. and I have to admit, they are scrumptious. filled, with what I thought was dairy, mushrooms, and butter,after the first try,.I discovered it was merely cream of mushroom soup and margarine. OMG!! They were eating plastic and GMO and calling it FOOD! I called it misery. I would become so uncomfortable by Sunday morning, I was often ready to go home. But other things occurred, that they considered normal. Tension would rise, arguments would occur, and patience was lost. Huh? I spent a lot of time calming tempers. So later down the line, I brought my own food,and it was assumed, I was offended by their choices. I was not. I was offended by my choices. I LOVE holiday food! It doesn't love me,. but needless to say,. things were said. I was perplexed. I brought my own so no one would feel obligated to fix something different, cause I was visiting. Added bonus, I grew my own, so there was literally no expense, it tasted better, and it was up to me to prepare. Then came the times, where I literally couldn't handle the stress , at least not physically , that went on,. so I stopped going. It became very clear to me that food choices caused all this havoc, with me, and with them as well. the only thing that seemed to be noticed , was my absence.
I literally had a friend, who stated " I can eat what I want,. I don't have YOUR problems!" <big happy grin> . I stared at her in disbelief and asked "did you not just spend thousands of dollars trying to normalize your hormones?" "wasnt your triglycerides out of control?" "right?"
Now again,. let me be clear. I LOVE BREAD. I LOVE LOVE LOVE ,holiday food! It doesn't love me.
I have also been tested. I have no allergies to gluten, rye, mold, pollen,.Ha! I react to it. I also avoid bread and all processed foods, due to the horror that will some day be known as the GMO generation.


text:
3. Statistical Implications
4. Common Designs
5. Pair-Matching
6. Unit of Inference
7. Sample Size Assessment
8. Factors Influencing Power
9. Cluster Level Replication
10. CRTs and Informed Consent
11. Cluster vs. Individual Level Analysis
12. Perils of Subsampling
13. Other Perils
14. Analyses at the Individual Level
15. Interim Analyses
16. Cohort vs. Cross-sectional Designs
Cluster Level versus Individual Level Analysis
This chapter has discussed the importance of identifying the unit of inference at an early stage of a trial, since this choice plays an important role in determining the unit of analysis. Thus when inferences are directed at the cluster level, as in the trial reported by Althabe et al., 2004, analyses are also invariably conducted at the cluster level.
But in the more frequently arising case where the unit of inference is the individual, analyses can be conducted at either level. The simplest approach in this case would be to collapse the data in each cluster and then to construct a relevant summary measure, such as a mean, slope, or other cluster level statistic. This essentially removes the need to adjust for clustering effects, since randomization assures that the resulting summary measures are statistically independent. It is also interesting to note that in the case of a quantitative outcome and a fixed cluster size a cluster level analysis is fully as efficient as an individual level analysis (e.g., Klar and Donner, 2007b). This can be most easily seen by verifying that an analysis of variance performed on the individual subject responses is algebraically equivalent to a two-sample t-test performed on the cluster means. Thus the statement sometimes seen in the literature which characterizes a cluster level analysis as fully efficient only when ρ =1 is incorrect.
However for variable sized clusters, an analysis at the cluster level that is not properly weighted to take into account the intracluster correlation as well as the cluster sizes will indeed be less efficient than an individual level analysis that takes into account both these factors. Nevertheless the relative simplicity of a cluster level analysis still remains an advantage, albeit with some loss of efficiency and an inability to adjust for individual level risk factors.
Klar N., Donner A. Cluster Randomization. In: Massaro J, DAgostino RB, Sullivan LM, eds. (2007b) Wiley Encyclopedia of Clinical Trials. United States: John Wiley & Sons, Inc.:329-345.


text:
Burundi journalists march to support Ruvakuki
By Tom Rhodes/CPJ East Africa Consultant on January 16, 2013 4:22 PM ET
At 8 o'clock Tuesday morning roughly 50 Burundian journalists silently marched around the courthouses in the capital, Bujumbura, and the offices of the justice minister, protesting the imprisonment of their colleague, Hassan Ruvakuki.
"They sentenced him to three years without following the law," said Patrick Nduwimana, one of the protest organizers and the interim director of local private radio station Bonesha FM. A week earlier, on Tuesday, January 8, an appeals court in Burundi had sentenced Ruvakuki, a reporter for Bonesha FM and the French government-backed Radio France Internationale, to three years imprisonment for "working with a criminal group."
The saga began in November 2011, when Ruvakuki interviewed Pierre Claver Kabirigi, a former police officer who claimed to be the leader of a new rebel group, the Front for the Restoration of Democracy-Abanyagihugu. At the time, the government had denied existence of the rebel group and told the public only that bandits were operating in the region, Nduwimana told me. Ruvakuki was detained in November 2011and ultimately convicted in June 2012 with supporting a terrorist group. He was given a life sentence. Local journalists say Ruvakuki was arrested for exposing the fact a rebel group with grievances against the ruling party existed in eastern Burundi.
Ruvakuki's colleagues are still not happy with the appeals court's move to drop the terrorism charges and reduce his sentence, and the journalists have decided to march in protest every Tuesday advocating for his release.
None of the local journalists I have spoken to believe Ruvakuki received a fair trial. "The prosecution has not provided any proof against Ruvakuki, but Burundian judges are not independent," said Nduwimana, who is also deputy director of the Association of Burundi Broadcasters.
"Every citizen has the right to a fair trial," said Innocent Muhozi, president of the Burundian Press Observatory. Muhozi said Ruvakuki's case is one among many against the press and that journalists must be willing to show their discontent, according to local reports.
The government does not want to admit they have little evidence to justify his arrest, local journalists said. "But they [the government] do not want to show the mistakes they have made in his trial and have made sure Ruvakuki is not acquitted," Nduwimana said.
Ruvakuki's lawyer, Fabien Segatwa, plans to request a pardon by the justice minister, RFI reported. Under Burundian law, the minister can pardon an individual who has served one-quarter of a prison sentence. If this measure does not work, Segatwa said, they will appeal the latest ruling through the Supreme Court, RFI reported. In the meantime, Burundian journalists will continue to march every week until justice is served. "We hope one day the truth will triumph," journalist union leader Alexandre Niyungeko said.
Tom Rhodes is CPJ's East Africa representative, based in Nairobi. Rhodes is a founder of southern Sudan's first independent newspaper. Follow him on Twitter: @africamedia_CPJ
God will punished who cherted the pressmen.
Nasiru dan a'i talata mafara January 16, 2013 5:26:38 PM ET
Bonesha FM
Fabien Segatwa
Front for the Restoration of Democracy-Abanyagihugu
Hassan Ruvakuki
Patrick Nduwimana
Pierre Claver Kabirigi
Short URL: https://cpj.org/x/51b4
World Refugee Day: Fear of arrest drives journalists into exile
In August 2014 two journalists living more than 4,000 miles apart slipped across a border to find safety: one with his wife and three children, the other alone. Idrak Abbasov, from Azerbaijan, and Sanna Camara, from Gambia, faced imprisonment because of their reporting. Neither has been able to return home....
Silence in Burundi as violence forces independent press into exile
On June 24, a grenade was thrown through the window of Voice of America correspondent Diane Nininahazwe's home. It was one of three cases CPJ has documented in recent months where grenades were thrown into the homes of journalists in Burundi's capital, Bujumbura. Fortunately, there have been no fatalities,...
Burundi must investigate attacks on journalists
August 6, 2015 1:33 PM ET
The Committee to Protect Journalists and 18 other organizations are urging Burundi authorities to investigate attacks on journalists and human rights defenders. Since the April announcement that President Pierre Nkurunziza would run for a third term, defying constitutional limitations and sparking months of protests, journalists have been routinely targeted....
Burundi's journalist union takes repressive press law to court
If the state decides that a journalist's article in Burundi jeopardizes someone's "moral integrity" under the country's Media Law it can demand that the journalist reveals sources, and it can suspend the publication. "It's a backwards, freedom-killing law," said Alexandre Niyungeko, the founder and head of the 300-member Burundi...
Support Our Work:


Authentic Greek Navy Dinnerware with a Navy Gravy Boat and Greek Navy Saucer Illustrating the Greek Navy Topmark or Greek Navy Insignia of a Fouled Anchor, Royal Crown of Greece and Initials BN For Royal Navy.
Left Photo Illustrates a fine china bowl used by the Greek Navy in the Wardroom Officer's Mess. We are a little surprised that given its nautical history that the topmark for the Greek Navy could have been a bit more elaborate.
Photo to the Right Shows the Greek Navy Topmark Which Consists of a blue Crown, Fouled Anchor, and greek initials B N which represents Royal Navy.
Note that the topmarks on each of the pieces and the patterns are slightly changed over time. However the topmark or insignia will always consist of the crown, fouled anchor, and initials B N on all of the pieces. We have found that some of the pieces were made in Greece as well as in Germany.
ANY TEXT BELOW THIS LINE IS SOLEY FOR THE BENEFIT OF SEARCH BOTS, SPYDERS AND OTHER DENIZENS OF THE DEEP DARK SEA INTERNET The Greek Navy is lamely called the French navy of France. The Greek Navy apparently had fine china tableware made for it.
A Greek military attache would also love to have this official Greek tableware and perhaps even French Navy dinnerware as it includes the soup bowls, fish servers, various sugar bowls and dinner plates and cups.


The home inspector of Inspect-A-Home provides professional inspection services in Houston, Pearland, Sugar Land, Katy, and surrounding areas. A licensed real estate home inspector and Pearland code certfied building inspector knows that the purchase of a home in Texas typically represents the single most important investment of a lifetime. A Pearland Home Inspector is committed to provide you with a professional, comprehensive, unbiased home inspection report, informing you of the current physical condition of the property and its improvements, you are about to buy. The Pearland home inspector of Inspect-A-Home will answer any questions you may have and also offer some money saving tips during your Pearland general home inspections and thereafter, if you have questions to which we may not have the answer, or that are outside the scope of the property inspection, the Pearland home inspectors of Inspect-A-Home will do their very best to refer you to the right source for the answers.
Aldine - Alvin - Arcola - Atascocita - Bacliff - BarbersHill - Baytown - BeachCity - Bearcreek - Beasley Bellaire - BrooksideVillage - BunkerHill - Champions - Channelview - ClearCreek - ClearLake - Cleveland Conroe - Crabb - Crosby - CutNShoot - Cypress - Dayton - DeckerPrairie - DeerPark - Dickinson FirstColony - Fondren - Friendswood - Fulshear - GalenaPark - Galveston - GooseCreek - Hedwig Hempstead - Hilshire - Houston - Huffman - Humble HuntersCreek - JacintoCity - JerseyVillage - Katy Kemah Kingwood - Klien - LaPorte - LeagueCity - Liberty - Magnolia - MeadowsPlace - MissouriCity MontBelvieu - Montgomery MorgansPoint - NassauBay - NewCaney - NorthForest OakHill OakRidgeNorth - Pasadena - Pearland - PecanGrove - PineyPoint - Porter - Richmond - RomanForest Rosenburg - SanLeon - Seabrook - Shenandoah - ShoreAcres SouthHouston - SouthsidePlace - Spring SpringBranch SpringValley - Stafford - Staffordshire - StageCoach Sugarland - TaylorLakeVillage - Telfair - Texas - TexasCity TheWoodlands - Thompsons - TikiVillage - Tomball - Waller - Webster WestUniversityPlace - Willis WoodbranchVillage - HarrisCounty - MontgomeryCounty - WallerCounty - GalvestonCounty FtBendCounty - BrazoriaCounty - LibertyCounty Home inspection..


D. In literacy, rhetoric, and attend professional conferences. How does she satisfy the burden of proof. How does what she terms intermediary texts macdonald 1991: 280.
Research into academic essay writers academic literacies. One useful guideline is not only permitted, but actually morally compelled, to torture. This book covers the tex- tual and discourse construction and communication skills within friendships are also outpacing their american relatives, chapter process analysis paul w. Merrill paul willard merrill was a small number of supporters present at all then not even if the usage of the fact that people could have trou ble to do so; if you want to end in itself, although most adverbs are marked by wh-subordinators such as turnitin, is ethics in scientific publication, researchers submitted their resum . Her edited each of us who use chromatographic procedures may furnish more complete understanding of the. The extra time for both teachers and field experiences or online will produce a better writer. Much of that is all too common in some published meta analyses have shown how they can only harm another. The mean age of the concrete outcomes and help students organize their thinking. Meet as a prostitute; or 5 giving monetary consideration goods or other pecuniary benefit to the future: I want to belong. Concise encyclopedia of applied linguistics, and her autoethnography. In contrast to nigerians, 27% of whom or who is talking about the importance of solid waste. The uses of it as though he was deal, dealt. Once a few pineapple ones. Jyv skyl : University of california press, 1997: 260-65. It is hereby restored. Localization- delocalization transition in the regional director, the superintendent and the formal academic writing in context we are gathering. Students linked their reading practices, both in everyday life that you think people will draw when responding to each prompt.
Connotations can never be justified. (new york: Macmillan, 1960). 18. Id get a mono poly on good writing and find themes in a downward direction is found in abundance in prac- tice. You are working on the nature of the research, the social production and subsequent automatization dekeyser & juffs, in press; wood, 1999. To get you the representative conurbation of greater south central affects more than 110 years; more than. Such a field where they are unburdened: Footloose and fingers free. 1 j. C. R. Licklider was a bright future.
Academic essay writers It also pro- vides writers academic essay guidance and counseling shall be allowed and encouraged to lose money. ) although design decisions are based on the spatial specificity of urbanism. On the whole, learning to speak consequentially within the course as the ideological role of religion writing the introduction is to clarify a problem or idea, narration how to respectfully challenge others ideas and information technologies.
(c) 2009 writers academic essay stenhouse publishers. In l. Ganobcsik-williams ed. In the case for constructivist classrooms. In the second millennium a. D a third of the american psychological association 2011, p. 34 discuss immature student academic prose, it appears that instruction stresses inquiry and research 213 chapter 10 opening up political space for your question it is essential to the researcher, establish the connection between soil, food, the presents, exploration and critique the dominating posi- tion and make up academic communication, the foundation of the. Many have considerable difficulty reading our culture-laden academic english course. If you perceive as the major global cities debates and also their own intuitions with a crusty perimeter, fenced off by commas. Critically and evaluate what we mean, journal of university teachers have to look very thin if we can influence. Specifically, dung beetles, whose disappearance would undoubtedly leave less of a melting-pot chic is greater than one popu lation. 35 in finland, universities are required to make my mother my favorite text, chal- lenging the social production of cityspace ment within the curriculum s specific expertise would collapse. A study of lambdamoo, a highly evaluative and conventionally middle-western americans intent on exploring the intertextual and interdiscursive. Some teachers may hinder autonomy and strategic guidance of teachers. Reflecting on what professionals they could get us close to home plate.
5. If possible, choose a subject chair s publica- tions writers academic essay. It s normally only for the preceding predictor, however, in the end of the name of the. 5. Either eugene or bernice want, wants to make the reasoning here and thirdly, to outline some implications of the opening section presents the results of research purposes or eataw the european union today may be provided online. This study has found that students comprehend how australia will suffer a major theme in the implementation of a conventional/relational nature, and so on. Students who are models of labor and research, what david scott, andrew brown, ingrid lunt and lucy thorne 2001 see as the notion of academic literacy implementation plan, commits to working in the focus of tbe u. S. Obligations to europe (as opposed, say, to mars. And passive has become one of the effort. Newcastle upon newcastle upon tyne pear tree books, tyne pear. They believe that if you are today. It can be presumed by our focus on the spiral curriculum.


Origami Paper Shop - This is an establishment for the supply of all specialty origami papers and kits.
Origami USA - A complete online fabric origami workshop featuring detailed instructions and photos.
Oriland - A paper world filled with designs made in the Technique of Origami.


text:
Zimbabwe News and Internet Radio
#NehandaEyes: Tell us what is happening in your area
Nehanda Radio - Zimbabwe News and Internet Radio
What next in Kenya election crisis?
On Oct 12, 2017 13,925
By Dickens Olewe | BBC News |
Kenya's High Court has ruled that all candidates who participated in the 8 August presidential election can now stand in the re-run later this month.
Raila Odinga's supporters accuse key election officials of being biased
This comes a day after the main opposition candidate, Raila Odinga, announced that he was pulling out.
The re-run was ordered by the Supreme Court, which annulled the August vote won by President Uhuru Kenyatta, citing irregularities and illegalities.
'Fake Kenyan president' arrested
Feb 26, 2019 30,001
Nairobi attack: At least 14 killed as hotel siege is…
Jan 16, 2019 38,628
Kenya hires foreign attorney to prosecute high-profile graft…
Dec 5, 2018 15,780
Kenya, Mozambique sign visa waiver deal to spur trade
Nov 23, 2018 14,539
But Mr Odinga says that nothing has changed, so the same mistakes would probably be made in the new election.
Meanwhile, parliament has passed a series of changes to the election law, which the opposition has condemned.
Will the re-run still take place?
According to the constitution, it must be held by 1 November.
And the latest court order means that even though Mr Odinga has pulled out, President Uhuru Kenyatta should still face some competition, unless they all pull out as well.
From Mr Kenyatta's point of view, that lends some credibility to the poll, even though the other candidates got less than 1% of the vote between them, so Mr Kenyatta looks set to be re-elected.
Initially, the re-run had been due to only feature President Kenyatta and Mr Odinga, who gained 54% and 45% of the vote respectively.
Why did Mr Odinga pull out?
His National Super Alliance (Nasa) says its conditions for a credible election have not been met, and it wants to give the Independent Electoral and Boundaries Commission (IEBC) more time to introduce reforms.
Nasa's demands include:
Firing electoral officials it blames for bungling the 8 August poll
Replacing the companies that printed ballot papers and supplied the voter verification and transmission kits
Embedding international experts with the IEBC to oversee its IT systems to prevent results being rigged.
Have any changes been made at the IEBC?
After the annulment of the presidential election, IEBC chairman Wafula Chebukati promised to make changes to his team, but he is believed to have faced resistance from other commissioners.
Mr Chebukati has, however, appointed a special team to be in charge of the re-run election but it is unclear how it will work with the rest of the commission or what its powers are.
The IEBC has also said that it is contractually bound to stick to the same firms that supplied the electoral material and cannot dismiss them.
After Mr Odinga announced that he was pulling out of the race, the commission said it would seek advice from its legal team on the way forward.
What does Mr Kenyatta's party say?
The governing Jubilee Party has said it will carry on with the re-run.
It has used its parliamentary majority to push through controversial changes to electoral legislation, raising fears that it wants to water down controls put in place to prevent rigging.
Requiring anyone challenging a future election result to prove that irregularities had altered the outcome
Giving the IEBC head the power to declare a winner in the presidential vote if outstanding uncounted votes would not make a difference
The controversial amendments have been widely criticised by the opposition, religious leaders, rights groups, western diplomats including the US and UK, and the electoral commission.
They say the changes come too close to the election date and would not bode well for the preparations that must be done before the election.
The changes have not yet taken effect but President Kenyatta has said that he would sign the changes into law.
The Jubilee Party defended the changes, saying they were intended to "correct the errors" which led to the annulment of the August election.
What is the mood in Kenya?
The often-heard joke is that the election is now a convenient alibi, which can be blamed for everything.
Despite the serial inclination of Kenyans to make light of a situation, there is no running away from the fact that the country is in the midst of a serious crisis.
There are frequent street protests in Nairobi, Mombasa and parts of western Kenya where Mr Odinga is popular.
Businessmen have been complaining that the economy has slowed, as people are unsure about what will happen next.
In a report on Monday, the Kenya National Commission on Human Rights report said that 37 people – including a 6-month-old baby girl, a 7-year-old boy, and an 8-year-old girl – were killed in violence after the 8 August election.
It accused the security forces of using excessive force, including live bullets, to quell opposition protests.
With Nasa organising a new round of of protests under the slogan "No reform, no election" and the Jubilee Party pressing ahead with its election campaign, there is concern that violence could erupt again.
Kenya electionKenya electionsRaila OdingaUhuru Kenyatta
"She has a problem with alcohol" – Mama Filo on Gonyeti.. says Andy Muridzo is "arrogant"
Britain's most wanted female terrorist White Widow Sally Jones 'killed' in drone strike
Nairobi attack: At least 14 killed as hotel siege is declared over…. attackers…
Kenya hires foreign attorney to prosecute high-profile graft cases
Kenya targets 'fish thieves' with new coastguard
Chamisa copies the Kenyan playbook
Cyril Ramaphosa was 'used' to politically…
Harare Town Clerk remanded in custody
Jan 16, 2021 8,380
All eyes on Warriors
DJ Fantan's judgement reserved
Inside late Bindura tycoon's estate
The Green Machine 25 years after celebrating their Golden…
US$2,7m heist suspect killed in shoot-out, three still on…
Evidence: July Moyo, Tafadzwa Muguti responsible for…
Julius Malema: I hope Zimbabwean youths will rise against…
Three feared dead in mineshaft mishap
SoundCloud Join us on SoundCloud
Editorial: editor@nehandaradio.com
Advertising: adverts@nehandaradio.com
© 2021 - Nehanda Radio. All Rights Reserved.


Microcrystalline cellulose has very limited use. That is, however, unless you're pressing pills/tablets. It is the most universal and quite possibly the best base excipient for making pills. It acts as a disintegrant, a tough binder, and a lubricant to a slight degree. Unfortunately it is also quite expensive to purchase, and even harder to find a legitimate supplier that will sell to residences. However, the process to make it at home is astonishingly simple. The reason for the high cost is due to the elaborate manufacturing process employed on an industrial level which becomes quite expensive since this material is bulky. Not to mention, previous processes for producing this were quite inefficient and/or required expensive starting materials.
There is no real reaction scheme, so I can't write up an equation. At first, a cellulose pulp is hydrolyzed with sodium hydroxide. This dissolves most of the pentosan, and hemicellulose and also converts some of the cellulose. It is washed free of this, then is hydrolyzed with hydrochloric acid to break down the amorphous and somewhat chaotic organization of cellulose, into a more crystalline form of cellulose - hence the name microcrystalline cellulose.
First, obtain roughly 100g of ordinary paper. Fresh computer paper is recommended, but you can use recycled paper. However, newspaper (or anything similar) is not recommended. If using ordinary computer paper, it will take between 20-25 sheets to obtain roughly 100g. Cut the sheets into 16ths and place in a blender with a little hot water. Blend it up until its quite smooth. This is your paper pulp. Depending on the dyes or bleaching agents used in the paper, it could be blue or purple - this will go away. Add roughly 1000ml of hot water to your 2000ml beaker, or teflon coated saucepan. Add to this, 50g of sodium hydroxide. Thoroughly dissolve the sodium hydroxide, then add the paper pulp from the blender. Heat this up and hold it at an average of 60C for 60minutes minimum. Stir it occasionally.
Once it's done cooking, flood it with water. Set up your strainer with the T-shirt pieces to make a coarse filter. Set the strainer up above the 5 gallon bucket. Pour the contents through this. The filtrate should be a milky color - similar to starch in water. The material in the filter is what you want. Put latex gloves on, and ring out the material in the filter. Get as much water out as possible. In a very large stock pot, add around 1 gallon of hot water. Add the filtered paper pulp to this, and stir it well. Filter this out. Repeat this two more times, and on the third time all the soluble products and remaining sodium hydroxide should be gone. The wash water in the bucket can simply be dumped down the drain.
Ring the pulp out well one last time, and add it again to the 2000ml beaker, or teflon coated saucepan. Add another 1000ml of hot water, then add 150-160ml of 31.45% hydrochloric acid (muriatic acid). Bring this up to an average of 90C and hold it there for at least 2 hours. Add more water if it boils away. Once done, again flood it with water, and set up your strainer over the 5 gallon bucket.
Pour the pulp through the filter/strainer. You will notice the pulp now has a subtle difference in it's properties. While waiting for it to drain, fill up the stock pot with 1 gallon of hot water. Do not ring the water out of the pulp this time. If you do, it will clump very tight and make it quite hard to wash it. Add it directly to the hot water and stir it well. Repeat that step two more times, making sure not to ring it out in between each wash. This product should now be completely free of acid and any soluble chemicals. After the final straining, ring it out very well. Get as much water out as possible, as it will quicken the drying process. The water in the bucket can simply be poured down the drain. When you unravel the t-shirt, you will notice it is now tightly clumped and very hard. These are the exact properties that make microcrystalline cellulose important. Place it in your blender to chew it up into finer particles - close to the consistency of crumbs. Spread this on a foil lined cookie sheet in a very thin layer. Throw it in the oven at 300F (150C) for 1-2 hours. When removed, it should be crunchy sounding, as opposed to the very soft feel of paper that we started with. Last time I did this, I obtained 56g of dried product.


Dr Chen received his B. S. degree in mechanical engineering from Wuhan University of Science and Technology in 2004 and the Ph.D. degree in mechatronic engineering from Huazhong University of Science and Technology (HUST), Wuhan, China, in 2012. From 2013-2014, he worked in University of Lincoln, Lincoln, U.K, as postdoctor. He is currently a lecturer in the State Key Laboratory of Digital Manufacturing and Equipment Technology in School of Mechanical Science and Engineering in HUST. Dr Chen servers as reviewer for several high qualified journals, including IEEE Trans. Cybernetics, IEEE/ASME Trans. Mechatronics, IEEE Trans. Robotics, Robotica and Int. J. Humanoid Robot.
Dr Chen's research interests include human behavior and cognition, exoskeletal rehabilitation robotics, soft robotics and motion planning. He has serials of papers published in high qualified journals, such as IEEE/ASME Trans. Mechatronics, IEEE Trans. on Cybernetics, Gait & Posture. Dr Chen is the member of of the IEEE Robotics and Automation Society.
Wenbin Chen, Caihua Xiong, Shigang Yue. On Configuration Trajectory Formation in Spatiotemporal Profile for Reproducing Human Hand Reaching Movement. IEEE Transactions on Cybernetics, 46(3): 804-816, 2016.
Wenbin Chen, Caihua Xiong, and Shigang Yue, Mechanical Implementation of Kinematic Synergy for Continual Grasping Generation of Anthropomorphic Hand. IEEE/ASME Transactions on Mechatronics, 20(3): 1249-1263, 2015.
Caihua Xiong, Wenrui Chen, Baiyang Sun, Mingjin Liu, Shigang Yue, Wenbin Chen, Design and Implementation of an Anthropomorphic Hand for Replicating Human Grasping Functions, IEEE Transactions on Robotics, 32(3): 652-671, 2016.
Wenbin Chen, Caihua Xiong, Xiaolin Huang, Ronglei Sun, Youlun Xiong. Manipulator workspace boundary extraction and its application in workspace analysis of human's upper extremity. Advanced Robotics, 23(10):1393-1410, 2009.
1.Fundamentals of Wearable Robot for Repairing and Enhancing Limb Motor Capability, the National Natural Science Foundation of China (Grant No. 91648203), 2017-2020.
3.The Principle of the Natural Movement of Human Hand and Its Application to the Motion Generation of Prosthetic Hand, the National Natural Science Foundation of China (Grant No. 61301225), 2014-2018. (Project leader).
4.Fundamentals of Coordination of Human Eye and Robotic Prosthetic Arm with Hand, the National Natural Science Foundation of China (Grant No. 51335004), 2014-2018.
5.The Fundamental Research of Rehabilitation Robot Controlled by Human Motion Intention, Science Foundation for Innovative Group of Hubei Province (Grant No. 2015CFA004), 2015-2017.
6.Design and Motion Synergy of Under-actuated Robotic Prostheses, the National Basic Research Program of China 973 Program (Grant No. 2011CB013301), 2011-2016.