text:
#ifndef SASS_DEBUGGER_H
#define SASS_DEBUGGER_H

#include <string>
#include <sstream>
#include "node.hpp"
#include "ast_fwd_decl.hpp"

using namespace Sass;

inline void debug_ast(AST_Node* node, std::string ind = "", Env* env = 0);

inline void debug_sources_set(SourcesSet& set, std::string ind = "")
{
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
  for(auto const &pair : set) {
    debug_ast(pair, ind + "");
    // debug_ast(set[pair], ind + "first: ");
  }
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
}

inline std::string str_replace(std::string str, const std::string& oldStr, const std::string& newStr)
{
  size_t pos = 0;
  while((pos = str.find(oldStr, pos)) != std::string::npos)
  {
     str.replace(pos, oldStr.length(), newStr);
     pos += newStr.length();
  }
  return str;
}

inline std::string prettyprint(const std::string& str) {
  std::string clean = str_replace(str, "\n", "\\n");
  clean = str_replace(clean, "	", "\\t");
  clean = str_replace(clean, "\r", "\\r");
  return clean;
}

inline std::string longToHex(long long t) {
  std::stringstream is;
  is << std::hex << t;
  return is.str();
}

inline std::string pstate_source_position(AST_Node* node)
{
  std::stringstream str;
  Position start(node->pstate());
  Position end(start + node->pstate().offset);
  str << (start.file == std::string::npos ? -1 : start.file)
    << "@[" << start.line << ":" << start.column << "]"
    << "-[" << end.line << ":" << end.column << "]";
  return str.str();
}

inline void debug_ast(AST_Node* node, std::string ind, Env* env)
{
  if (node == 0) return;
  if (ind == "") std::cerr << "####################################################################\n";
  if (dynamic_cast<Bubble*>(node)) {
    Bubble* bubble = dynamic_cast<Bubble*>(node);
    std::cerr << ind << "Bubble " << bubble;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << bubble->tabs();
    std::cerr << std::endl;
  } else if (dynamic_cast<At_Root_Block*>(node)) {
    At_Root_Block* root_block = dynamic_cast<At_Root_Block*>(node);
    std::cerr << ind << "At_Root_Block " << root_block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << root_block->tabs();
    std::cerr << std::endl;
    debug_ast(root_block->expression(), ind + ":", env);
    debug_ast(root_block->block(), ind + " ", env);
  } else if (dynamic_cast<Selector_List*>(node)) {
    Selector_List* selector = dynamic_cast<Selector_List*>(node);
    std::cerr << ind << "Selector_List " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " [@media:" << selector->media_block() << "]";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << std::endl;

    for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }

//  } else if (dynamic_cast<Expression*>(node)) {
//    Expression* expression = dynamic_cast<Expression*>(node);
//    std::cerr << ind << "Expression " << expression << " " << expression->concrete_type() << std::endl;

  } else if (dynamic_cast<Parent_Selector*>(node)) {
    Parent_Selector* selector = dynamic_cast<Parent_Selector*>(node);
    std::cerr << ind << "Parent_Selector " << selector;
//    if (selector->not_selector()) cerr << " [in_declaration]";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
//    debug_ast(selector->selector(), ind + "->", env);

  } else if (dynamic_cast<Complex_Selector*>(node)) {
    Complex_Selector* selector = dynamic_cast<Complex_Selector*>(node);
    std::cerr << ind << "Complex_Selector " << selector
      << " (" << pstate_source_position(node) << ")"
      << " <" << selector->hash() << ">"
      << " [weight:" << longToHex(selector->specificity()) << "]"
      << " [@media:" << selector->media_block() << "]"
      << (selector->is_optional() ? " [is_optional]": " -")
      << (selector->has_parent_ref() ? " [has parent]": " -")
      << (selector->has_line_feed() ? " [line-feed]": " -")
      << (selector->has_line_break() ? " [line-break]": " -")
      << " -- ";
      std::string del;
      switch (selector->combinator()) {
        case Complex_Selector::PARENT_OF:   del = ">"; break;
        case Complex_Selector::PRECEDES:    del = "~"; break;
        case Complex_Selector::ADJACENT_TO: del = "+"; break;
        case Complex_Selector::ANCESTOR_OF: del = " "; break;
        case Complex_Selector::REFERENCE:   del = "//"; break;
      }
      // if (del = "/") del += selector->reference()->perform(&to_string) + "/";
    std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
    debug_ast(selector->head(), ind + " " /* + "[" + del + "]" */, env);
    if (selector->tail()) {
      debug_ast(selector->tail(), ind + "{" + del + "}", env);
    } else if(del != " ") {
      std::cerr << ind << " |" << del << "| {trailing op}" << std::endl;
    }
    SourcesSet set = selector->sources();
    // debug_sources_set(set, ind + "  @--> ");
  } else if (dynamic_cast<Compound_Selector*>(node)) {
    Compound_Selector* selector = dynamic_cast<Compound_Selector*>(node);
    std::cerr << ind << "Compound_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
    std::cerr << " [@media:" << selector->media_block() << "]";
    std::cerr << (selector->extended() ? " [extended]": " -");
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
    for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Propset*>(node)) {
    Propset* selector = dynamic_cast<Propset*>(node);
    std::cerr << ind << "Propset " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << selector->tabs() << std::endl;
    if (selector->block()) for(auto i : selector->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Wrapped_Selector*>(node)) {
    Wrapped_Selector* selector = dynamic_cast<Wrapped_Selector*>(node);
    std::cerr << ind << "Wrapped_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <<" << selector->ns_name() << ">>";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << std::endl;
    debug_ast(selector->selector(), ind + " () ", env);
  } else if (dynamic_cast<Pseudo_Selector*>(node)) {
    Pseudo_Selector* selector = dynamic_cast<Pseudo_Selector*>(node);
    std::cerr << ind << "Pseudo_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <<" << selector->ns_name() << ">>";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << std::endl;
    debug_ast(selector->expression(), ind + " <= ", env);
  } else if (dynamic_cast<Attribute_Selector*>(node)) {
    Attribute_Selector* selector = dynamic_cast<Attribute_Selector*>(node);
    std::cerr << ind << "Attribute_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <<" << selector->ns_name() << ">>";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << std::endl;
    debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
  } else if (dynamic_cast<Selector_Qualifier*>(node)) {
    Selector_Qualifier* selector = dynamic_cast<Selector_Qualifier*>(node);
    std::cerr << ind << "Selector_Qualifier " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <<" << selector->ns_name() << ">>";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << std::endl;
  } else if (dynamic_cast<Type_Selector*>(node)) {
    Type_Selector* selector = dynamic_cast<Type_Selector*>(node);
    std::cerr << ind << "Type_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <" << selector->hash() << ">";
    std::cerr << " <<" << selector->ns_name() << ">>";
    std::cerr << (selector->is_optional() ? " [is_optional]": " -");
    std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
    std::cerr << (selector->has_line_break() ? " [line-break]": " -");
    std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
    std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
    std::cerr << std::endl;
  } else if (dynamic_cast<Selector_Placeholder*>(node)) {

    Selector_Placeholder* selector = dynamic_cast<Selector_Placeholder*>(node);
    std::cerr << ind << "Selector_Placeholder [" << selector->ns_name() << "] " << selector
      << " <" << selector->hash() << ">"
      << " [@media:" << selector->media_block() << "]"
      << (selector->is_optional() ? " [is_optional]": " -")
      << (selector->has_line_break() ? " [line-break]": " -")
      << (selector->has_line_feed() ? " [line-feed]": " -")
    << std::endl;

  } else if (dynamic_cast<Simple_Selector*>(node)) {
    Simple_Selector* selector = dynamic_cast<Simple_Selector*>(node);
    std::cerr << ind << "Simple_Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << std::endl;

  } else if (dynamic_cast<Selector_Schema*>(node)) {
    Selector_Schema* selector = dynamic_cast<Selector_Schema*>(node);
    std::cerr << ind << "Selector_Schema " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")"
      << (selector->at_root() && selector->at_root() ? " [@ROOT]" : "")
      << " [@media:" << selector->media_block() << "]"
      << (selector->has_line_break() ? " [line-break]": " -")
      << (selector->has_line_feed() ? " [line-feed]": " -")
    << std::endl;

    debug_ast(selector->contents(), ind + " ");
    // for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }

  } else if (dynamic_cast<Selector*>(node)) {
    Selector* selector = dynamic_cast<Selector*>(node);
    std::cerr << ind << "Selector " << selector;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << (selector->has_line_break() ? " [line-break]": " -")
      << (selector->has_line_feed() ? " [line-feed]": " -")
    << std::endl;

  } else if (dynamic_cast<Media_Query_Expression*>(node)) {
    Media_Query_Expression* block = dynamic_cast<Media_Query_Expression*>(node);
    std::cerr << ind << "Media_Query_Expression " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << (block->is_interpolated() ? " [is_interpolated]": " -")
    << std::endl;
    debug_ast(block->feature(), ind + " feature) ");
    debug_ast(block->value(), ind + " value) ");

  } else if (dynamic_cast<Media_Query*>(node)) {
    Media_Query* block = dynamic_cast<Media_Query*>(node);
    std::cerr << ind << "Media_Query " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << (block->is_negated() ? " [is_negated]": " -")
      << (block->is_restricted() ? " [is_restricted]": " -")
    << std::endl;
    debug_ast(block->media_type(), ind + " ");
    for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }

  } else if (dynamic_cast<Media_Block*>(node)) {
    Media_Block* block = dynamic_cast<Media_Block*>(node);
    std::cerr << ind << "Media_Block " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->media_queries(), ind + " =@ ");
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Supports_Block*>(node)) {
    Supports_Block* block = dynamic_cast<Supports_Block*>(node);
    std::cerr << ind << "Supports_Block " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->condition(), ind + " =@ ");
  } else if (dynamic_cast<Supports_Operator*>(node)) {
    Supports_Operator* block = dynamic_cast<Supports_Operator*>(node);
    std::cerr << ind << "Supports_Operator " << block;
    std::cerr << " (" << pstate_source_position(node) << ")"
    << std::endl;
    debug_ast(block->left(), ind + " left) ");
    debug_ast(block->right(), ind + " right) ");
  } else if (dynamic_cast<Supports_Negation*>(node)) {
    Supports_Negation* block = dynamic_cast<Supports_Negation*>(node);
    std::cerr << ind << "Supports_Negation " << block;
    std::cerr << " (" << pstate_source_position(node) << ")"
    << std::endl;
    debug_ast(block->condition(), ind + " condition) ");
  } else if (dynamic_cast<Supports_Declaration*>(node)) {
    Supports_Declaration* block = dynamic_cast<Supports_Declaration*>(node);
    std::cerr << ind << "Supports_Declaration " << block;
    std::cerr << " (" << pstate_source_position(node) << ")"
    << std::endl;
    debug_ast(block->feature(), ind + " feature) ");
    debug_ast(block->value(), ind + " value) ");
  } else if (dynamic_cast<Block*>(node)) {
    Block* root_block = dynamic_cast<Block*>(node);
    std::cerr << ind << "Block " << root_block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    if (root_block->is_root()) std::cerr << " [root]";
    std::cerr << " " << root_block->tabs() << std::endl;
    if (root_block->block()) for(auto i : root_block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Warning*>(node)) {
    Warning* block = dynamic_cast<Warning*>(node);
    std::cerr << ind << "Warning " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
  } else if (dynamic_cast<Error*>(node)) {
    Error* block = dynamic_cast<Error*>(node);
    std::cerr << ind << "Error " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
  } else if (dynamic_cast<Debug*>(node)) {
    Debug* block = dynamic_cast<Debug*>(node);
    std::cerr << ind << "Debug " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->value(), ind + " ");
  } else if (dynamic_cast<Comment*>(node)) {
    Comment* block = dynamic_cast<Comment*>(node);
    std::cerr << ind << "Comment " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() <<
      " <" << prettyprint(block->pstate().token.ws_before()) << ">" << std::endl;
    debug_ast(block->text(), ind + "// ", env);
  } else if (dynamic_cast<If*>(node)) {
    If* block = dynamic_cast<If*>(node);
    std::cerr << ind << "If " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->predicate(), ind + " = ");
    debug_ast(block->block(), ind + " <>");
    debug_ast(block->alternative(), ind + " ><");
  } else if (dynamic_cast<Return*>(node)) {
    Return* block = dynamic_cast<Return*>(node);
    std::cerr << ind << "Return " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
  } else if (dynamic_cast<Extension*>(node)) {
    Extension* block = dynamic_cast<Extension*>(node);
    std::cerr << ind << "Extension " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->selector(), ind + "-> ", env);
  } else if (dynamic_cast<Content*>(node)) {
    Content* block = dynamic_cast<Content*>(node);
    std::cerr << ind << "Content " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [@media:" << block->media_block() << "]";
    std::cerr << " " << block->tabs() << std::endl;
  } else if (dynamic_cast<Import_Stub*>(node)) {
    Import_Stub* block = dynamic_cast<Import_Stub*>(node);
    std::cerr << ind << "Import_Stub " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << block->imp_path() << "] ";
    std::cerr << " " << block->tabs() << std::endl;
  } else if (dynamic_cast<Import*>(node)) {
    Import* block = dynamic_cast<Import*>(node);
    std::cerr << ind << "Import " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    // std::vector<std::string>         files_;
    for (auto imp : block->urls()) debug_ast(imp, ind + "@: ", env);
    debug_ast(block->media_queries(), ind + "@@ ");
  } else if (dynamic_cast<Assignment*>(node)) {
    Assignment* block = dynamic_cast<Assignment*>(node);
    std::cerr << ind << "Assignment " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " <<" << block->variable() << ">> " << block->tabs() << std::endl;
    debug_ast(block->value(), ind + "=", env);
  } else if (dynamic_cast<Declaration*>(node)) {
    Declaration* block = dynamic_cast<Declaration*>(node);
    std::cerr << ind << "Declaration " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->property(), ind + " prop: ", env);
    debug_ast(block->value(), ind + " value: ", env);
  } else if (dynamic_cast<Keyframe_Rule*>(node)) {
    Keyframe_Rule* has_block = dynamic_cast<Keyframe_Rule*>(node);
    std::cerr << ind << "Keyframe_Rule " << has_block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << has_block->tabs() << std::endl;
    if (has_block->selector()) debug_ast(has_block->selector(), ind + "@");
    if (has_block->block()) for(auto i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Directive*>(node)) {
    Directive* block = dynamic_cast<Directive*>(node);
    std::cerr << ind << "Directive " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << block->keyword() << "] " << block->tabs() << std::endl;
    debug_ast(block->selector(), ind + "~", env);
    debug_ast(block->value(), ind + "+", env);
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Each*>(node)) {
    Each* block = dynamic_cast<Each*>(node);
    std::cerr << ind << "Each " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<For*>(node)) {
    For* block = dynamic_cast<For*>(node);
    std::cerr << ind << "For " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<While*>(node)) {
    While* block = dynamic_cast<While*>(node);
    std::cerr << ind << "While " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << block->tabs() << std::endl;
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Definition*>(node)) {
    Definition* block = dynamic_cast<Definition*>(node);
    std::cerr << ind << "Definition " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [name: " << block->name() << "] ";
    std::cerr << " [type: " << (block->type() == Sass::Definition::Type::MIXIN ? "Mixin " : "Function ") << "] ";
    // this seems to lead to segfaults some times?
    // std::cerr << " [signature: " << block->signature() << "] ";
    std::cerr << " [native: " << block->native_function() << "] ";
    std::cerr << " " << block->tabs() << std::endl;
    debug_ast(block->parameters(), ind + " params: ", env);
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Mixin_Call*>(node)) {
    Mixin_Call* block = dynamic_cast<Mixin_Call*>(node);
    std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
    std::cerr << " [" <<  block->name() << "]";
    std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
    debug_ast(block->arguments(), ind + " args: ");
    if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (Ruleset* ruleset = dynamic_cast<Ruleset*>(node)) {
    std::cerr << ind << "Ruleset " << ruleset;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [indent: " << ruleset->tabs() << "]";
    std::cerr << (ruleset->at_root() ? " [@ROOT]" : "");
    std::cerr << (ruleset->is_root() ? " [root]" : "");
    std::cerr << std::endl;
    debug_ast(ruleset->selector(), ind + ">");
    debug_ast(ruleset->block(), ind + " ");
  } else if (dynamic_cast<Block*>(node)) {
    Block* block = dynamic_cast<Block*>(node);
    std::cerr << ind << "Block " << block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
    for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Textual*>(node)) {
    Textual* expression = dynamic_cast<Textual*>(node);
    std::cerr << ind << "Textual ";
    if (expression->type() == Textual::NUMBER) std::cerr << " [NUMBER]";
    else if (expression->type() == Textual::PERCENTAGE) std::cerr << " [PERCENTAGE]";
    else if (expression->type() == Textual::DIMENSION) std::cerr << " [DIMENSION]";
    else if (expression->type() == Textual::HEX) std::cerr << " [HEX]";
    std::cerr << expression << " [" << expression->value() << "]";
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    if (expression->is_delayed()) std::cerr << " [delayed]";
    std::cerr << std::endl;
  } else if (dynamic_cast<Variable*>(node)) {
    Variable* expression = dynamic_cast<Variable*>(node);
    std::cerr << ind << "Variable " << expression;
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << expression->name() << "]" << std::endl;
    std::string name(expression->name());
    if (env && env->has(name)) debug_ast(static_cast<Expression*>((*env)[name]), ind + " -> ", env);
  } else if (dynamic_cast<Function_Call_Schema*>(node)) {
    Function_Call_Schema* expression = dynamic_cast<Function_Call_Schema*>(node);
    std::cerr << ind << "Function_Call_Schema " << expression;
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << "" << std::endl;
    debug_ast(expression->name(), ind + "name: ", env);
    debug_ast(expression->arguments(), ind + " args: ", env);
  } else if (dynamic_cast<Function_Call*>(node)) {
    Function_Call* expression = dynamic_cast<Function_Call*>(node);
    std::cerr << ind << "Function_Call " << expression;
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << expression->name() << "]";
    if (expression->is_delayed()) std::cerr << " [delayed]";
    if (expression->is_interpolant()) std::cerr << " [interpolant]";
    std::cerr << std::endl;
    debug_ast(expression->arguments(), ind + " args: ", env);
  } else if (dynamic_cast<Arguments*>(node)) {
    Arguments* expression = dynamic_cast<Arguments*>(node);
    std::cerr << ind << "Arguments " << expression;
    if (expression->is_delayed()) std::cerr << " [delayed]";
    std::cerr << " (" << pstate_source_position(node) << ")";
    if (expression->has_named_arguments()) std::cerr << " [has_named_arguments]";
    if (expression->has_rest_argument()) std::cerr << " [has_rest_argument]";
    if (expression->has_keyword_argument()) std::cerr << " [has_keyword_argument]";
    std::cerr << std::endl;
    for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Argument*>(node)) {
    Argument* expression = dynamic_cast<Argument*>(node);
    std::cerr << ind << "Argument " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << expression->value() << "]";
    std::cerr << " [name: " << expression->name() << "] ";
    std::cerr << " [rest: " << expression->is_rest_argument() << "] ";
    std::cerr << " [keyword: " << expression->is_keyword_argument() << "] " << std::endl;
    debug_ast(expression->value(), ind + " value: ", env);
  } else if (dynamic_cast<Parameters*>(node)) {
    Parameters* expression = dynamic_cast<Parameters*>(node);
    std::cerr << ind << "Parameters " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [has_optional: " << expression->has_optional_parameters() << "] ";
    std::cerr << " [has_rest: " << expression->has_rest_parameter() << "] ";
    std::cerr << std::endl;
    for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Parameter*>(node)) {
    Parameter* expression = dynamic_cast<Parameter*>(node);
    std::cerr << ind << "Parameter " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [name: " << expression->name() << "] ";
    std::cerr << " [default: " << expression->default_value() << "] ";
    std::cerr << " [rest: " << expression->is_rest_parameter() << "] " << std::endl;
  } else if (dynamic_cast<Unary_Expression*>(node)) {
    Unary_Expression* expression = dynamic_cast<Unary_Expression*>(node);
    std::cerr << ind << "Unary_Expression " << expression;
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << expression->type() << "]" << std::endl;
    debug_ast(expression->operand(), ind + " operand: ", env);
  } else if (dynamic_cast<Binary_Expression*>(node)) {
    Binary_Expression* expression = dynamic_cast<Binary_Expression*>(node);
    std::cerr << ind << "Binary_Expression " << expression;
    if (expression->is_interpolant()) std::cerr << " [is interpolant] ";
    if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
    if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
    std::cerr << " [delayed: " << expression->is_delayed() << "] ";
    std::cerr << " [ws_before: " << expression->op().ws_before << "] ";
    std::cerr << " [ws_after: " << expression->op().ws_after << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << expression->type_name() << "]" << std::endl;
    debug_ast(expression->left(), ind + " left:  ", env);
    debug_ast(expression->right(), ind + " right: ", env);
  } else if (dynamic_cast<Map*>(node)) {
    Map* expression = dynamic_cast<Map*>(node);
    std::cerr << ind << "Map " << expression;
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [Hashed]" << std::endl;
    for (auto i : expression->elements()) {
      debug_ast(i.first, ind + " key: ");
      debug_ast(i.second, ind + " val: ");
    }
  } else if (dynamic_cast<List*>(node)) {
    List* expression = dynamic_cast<List*>(node);
    std::cerr << ind << "List " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " (" << expression->length() << ") " <<
      (expression->separator() == SASS_COMMA ? "Comma " : expression->separator() == SASS_HASH ? "Map" : "Space ") <<
      " [delayed: " << expression->is_delayed() << "] " <<
      " [interpolant: " << expression->is_interpolant() << "] " <<
      " [listized: " << expression->from_selector() << "] " <<
      " [arglist: " << expression->is_arglist() << "] " <<
      " [hash: " << expression->hash() << "] " <<
      std::endl;
    for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Content*>(node)) {
    Content* expression = dynamic_cast<Content*>(node);
    std::cerr << ind << "Content " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [@media:" << expression->media_block() << "]";
    std::cerr << " [Statement]" << std::endl;
  } else if (dynamic_cast<Boolean*>(node)) {
    Boolean* expression = dynamic_cast<Boolean*>(node);
    std::cerr << ind << "Boolean " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " [" << expression->value() << "]" << std::endl;
  } else if (dynamic_cast<Color*>(node)) {
    Color* expression = dynamic_cast<Color*>(node);
    std::cerr << ind << "Color " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " [" << expression->r() << ":"  << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
  } else if (dynamic_cast<Number*>(node)) {
    Number* expression = dynamic_cast<Number*>(node);
    std::cerr << ind << "Number " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
    std::cerr << " [" << expression->value() << expression->unit() << "]" <<
      " [hash: " << expression->hash() << "] " <<
      std::endl;
  } else if (dynamic_cast<String_Quoted*>(node)) {
    String_Quoted* expression = dynamic_cast<String_Quoted*>(node);
    std::cerr << ind << "String_Quoted " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << prettyprint(expression->value()) << "]";
    if (expression->is_delayed()) std::cerr << " [delayed]";
    if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
    if (expression->is_interpolant()) std::cerr << " [interpolant]";
    if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
    std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
  } else if (dynamic_cast<String_Constant*>(node)) {
    String_Constant* expression = dynamic_cast<String_Constant*>(node);
    std::cerr << ind << "String_Constant " << expression;
    if (expression->concrete_type()) {
      std::cerr << " " << expression->concrete_type();
    }
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " [" << prettyprint(expression->value()) << "]";
    if (expression->is_delayed()) std::cerr << " [delayed]";
    if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
    if (expression->is_interpolant()) std::cerr << " [interpolant]";
    std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
  } else if (dynamic_cast<String_Schema*>(node)) {
    String_Schema* expression = dynamic_cast<String_Schema*>(node);
    std::cerr << ind << "String_Schema " << expression;
    std::cerr << " " << expression->concrete_type();
    if (expression->is_delayed()) std::cerr << " [delayed]";
    if (expression->is_interpolant()) std::cerr << " [is interpolant]";
    if (expression->has_interpolant()) std::cerr << " [has interpolant]";
    if (expression->is_left_interpolant()) std::cerr << " [left interpolant] ";
    if (expression->is_right_interpolant()) std::cerr << " [right interpolant] ";
    std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
    for(auto i : expression->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<String*>(node)) {
    String* expression = dynamic_cast<String*>(node);
    std::cerr << ind << "String " << expression;
    std::cerr << " " << expression->concrete_type();
    std::cerr << " (" << pstate_source_position(node) << ")";
    if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
    if (expression->is_interpolant()) std::cerr << " [interpolant]";
    std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
  } else if (dynamic_cast<Expression*>(node)) {
    Expression* expression = dynamic_cast<Expression*>(node);
    std::cerr << ind << "Expression " << expression;
    std::cerr << " (" << pstate_source_position(node) << ")";
    switch (expression->concrete_type()) {
      case Expression::Concrete_Type::NONE: std::cerr << " [NONE]"; break;
      case Expression::Concrete_Type::BOOLEAN: std::cerr << " [BOOLEAN]"; break;
      case Expression::Concrete_Type::NUMBER: std::cerr << " [NUMBER]"; break;
      case Expression::Concrete_Type::COLOR: std::cerr << " [COLOR]"; break;
      case Expression::Concrete_Type::STRING: std::cerr << " [STRING]"; break;
      case Expression::Concrete_Type::LIST: std::cerr << " [LIST]"; break;
      case Expression::Concrete_Type::MAP: std::cerr << " [MAP]"; break;
      case Expression::Concrete_Type::SELECTOR: std::cerr << " [SELECTOR]"; break;
      case Expression::Concrete_Type::NULL_VAL: std::cerr << " [NULL_VAL]"; break;
      case Expression::Concrete_Type::C_WARNING: std::cerr << " [C_WARNING]"; break;
      case Expression::Concrete_Type::C_ERROR: std::cerr << " [C_ERROR]"; break;
      case Expression::Concrete_Type::NUM_TYPES: std::cerr << " [NUM_TYPES]"; break;
    }
    std::cerr << std::endl;
  } else if (dynamic_cast<Has_Block*>(node)) {
    Has_Block* has_block = dynamic_cast<Has_Block*>(node);
    std::cerr << ind << "Has_Block " << has_block;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << has_block->tabs() << std::endl;
    if (has_block->block()) for(auto i : has_block->block()->elements()) { debug_ast(i, ind + " ", env); }
  } else if (dynamic_cast<Statement*>(node)) {
    Statement* statement = dynamic_cast<Statement*>(node);
    std::cerr << ind << "Statement " << statement;
    std::cerr << " (" << pstate_source_position(node) << ")";
    std::cerr << " " << statement->tabs() << std::endl;
  }

  if (ind == "") std::cerr << "####################################################################\n";
}

inline void debug_node(Node* node, std::string ind = "")
{
  if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
  if (node->isCombinator()) {
    std::cerr << ind;
    std::cerr << "Combinator ";
    std::cerr << node << " ";
    if (node->got_line_feed) std::cerr << "[LF] ";
    switch (node->combinator()) {
      case Complex_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
      case Complex_Selector::PARENT_OF:   std::cerr << "{>} "; break;
      case Complex_Selector::PRECEDES:    std::cerr << "{~} "; break;
      case Complex_Selector::REFERENCE:   std::cerr << "{@} "; break;
      case Complex_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
    }
    std::cerr << std::endl;
    // debug_ast(node->combinator(), ind + "  ");
  } else if (node->isSelector()) {
    std::cerr << ind;
    std::cerr << "Selector ";
    std::cerr << node << " ";
    if (node->got_line_feed) std::cerr << "[LF] ";
    std::cerr << std::endl;
    debug_ast(node->selector(), ind + "  ");
  } else if (node->isCollection()) {
    std::cerr << ind;
    std::cerr << "Collection ";
    std::cerr << node << " ";
    if (node->got_line_feed) std::cerr << "[LF] ";
    std::cerr << std::endl;
    for(auto n : (*node->collection())) {
      debug_node(&n, ind + "  ");
    }
  } else if (node->isNil()) {
    std::cerr << ind;
    std::cerr << "Nil ";
    std::cerr << node << " ";
    if (node->got_line_feed) std::cerr << "[LF] ";
    std::cerr << std::endl;
  } else {
    std::cerr << ind;
    std::cerr << "OTHER ";
    std::cerr << node << " ";
    if (node->got_line_feed) std::cerr << "[LF] ";
    std::cerr << std::endl;
  }
  if (ind == "") std::cerr << "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
}

inline void debug_ast(const AST_Node* node, std::string ind = "", Env* env = 0)
{
  debug_ast(const_cast<AST_Node*>(node), ind, env);
}

inline void debug_node(const Node* node, std::string ind = "")
{
  debug_node(const_cast<Node*>(node), ind);
}

inline void debug_subset_map(Sass::ExtensionSubsetMap& map, std::string ind = "")
{
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
  for(auto const &it : map.values()) {
    debug_ast(it.first, ind + "first: ");
    debug_ast(it.second, ind + "second: ");
  }
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
}

typedef std::pair<Complex_Selector*, Compound_Selector*> ExtensionPair;
typedef std::vector<ExtensionPair> SubsetMapEntries;

inline void debug_subset_entries(SubsetMapEntries* entries, std::string ind = "")
{
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
  for(auto const &pair : *entries) {
    debug_ast(pair.first, ind + "first: ");
    debug_ast(pair.second, ind + "second: ");
  }
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
}

#endif // SASS_DEBUGGER

redpajama_set_name: RedPajamaGithub


Updated – 25/March/2018 – If you are looking for a decent lightweight keyboard for general use or gaming you can look at purchasing the Logitech MK330 which is an excellent quality product in this range. The Keyboard and mouse combo is usually a cheaper option.
If you spend a good proportion of time in front of PC I would recommend you to have a very good keyboard and mouse as continuously use them, and more comfortable they are better for your hands and easier for you to work. You can get a Rs. 400 keyboard or a Rs. 200 mouse but they are not as comfortable.
If you expect something better with wireless, the Logitech MK 330 is a fantastic choice. I personally don't like a lot of wires and mess they create, another reason to shift to wireless keyboard and mouse.
The Wireless Mouse and Keyboard Combo is priced close to Rs. 2,000. I purchased it for Rs. 2000 in one of the mobile App sales, prices keep fluctuating.
The Logitech K330 is priced at Rs. 2050($30) and can be purchased from any local computer hardware store as well as Online. The Keyboard K330 comes with the Logitech M215 mouse combo.
The combo comes in a simple box, the packaging is done neatly by Logitech and mouse and keyboard both have alkaline non-rechargeable batteries. In the Box, you will find the Keyboard, Mouse, the receiver, and manual, along with driver DVD.
The Keyboard looks premium and is not very bulky. The first thing you will notice once you lift it is the lightweight and decent Matte finish on the Keys and the side area. It does not give a glossy feel and poly-plastic surface is neither a finger magnet. The Keyboard has an on/off switch at the back which can be used when it is in-operational for days. The keyboard required 2 AAA batteries to work.
The mouse is M215, a very nicely designed and contoured mouse with robust build quality. It just fits well and is easy to grip and use. The mouse was little heavy compared to my earlier mouse the B175 Logitech. The mouse uses a single AA battery.
The black color mouse looks premium with elegant shape and design. The mouse is dual tone with the edge made of slightly different shade(grey), which also enhances the looks.
The mouse wheel has small grooves which is much better compared to the flat wheels which come with some mouse. While playing games like Battlefield or CS GO can come handy.
The mouse uses a single battery and so far have replaced one battery, I have high usage, your's may last longer.
The battery life is adequate and can last more than 4-6 months easily. Though Logitech claims 24 months for the keyboard and 12 months for the mouse.
I have used the keyboard for more than 6 months and found connectivity is good. The Keyboard is fast to connect and in my experience, never faced any connection loss issues.
The Keyboard has easy to use multimedia keys. They are a handy to increase/reduce volume in media player, jump directly to the mailbox, or home screen, Windows toggle, Music, Volume Up, and Down Mute, Next and Previous track functions. I am not a big user of the function keys so sparingly used them.
The Keyboard and the Mouse get connected to the Laptop or PC by means of the USB receiver, there is only one USB receiver which connects both the devices. For some of the users, this can be beneficial others may like two separate receivers. If you wish to use the mouse on laptop and keyboard with your PC you will not be able to do it as the single receiver can be plugged only into one device.
The Mouse has good connectivity and is fairly responsive. The buttons are good but not the best, I have used some softer buttons with better tactile feedback compared to the one used on the M215 in this combo.
Though I have used the Mouse for almost 6 months and is pretty good to hold and use and makes your work easy. The thumb hold and the gripping finger point has a nice curve which makes it fairly easy to use the mouse and hold it.
You're in charge with 4 re-programmable F-keys and 6 re-programmable hotkeys that you can easily customize to open your favorite applications, folders or web pages.
My major reason to upgrade from the earlier arrangement was typing experience. Earlier I was using the wired dell Keyboard (Cost Rs. 500) along with the Microsoft USB mouse(Cost Rs. 400).
The typing experience was poor for someone who easily types more than 1000 words a day on the keyboard. The buttons for the Microsoft mouse were hard to click compared to the Logitech M215 which comes along with the K330 keyboard.
When I switched from the earlier products to the K330 it took sometime in getting used to the new keyboard. My hands were accustomed to the older keyboard. I felt weird for 2-3 days. But after 2 days of usage, the keyboard felt great.
Keys are much softer to type and the actuation force required to press the keys when typing was much less. My fingers thanked me for the switch to the Logitech MK330.
The hand rest is also quite good which helps you keep your palms easily and type fast on the keyboard. The only issue I had with the keyboard was the small sized F1, F2, F3 …. Function keys which sometimes I missed, but after 15-20 days got used to the design.
The typing experience is good for a membrane keyboard and for a price tag of Rs. 2,000 it is a great product. If you wish to have the best experience then you can look at the mechanical keyboards.
The Keyboard and mouse come with the unified receiver software which you can install from the DVD. You can also easily download it from the Logitech website. It helps in an easy and fast pairing of the mouse and keyboard with the unified USB receiver. The software is pretty basic and easy to use. The keyboard and mouse also work without installing the software.
The keyboard uses 2.4 GHz wireless connectivity. The mouse and keyboard offer seamless connectivity and you should be able to use it at a distance of 5-7 feet without facing any issues.
Is it Good for PC Gaming?
If you ask me is it a replacement for a high speed / high sensitivity PC Gaming keyboard and mouse, then the answer is no. If you are an occasional gamer and like to play games once in a while then it is a great choice. I played BF3, BF4 and GTA 5, other games with this and it did not disappoint me.
Can it be used with a Laptop?
Yes if you have a laptop, you can use it with the laptop by installing the unified software. It is not very tiny if you are looking for a very tiny keyboard, it is not that.
Verdict – Would I recommend this to a friend?
Yes, It is a great wireless keyboard and is also not very expensive, comes with one year warranty and Logitech is a good brand with a fair bit of experience in manufacturing keyboards and mouse.
Update – I switched to the TVS E-Gold Keyboard after using this keyboard and after that have switched to the Corsair Rapid-I and G.Skill KM 570.
7 Best Wireless Mouse in India.


text:
Paganini Reviews
Tartini Reviews
… The Devil's Thrill
Giuseppe Tartini: Sonata in G minor for Violin "Devil's Thrill"
Jean Marie Léclair: Sonata in A Major for Violin, Op. 9 #5
Pietro Antonio Locatelli: Sonata in D minor for Violin, Op. 6 #12
Nicolò Paganini: Sonata #1 in A minor
Mela Tenenbaum, violin
Richard Kapp, piano
Essay Recordings CD1078 58m DDD
… and the Devil Made Me Do It!
(same works for viola)
Mela Tenenbaum, viola
Does Tipper Gore know? Shouldn't these CDs come with a warning label about satanic messages?
Seriously, of these four sonatas, only Tartini's is programmatically diabolical. The story goes that Tartini, while dreaming one night, was visited by the Devil himself. The Devil, violin in hand, regaled the composer with a display of virtuosity that shook him to the marrow. When his guest departed, Tartini attempted to commit the Devil's music to paper, and admitted that he was only partly successful. Compared to twentieth-century diabolus in musica, the "Devil's Trill" Sonata is tame stuff. However, modern performances tend to exorcise it even more. In his booklet notes, Kapp asks, "If this was supposed to be diabolical, why does it sound so boring [when some other musicians play it]?" Tenenbaum and Kapp put the imp back in impetuousness in their recording of the Tartini. Not since Nathan Milstein has this sonata been so ear-catching, and even Milstein was relatively gentlemanly. Tenenbaum's playing doesn't exactly ignore period style, but her primary interest seems to be communication, not authenticity, and that's fine by me.
The sonatas by Leclair and Locatelli are satanic only in the sense that they make unreasonable demands upon the violinist. Almost three centuries of music history have dulled our sensitivity to what is diabolically difficult to play; almost three centuries of world history have forced us to redefine what is diabolical! In other words, it is hard to make listeners shiver to Leclair when Marilyn Manson is just around the corner. Nevertheless, Tenenbaum and Kapp successfully strive to replace some of the "shock of the new" that has faded from these scores while retaining an essentially seductive sensibility.
Paganini was almost a century junior to these composers, and his presence here is a little jarring, musically speaking. His inclusion can be excused, however, because he was reputed to have sold his soul to the Devil in exchange for his fantastic proficiency on the instrument. If Paganini did little to discredit these stories, that just goes to show that some forms of publicity have changed very little in the last two hundred years.
Tenenbaum plays the so-called Wilmotte Stradivarius (1734) on this CD.
Having recorded this program for violin and piano, Tenenbaum and Kapp turned around and recorded it again, replacing the violin with a viola. The Devil Made Me Do It! was the result. As the viola plays a fifth lower than the violin, last-minute transpositions and rethinkings of piano parts were necessary. To their credit, Tenenbaum and Kapp handle this with perfect aplomb. I enjoy the richer, albeit less brilliant tone of the viola. Perhaps a violin is more appropriate if one wishes to emphasize diabolical brilliance, but there's something pretty scary about switching instruments with Tenenbaum's insouciance.
Excellent engineering from Essay. Prague was the recording locale. Finally, it is worth noting that the striking cover art is by Tenenbaum; the talented violinist is also a talented artist. Now that's scary too.
Copyright © 2002, Raymond Tuttle

redpajama_set_name: RedPajamaCommonCrawl


Among my very earliest memories of gaming are the kind of RPGs that simply couldn't (and perhaps shouldn't) succeed today. I'm talking about classics like Mike Singleton's seminal Lords of Midnight or the later, more visually impressive, Eye of the Beholder. These games eventually gave rise to several different kinds of RPG, including isometric affairs like Baldur's Gate, or perhaps more directly, first-person efforts in sprawling worlds, like The Elder Scrolls series — which is no spring chicken itself. The subject of today's review, Realms of Arkania: Star Trail, ignores almost all of that evolution by throwing itself back to the mid-nineties in terms of presentation, visuals and even how it fails entirely to inform the player about what is happening.
With that damning introduction out of the way — and assuming you're still reading — you might just have the intestinal fortitude required to tackle Star Trail after all. I won't lie to you (after all, it's my job not to) but there is a hell of a lot wrong with this game. Played on a PS4 Pro, it looks like a game that would have been barely acceptable at the outset of the previous generation, albeit upscaled to 4K in an appalling parody of games designed specifically for modern systems. Perhaps even worse are some of the more prominent technical issues — the loading screens mid-conversation, when a menu is opened, when a door is opened or basically when anything happens at all.
The presentation overall is dismal, in fact. Poor graphics could be forgiven for a riveting script delivered by compelling voice actors, but alas, Star Trail features neither. The voice acting in cutscenes is delivered sporadically and poorly when it comes, with some characters rambling on about one thing whilst the onscreen text tells another story. It's a shame that cutscenes featuring key story elements come across so poorly because in normal conversations (which are all text driven) the world of Star Trail does begin to take shape. In fact, it's only through exploration of the world, the characters and most of all the systems — oh god, the systems — that you'll see any shine on this star.
I should begin at the start, much as you will. The game opens in a temple, with the player provided with a prebuilt party of adventurers. It's possible to do some character creation and customisation here, though you'll need to work it out on your own. If you do, you'll be rewarded with one of the most comprehensive sets of statistical options that I've seen in a game for years. This is important, because if you don't balance your force correctly and understand it in intricate detail, you'll die — probably over and over again. Every character comes complete with powers, abilities and spells aplenty, many of which are unlocked slowly over the course of several levels and as the result of countless battles.
It may come as a surprise to many modern RPG players that many (if not most) of these skills are actually relevant outside battle. Star Trail features tonnes of classic RPG skill testing and invisible rolling to resolve the outcome of events. From tavern games to critical conversations, you'll need to know who in your party is good at what in order to succeed. Unfortunately, thanks to its old-school approach, even if you do have your most charismatic character do most of the talking, you'll still often fall foul of tests that have completely unknown success conditions applied against them.
When not testing your wit, skill or silver tongue, you spend your time wandering in two of the Star Trail's different modes. The first (the one that I've talked about most so far) is the adventure mode, which is basically a first-person romp through key locations. Towns, cities, dungeons, castles and certain outdoor locations are all represented in this way and, to give the designers credit, what the game lacks in actual visual appeal, it makes up for in variety and scale. Traversing between these notable locations is done via a world map that simply lets you wander freely, occasionally happening upon scripted (or possibly random) events which can result in battles, loading screens, more loading screens… then sometimes a conversation.
The actual battles represent by far the most interesting thing in Star Trail, with a completely different visual style (grid-based isometric) and a turn-based structure. You get to control your whole party and usually face overwhelming odds. Some battles, I am convinced, are unwinnable, whilst all battles are bloody hard. As I said earlier, you'll need an intricate understanding of who in your party does what and when to do whatever 'what' is. Often as not, spells and attacks miss completely or even backfire, which is frustrating, but it's all part of the game. Whilst annoying, learning the fighting system in Star Realm is at least rewarding and the battles are long and tough enough that every victory feels significant in a way you can take some satisfaction from.
So here we have a bit of a conundrum. Part of me can see the appeal of a game like Star Trail. It harks back to a part of my life that is long gone — a time when I had more… time. A time when I could spend as long as I wanted doing and redoing things until I had the formula perfectly correct and I could inch one step closer towards the conclusion of a game like Lords of Midnight.
Sadly, I don't have that time nowadays, and I don't have the patience either. Dark Souls offers the same kind of cautious advancement, but it does so with much more immediacy and a lot more style. It even offers a world that is far more mysterious and appealing than that of Star Trail. Star Trail isn't attempting to be Dark Souls, though, it's more like a Pillars of Eternity, but where Star Trail hides its systems behind invisible screens filled with numbers, Pillars streamlined the whole experience to draw players into a world that is exceptional in every way.
And so I'm forced to conclude that there is simply no reason to pick up Star Trail unless you are absolutely out of better options and/or because you really, really want to feel the pain of gaming in the 1980s, delivered through a graphics engine conceived in the 1990s and polished for televisions of the present day. I honestly do not know who this game is for or why it was remade in the way it was. If it was intended as a homage, or a labour of love, then why not fix the myriad of frustrations it carries? Why not make it appeal to modern gamers? Why not use the technology available to iron out the loading screens, add proper voiceovers and animation that is even remotely credible? The answer is: I don't know. And because of all these things, I just couldn't enjoy Star Trail — so I can't recommend it to you, now, either.
Realms of Arkania: Star Trail is available now on PS4, Xbox One and PC.


The Russian video blogger Andrey Afonin better known under a nickname of Afonya TV, has fallen from the motorcycle. He has reported about it on the page in Instagram. He has told that he went after flowers for the girl and at the same time shot a video for YouTube. Asphalt was wet after a rain therefore at some point Afonin hasn't managed to drive and has fallen. "I don't understand yet that with a leg, I can't unbend it. The second too ***** (pancake), hurts peeled" — the blogger in the published video has told. He has also added that this his fourth falling on the motorcycle. Houses ❤ the Photo is published @afonyatvspustya several hours after road accident Afonin has posted one more photo, from the house this time. On her the blogger sits on a floor in one pants and with the tied-up knee. On Afonya TV channel 3,1 million users are signed. The video blogger has become famous thanks to numerous prank calls and extremely emotional revelations of colleagues on YouTube. It is more than infernal and strange news in Tape of a Bottom Telegram-channel. Subscribe!


text:
Q: Windows API equivalent of Stopwatch::ElapsedTicks? I am calling into an API that needs the elapsed ticks between 2 points. In a C# version, I use Stopwatch and utilize the ElapsedTicks method (this seems to be different than ElapsedMilliseconds obviously).
In Windows API I see GetTickCount(). However this seems to return the elapsed milliseconds, not ticks. How can I accomplish the equivalent with Windows API? (Prefer language agnostic since I might be writing a few wrappers for this).

A: Stopwatch uses QueryPerformanceCounter internally, if it's available.
It determines if it's available by calling QueryPerformanceFrequency - the return value is also used to determine the frequency of the performance counter.

redpajama_set_name: RedPajamaStackExchange


The youth at church were going to a concert this evening. After reviewing the website of the place they were going I decided not to send my crew. There was nothing that was hazardous to their health – per se – but the website left me with a sour taste in my mouth.
There seems to be too much compromise in the church for my taste. It is particularly prevalent with the youth. After all, you have to give them what they want to get them in the door. Forget holding up the bar higher, you have to lower your standards or the program is going to crash.
That just seems wrong. If I remember correctly it is the Holy Spirit that draws people. The best music or most dynamic teacher may get them in the door, but it won't stick if the Holy Spirit didn't draw them. If the Holy Spirit is in the place then the rest will just be gravy.
I talked to my oldest son before we canceled the trip. I asked him if he felt like this was the way that Jesus wanted to be advertised (so to speak). He said "no way." My eleven year old son then asked if he could call his youth leader and explain to her what this group was doing.
We had to have another talk about how our views are not necessarily shared by others. Too many people believe that to get the people in the doors they have to dumb down the message that they are putting out. I just don't believe that this compromise is the right way – as for me and my house . . .


text:
@echo off
pushd %~dp0
"%VS120COMNTOOLS%..\IDE\mstest" /test:Microsoft.Protocols.TestSuites.MS_FSSHTTP_FSSHTTPB.MS_FSSHTTP_FSSHTTPB_S09_GetVersions.TestCase_S09_TC02_GetVersions_Success_Results_ListId /testcontainer:..\..\MS-FSSHTTP-FSSHTTPB\TestSuite\bin\Debug\MS-FSSHTTP-FSSHTTPB_TestSuite.dll /runconfig:..\..\MS-FSSHTTP-FSSHTTPB\MS-FSSHTTP-FSSHTTPB.testsettings /unique
pause


text:
America Asia Europe United States
Argentina Brazil Chile Colombia Mexico
Panama Peru Puerto Rico United States Venezuela
Choose a currency ARS Argentine Peso AUD Australian Dollar BSD Bahamian Dollar BMD Bermudian Dollar BOB Bolivian Boliviano BRL Brazilian Real GBP British Pound CAD Canadian Dollar KYD Cayman Islands Dollar CLP Chilean Peso COP Colombian Peso CRC Costa Rican Colón
Access your reservation
Sign in to get exclusive offers!
Sign in to get member-only offers.
Register to get exclusive offers.
Rent a Car Orlando
6000 Universal Blvd, Orlando
https://www.universalorlando.com
I want to return my car in other location
Dropoff Date
Pickup Hour - Select - 12:30 am 1:00 am 1:30 am 2:00 am 2:30 am 3:00 am 3:30 am 4:00 am 4:30 am 5:00 am 5:30 am 6:00 am 6:30 am 7:00 am 7:30 am 8:00 am 8:30 am 9:00 am 9:30 am 10:00 am 10:30 am 11:00 am 11:30 am 12:00 pm 12:30 pm 1:00 pm 1:30 pm 2:00 pm 2:30 pm 3:00 pm 3:30 pm 4:00 pm 4:30 pm 5:00 pm 5:30 pm 6:00 pm 6:30 pm 7:00 pm 7:30 pm 8:00 pm 8:30 pm 9:00 pm 9:30 pm 10:00 pm 10:30 pm 11:00 pm 11:30 pm
Dropoff Hour - Select - 12:30 am 1:00 am 1:30 am 2:00 am 2:30 am 3:00 am 3:30 am 4:00 am 4:30 am 5:00 am 5:30 am 6:00 am 6:30 am 7:00 am 7:30 am 8:00 am 8:30 am 9:00 am 9:30 am 10:00 am 10:30 am 11:00 am 11:30 am 12:00 pm 12:30 pm 1:00 pm 1:30 pm 2:00 pm 2:30 pm 3:00 pm 3:30 pm 4:00 pm 4:30 pm 5:00 pm 5:30 pm 6:00 pm 6:30 pm 7:00 pm 7:30 pm 8:00 pm 8:30 pm 9:00 pm 9:30 pm 10:00 pm 10:30 pm 11:00 pm 11:30 pm
Rates & Inclusions
Just Car
Basic Rate with Mandatory Taxes and Fees
Just Car Plus
Liability Insurance, Mandatory Taxes and Fees
Basic Protection
Collision Protection (CDW/LDW), Mandatory Taxes and Fees
Collision Protection (CDW/LDW), Liability Insurance, Mandatory Taxes and Fees
Full Protection + GPS
GPS, Collision Protection (CDW/LDW), Liability Insurance, One Additional Driver, Mandatory Taxes and Fees
Full Protection + Gas
First Tank of Gas, Collision Protection (CDW/LDW), Liability Insurance, One Additional Driver, Mandatory Taxes and Fees
GPS, First Tank of Gas, Collision Protection (CDW/LDW), Liability Insurance, One Additional Driver, Mandatory Taxes and Fees
Collision Protection with Deductible, Liability Insurance, Theft Protection, Mandatory Taxes and Fees.
Super Protection
Collision Protection without Deductible, Liability Insurance, Theft Protection, Personal Protection, Mandatory Taxes and Fees.
Standard Protection
Collision Protection (CDW/LDW), Liability Protection (SLI), Mandatory Taxes and Fees
Premium Protection
Collision Protection (CDW/LDW), Liability Protection (SLI), Additional Driver, First Tank of Gas, Mandatory Taxes and Fees
Premium Protection + GPS
GPS, 1 Tank of Gas, Collision Protection (CDW/LDW), Liability Protection (SLI), Additional Driver, Mandatory Taxes and Fees
The best rate
I Have a Promo Code!
--Select-- HERTZ BUDGET AVIS Rentingcarz
Search offices nearby your selected location
Change your reservation
No extra fees!
Pay now or pay at your destination.
Our Promo Rate the lowest one yet.
Ubication Selected:
2 Miles 5 Miles 10 Miles
La búsqueda frecuente que ha indicado no existe
Visiting Universal Studios in your Rental Car
Universal Studios Florida was inaugurated in 1990 as competition for Disney Hollywood Studios (now known as Disney MGM). Today Universal Studios has become the second biggest tourist complex in Florida after Disney and contains 4 hotels, 2 theme parks (Universal Studios Florida and Islands of Adventure), a waterpark (Wet 'n Wild) and a nightlife zone (Universal CityWalk).
Just like Disney, Universal offers the option to buy tickets to access one park for a single day, or to access all its parks during 4 days. Another option is a rapid access pass (Universal Express) for just the most popular attractions. These passes are free for all guests of the complex's hotels.
For those who are in Miami or Orlando about to jump in their rental cars and come visit, we'll tell you a little about what you can expect to find in each park.
Universal Studios Florida
This park replicates a huge cinema and television studio whose principal attractions are inspired by films, television, and musicals. It's divided into 7 themed zones: Hollywood, Production Central, New York, San Francisco, Springfield (dedicated to The Simpsons), World Expo, and Woody Woodpecker's Kidzone for the youngsters.
This park consists of 7 zones offering different adventures: Port of Entry, Marvel Super Hero Island, Toon Lagoon, Jurassic Park, The Lost Continent, Seuss Landing, and the Wizarding World of Harry Potter https://www.universalorlando.com/espanol/Parques-Tematicos/Wizarding-World-Of-Harry-Potter.aspx. This last zone offers attractions, shops, live shows and restaurants featuring Harry Potter. Since its opening in 2010 this zone has become an enormous hit.
Wet 'n Wild Orlando
This waterpark, inaugurated in 1977 and purchased by Universal in 1998, has 18 slides and attractions such as Bomb Bay, Disco H2O, and The Storm and The Surge.
As competition for Downtown Disney, Universal inaugurated Universal CityWalk in 1999 with a complex of shops, theme restaurants, night clubs, cafes, a cinema complex, and shows such as The Blue Man Group.
Hotel Complexes
There are 4 hotels at Universal Studios: Hard Rock Hotel, Loews Royal Pacific Resort, Loews Portofino Bay Hotel, and Universal's Cabana Bay Beach Resort which offers more affordable prices than the other resorts.
How to Get to Universal Studios when you Rent a Car
Universal Studios is located at 6000 Universal Boulevard, Orlando, FL 32819 between Interstatal 4 to the south, State Rd 435 to the east, Vineland Rd to the north, and Turkey Lake Rd to the west. Those traveling by rental car can go on Interstatal 4, if driving east take exit 75A; if going west take exit 74B. The complex is easy to find but its always a good idea to make sure your rental car comes equipped with GPS in your language.
Parking Information for your rental car
For those staying outside of Universal's Resorts, its easy to visit by rental car since the complex has an enormous parking lot with various floors for visitors. The lot has a roof to protect vehicles from bad weather. The entrance is about a 10 minutes walk from the parking structure. The cost to park for the whole day is US$15 and provides access to all the parks.
{{widget:maps-Orlando--10}}
Monkey Jungle
Miami Auto Museum
Miami International Airport
Fort Lauderdale International Airport
Orlando International Airport
Suscribe and receive our car rental deals
78 SW 7th Street, Suite 500, Miami, FL 33130
Top car rental destination
Top car rental Companies
Rent a Car in Miami
Rent a Car in Orlando - Car Rental Deals
Rent a Car at Fort Lauderdale Airport (FLL)
Rent A Car in Los Angels
Rent A Car at McCarran Las Vegas Airport (LAS), Las Vegas
Rent A Car in San Antonio Airport(SAT), Texas
We use cookies to give you a better service. If you accept that, just keep browsing. If you don't, simply change the cookie settings.


We are both human and divine. The perennial philosophy, the spiritual and ancient wisdom traditions inform us of this truth. In our humanness we are separate individuals, with our unique egoic consciousness contained within our equally unique physicality. In our divine nature we are multi-dimensional, spiritual beings and we are connected, at that level with everyone and all of life in fact, on our blue planet.
Our individuality and our universality exist side by side. We 'skin-encapsulated egos' living in this physical world of objects and things that seem apart from us, are in actuality divine players of unfathomable spiritual depths dancing on a cosmic stage that teems with invisible forms of energy. Our bodies unknowingly (to us) react and respond to this energy. There are over 300 million actions and reactions going on in our bodies every second; an incredibly complex world lies beneath our skin. And at the same time as it coordinates the chemical activities required to keep us alive, our body's intelligence is also monitoring the energetic fluctuations of the stars and planets. Incredible, but true. We are truly walking miracles and we are totally unique, just like every other life form here.
We are players and we are being played. We have free will but we are subject to natural laws over which we have no control. We cannot escape either our individuality or our participation in the big picture, the cosmic drama that is occurring both within and without. But why is it that our individuality creates, as Paul Brunton says above, this 'essential loneliness'. Can we escape it? And if we are so intricately connected (and it is apparent that we are) with the wider universe, why do we feel this way? Is it the in-built protective mechanism called fear, designed to keep us alive as long as possible in these flesh bodies that is responsible for the pain we might call loneliness? We know there is nothing like pain to intensify our feelings of separateness. When struck by disaster (dis-aster = against the stars), trauma, tragedy, or we are confronted by the stark reality of our inevitable decline into old age (should we have escaped fatal accidents and illnesses) and death, it is natural to lose our sense (if we had any) of our interconnectedness; it is natural to feel fear, panic even. Why is this so? That it is, surely, calls for a solution.
As we know from the perennial philosophy, coming down to us from the enigmatic Hermes Trismegistus (the reincarnated Thoth of the ancient Egyptians), everything in life must find its balance. The pendulum, having swung in one direction, must swing back in the other. All of life in this realm must be balanced – whether an action, an emotion or a thought. Our karma is as much a natural law as gravity is. For everything we set in motion will be returned to us; everything will be balanced – whether consciously or unconsciously. Every effect is the consequence of a pre-existing cause.
Which leads me to this: our loneliness – symptomatic of our separateness, must be balanced by the experience of its opposite. Its 'opposite' is of course our spirituality or in other words our interconnectedness with the One. The All. It is this we need to experience. As Hermes informs us, we are twofold and therefore two forces dictate our fate. The force of our freewill must be called upon, if we are to ameliorate the pain of our separation.
How so? It is far easier for me to write this than for you, or me, to action it. From far back into pre-history, fragments of the esoteric wisdom trickle down. We know that the resolution of our pain is only to be found in the quest to realize the unshakeable truth of our divinity. Enlightenment is the goal. It is one that lies beyond this lifetime for most of us perhaps. But I believe, even if we never arrive at that one moment where life finally appears as it really is, where the veil is lifted – just for a moment, we may still find resolution and relief from our loneliness – in the quest itself.
Free will then, is the conscious decision to embark on the quest. Moreover, to stay with it – to be disciplined and steadfast. In regular meditation, in constant and conscious self-reminders to be present, to be in this moment, in the effort to keep ones' heart open, to be loving, to be kind, to be gentle with self and others, to feel (and act on) compassion, to respect all life forms, to treat all as one. In these, we bring balance and equanimity to our personal and global chaos. Old fashioned values maybe – yet they comprise the essence of spirituality and of religious feeling. We must carve out time in our busy lives to simply be with ourselves. We need to journey on a daily basis, inward. The kingdom of heaven is within, after all. And in truth, if we hope for change in the world, we must begin with ourselves.
We suffer as mortals. Hermes was quite right and nothing has changed in thousands of years since. Yet, in recognition of universal laws, we realize we do have the power to alleviate our suffering. We acknowledge the pendulum has swung too far into the mortal realm when we feel the ache of grief and loneliness, the panic of fear, the dread of the future – however separation manifests at any one time. And we decide to make a deliberate effort to swing it back the other way – back to the truth of our divine heritage – where we are never separate and alone. We are immortal beings. We are here on this planet for a moment in time. Our lives seem long but they are a fragment. Just as particles buzz in and out of the waveform world into the particle one – we too will disappear back out of these particles we call bodies and merge again with the All. We will reconnect. Let us do the best we can, for the sake of our own peace of mind as much as for the wellbeing of our planet, while we are here.
I leave you with some predictions, attributed to Hermes. In these times in which we live, we must hope and believe the pendulum will swing and order, and nature, will be restored.
Darkness will be preferred to light, and death will be thought more profitable than life; no one will raise his eyes to heaven; the pious will be deemed insane, and the impious wise; the madman will be thought a brave man, and the wicked will be esteemed as good. As to the soul, and the belief that it is immortal by nature, or may hope to attain to immortality, as I have taught you, all this they will mock at, and will even persuade themselves that it is false. No word of reverence or piety, no utterance worthy of heaven and of the gods of heaven, will be heard or believed.
And so the gods will depart from mankind, a grievous thing!, and only evil angels will remain, who will mingle with men, and drive the poor wretches by main force into all manner of reckless crime, into wars, and robberies, and frauds, and all things hostile to the nature of the soul. Then will the earth no longer stand unshaken, and the sea will bear no ships; heaven will not support the stars in their orbits, nor will the stars pursue their constant course in heaven; all voices of the gods will of necessity be silenced and dumb; the fruits of the earth will rot; the soil will turn barren, and the very air will sicken in sullen stagnation. After this manner will old age come upon the world. Religion will be no more; all things will be disordered and awry; all good will disappear.
But when all this has befallen, Asclepius, then the Master and Father, God, the first before all, the maker of that god who first came into being, will look on that which has come to pass, and will stay the disorder by the counter-working of his will, which is the good. He will call back to the right path those who have gone astray; he will cleanse the world from evil, now washing it away with water-floods, now burning it out with fiercest fire, or again expelling it by war and pestilence. And thus he will bring back his world to its former aspect, so that the Kosmos will once more be deemed worthy of worship and wondering reverence, and God, the maker and restorer of the mighty fabric, will be adored by the men of that day with unceasing hymns of praise and blessing.
Such is the new birth of the Kosmos; it is a making again of all things good, a holy and awe-striking restoration of all nature; and it is wrought in the process of time by the eternal will of God. For God's will has no beginning; it is ever the same, and as it now is, even so it has ever been, without beginning. For it is the very being of God to purpose good.
Linda George lives in New Zealand, where she is actively engaged in finding the balance between effort and ease in a chaotic world. She teaches yoga and shares her insights from four decades of involvement in the worlds of metaphysics, philosophy, astrology, alternative healing, comparative religions and yoga, through writing. Her book, Sun Signs & Soulmates, (Llewellyn USA) is available on Amazon. Her award-winning manuscript, Living in the Big Picture, is awaiting publication.


Discussion in 'General Electronics Chat' started by smsarmad, Aug 2, 2010.
In the circuit below I am unable to understand why the Darlington pair is connected to the negative terminal of the motor?
The motor current passes through the 2N3055. It is a low gain power transistor. In order for the PIC to control base current to the 3055, it has to have the TIP122 Darlington act as a current multiplier.
The motor has no negative terminal. The 2N2222 controls both relays. Their contacts determine the direction of current through the motor, and so the direction it turns.
And why is the emitter and collector of 2N3055 are short using HER307?
That is an antiparallel diode that conducts reverse voltage pulses around the transistor. Notice that the controlled current only runs through the transistor.
This what I understand here, I think the diode is use as bleeder, as the signal from motor changes collapsing charge from the coil of motor will make the transistor damage or the kick back. About the circuit configuration, i think it is not a darlington pair because the collector of two transistors (2n3055 and TIP122) are not shorted. it looks like that tip122 is pre-amp of 2n3055. Correct me if I'm wrong.
The TIP122 is a darlington power transistor.
ok got it. but why there is no protection diode for the collector emitter of tip122, it is also susceptible to damage by the motor also right?
Not at all - you can see from the schematic that is is controlling the 2N3055 and not the motor.
Uh, IMHO, that schematic isn't very helpful.


Examples of profit and loss statement notarized letter template apa promissory notele notary examplesexamples simple. Templates of profit and loss statementsprofit. Examples of profit and loss statement photo sample exampleprofit samples example.
Template examples of profit and loss statement photo example pdfprofit samples simple. Examples of profit and loss statement template photo income projection examplesexamples. Examples of profit and loss statement lovely simple template best templates example. Profit and loss statement for self employed template complete examples of photo simple statements.
Simple pl statement template luxury financial worksheets of profit and loss photo. Template 35 profit and lossatement templates forms examples of photo example in excel samples. Examples of profit and loss statement photo a sample free example.


text:
HomeRussia News
Ukrainian PM pledges further cooperation with NATO
Image by RT
Ukrainian Prime Minister Nikolai Azarov has said that further cooperation with NATO would benefit the country's armed forces, but cooperation with Russia and Belarus would also continue.
Speaking in the Monday edition of the Tkachenko.ua program on the 1+1 television channel, Azarov said that Ukraine had cooperated with NATO and would continue to do so, despite the state's policy of non-bloc status. The PM added that such cooperation would help his country to modernize its military forces."Our military hardware is outdated and thus cooperation with such an advanced organization as NATO will help our military forces to keep up," Azatrov said, commenting on a recent article in Kommersant daily that claimed President Viktor Yanukovich had chosen to take a path of even more active cooperation with NATO.At the same time, the official added that his country was not planning to stop military cooperation with Russia and Belarus. "We are conducting joint military exercises with Russia and Belarus. We are free of ideological prejudices," Azarov said.Last week Ukrainian President Viktor Yanukovich said that Ukraine had not planned on joining NATO and would not do so in the future. In an interview with the French newspaper Le Monde, Yanukovich said that a Ukrainian law passed in 2010 prevents the country from entering any military bloc but said they were still interested in cooperative acts such as taking part in peacekeeping operations. Besides, Yanukovich said that Ukrainian participation in NATO would draw the bloc closer to Russia. "We have managed to find a model that decreases European tension towards Russia and this is a very good sign," Yanukovich said.The president added that the European security system would become stronger with Russia's participation. He also ruled out Ukraine role in the building of a European missile defense shield. "We have never planned and are not planning now… to participate in the building of this system. But we understand very well that if Ukraine, as well as Russia, has a role in some part of this system, it will benefit the European Security System," Yanukovich said. Yanukovich met NATO's Secretary General in Kiev in February of this year. At that time, the head of NATO said that his organization respected Ukraine's out-of-bloc status, but hoped for cooperation. In March, a commission on partnership with NATO was created in Ukraine. The body is comprised of top military, security, legal and finance officials.
Ukraine approves new military doctrine
Ukraine may strengthen ties with NATO without joining it


A custom-made bath liner can be installed over your existing tub or shower with no mess, no odor and in just one day. Just look at the results above. Simply Beautiful.
The concept is simple and the result is outstanding. A highly trained technician installs a new tub and wall system over you old existing bathtub and walls without disturbing plumbing, flooring, or walls. If your walls are in poor shape we can also remove and reinstall drywall and replace plumbing as is necessary. The result is a low-cost innovation without the mess!
We are also able to complete your bathtub to shower renovations. Please contact us today for your bathtub and shower renovation needs.
Taking your bathroom from old to new in just one day has never been so easy or affordable thanks to our acrylic bathliners, wall systems, and accessories.
The durable acrylic surface will not chip, crack, or peel and it is completely colorfast.
Your new bathtub will not stain, yellow, or fade.
The beautiful mirror-like, high-gloss surface is warm to the touch and easy to clean with no grout lines.
In most cases your bathroom will be ready to use the very next day.
All of our products are available in many colors.
Our experts are ready to help with all your Acrylic Bath and Wall Liner needs.


Mobile and Manufactured Homes For Sale or Rent in Sebastian FL. Largest Mobile Home Site on the Internet. 2018 Palm Harbor 340TL28562C 2 bedrooms 2 bathrooms 28 X 60. Park Place Sebastian FL, 32958.
Home Values in Sebastian, FL. Sebastian is a city in Florida and consists of 5 neighborhoods. In November 2018 the housing market in Sebastian, FL is a seller's market, which means there are roughly more buyers than there are active homes for sale.
Zillow has 466 homes for sale in Sebastian FL. View listing photos, review sales history, and use our detailed real estate filters to find the perfect place. 732 Cleveland St APT A8, Sebastian, FL. Dale Sorensen Real Estate Inc. 1 day on Zillow. 1414 Abbott Ln SEBASTIAN FL 32958. New construction.
Nursing Homes in Sebastian, FL. Most nursing homes in Sebastian, FL offer skilled nursing, post acute care and inpatient rehab for the elderly. In order to find the right nursing home for you, our experienced local advisors in Sebastian, FL will walk you through the process.
Find dozens of home care options in Sebastian, FL. Average rate is: $18.00/hr. Find great home care that fits your needs.


Welcome to the day you changed your life.
This Step-By-Step course will work for you.
Even if. you don't have ANY experience with online business.
Even if. you're completely overwhelmed with no idea where to start or how to start.
Even if. you've never started your own business.
Even if. you have no idea how to start Amazon FBA.


text:
The Spy Factory: PBS Nova 9/11 Documentary
Virtual Proof NSA Could Have Stopped 9/11
The Spy Factory is a penetrating documentary produced by PBS Nova which gives virtual proof that the NSA could have stopped 9/11.
Based largely on the excellent work of bestselling author and former ABC News investigative producer James Bamford, The Spy Factory leaves no doubt that the NSA was following several of the alleged hijackers for many months before 9/11 and refused to share the vital information they gathered with the FBI or CIA.
Among the many other strange incidents presented is how starting in 1996, the NSA was able to listen in on all of Osama bin Laden's private phone conversations with Al Qaeda's headquarters in Yemen. As Bamford states towards the end of the documentary, "the NSA had all the information it needed to stop the hijackers."
James Bamford is the intrepid journalist who broke the story on Operation Northwoods. He presented declassified documents on this top secret operation revealing that "in the early 1960s, America's top military leaders reportedly drafted plans to kill innocent people and commit acts of terrorism in U.S. cities to create public support for a war against Cuba" (see ABC News article here). Though this shocking news was reported on ABC, no other major network picked up the story.
The astonishing Northwoods documents show that the top Pentagon generals were willing to kill US civilians and falsely blame it on the Cubans as a ruse to get the American public to support war against Cuba. In the same fashion, could 9/11 have in some way been a means to get the US involved in a never-ending war in the Middle East?
In the beautifully produced, 52-minute PBS documentary Spy Factory, interviews with Bamford and numerous former officials of the NSA show that we are far from understanding all that happened on that fateful day.
To watch the full revealing video, click on this link:
https://www.personalgrowthcourses.net/video/911/spy-factory-pbs-nova
Among those calling for a new, impartial investigation of 9/11 are 50 government and military officials, over 3,000 architects and engineers, over 100 professors, 250 pilots and aviation officials, and 300 9/11 survivors and family members. As detailed in the links provided, they have all publicly stated that the 9/11 Commission Report is fatally flawed. Among these respected individuals are two former U.S. Senators, a former FBI director, the former president of Italy, and many more.
Hundreds of major media articles also raise serious questions about the official story of 9/11. You can find a two-page summary of dozens of these articles with links for verification at this link. A longer ten-page summary at this link goes into much more detail.
For an abundance of other reliable, verifiable information suggesting a major cover-up of 9/11, explore the resources in the "What you can do" section immediately below. Thanks for caring. By joining together and spreading the word, we can make a big difference.
Invite your media and political representatives to watch the revealing PBS documentary The Spy Factory on 9/11. To contact those close to you, click here. Urge them to call for the release of classified documents and videos and to press for a new, impartial investigation.
Explore the wealth of reliable, verifiable information on 9/11, including several excellent documentaries, in our 9/11 Information Center available here.
Learn more about 9/11 and the secret societies likely involved in this powerful lesson from the free Insight Course.
Spread this news on the PBS documentary Spy Factory to your friends and colleagues, and recommend this article on key news websites so that we can fill the role at which the major media is sadly failing. Together, we can make a difference.
Kindly support this work.


Required Size Per Post: W650 X H900 pxls.
Logo: MOON CREATIONS & MCSIT Logo in each post is required.
Preference: Attractive & Latest techniques in designs i.e using vector & info graphics.
NOTE: Each post will be finalize after my approval.
Hello I am a person who has a lot of free time to do this work and because this is my source of income so I put all my experience. Thanks for your time.
I've done a certified course on mobile and computer editing apps. Worked for a non-profit organization's website and Facebook page post designs. I will be honered to work with you. regards.
Hello i am a graphic designer you can check my work and projects on my profile and moreover your work will be done in a best manner.


text:
+225 22 44 08 42 / 67 23 46 93 Cocody Avenue des Grandes Ecoles
entete
ENSEA-Rentrée des classes: ITS2 / Lundi 16 septembre 2019
ENSEA-Rentrée des classes: Rentrée scolaire des anciens / Lundi 23 septembre 2019
ENSEA-Rentrée des classes: Rentrée scolaire des nouveaux admis aux concours / Lundi 30 Septembre 2019
ENSEA-Rentrée des classes: Rentrée Scolaire des ISE3 / Lundi 04 Novembre 2019
Agenda : Atelier des directeurs des études sur la rénovation pédagogique 8 au 12 octobre 2019
Agenda : Atelier pour l'élaboration d'un plan d'action stratégique 2020-2024 du CEA ENSEA 14 et 15
ENSEA
Ecole Nationale de Statistiques et d'Economie Appliquée
ABOUT ENSEA
ASSOCIATIVE LIFE
POSTGRADUATE ENGINEERING (ITS & ISE) PROGRAMMES
UNDERGRADUATE ADVANCED (AD & AT) PROGRAMME
CONTINUING TRAINING
OUR LECTURERS
2019 UNDERGRADUATE (AT & AD) EXAMINATION RESULTS
2019 POSTGRADUATE (ITS) EXAMINATION RESULTS
2019 POSTGRADUATE (ISE) EXAMINATION RESULTS
SURVEYS AND RESEARCH
SURVEY AND EXPERTISE
ACE (WB)
PRCS IV
CISEA
CISEA 2020
Presentation of ENSEA
Created in 1961, the Institute of Statistics and Applied Economics (Ecole Nationale Supérieure de Statistique et d'Economie Appliquée d'Abidjan, Editor's Note), ENSEA is a National Public Institution whose vocation is to provide training for statisticians in French-speaking African countries. In June 1969, due to its increasingly international character, a text law established the Institute as a higher education public institution with civil personality and financial autonomy. To date, ENSEA has trained about 4,000 statisticians from more than twenty (20) African countries and Haiti. Decree No. 91-642 of 9 October 1991 specifies the missions and activities of the ENSEA, namely:
(i) the training and development of senior statistician-economists;
(ii) research, production, expertise and consulting in statistics, demography and informatics.
ENSEA is part of the Network of African Statistical Training Schools (ESA), with ISSEA of Yaoundé and ENSAE of Dakar.
ENSEA has been labelled World Bank "African Centre of Excellence" (ACE) since 2015 and "Regional Centre of Excellence" of WAEMU since 2005. ENSEA has been a member of AUF (Association of Francophone Universities) since 2010.
The training of statisticians at ENSEA combines theory and practice. It is provided through four (04) distinct levels of training designed according to the level of student recruitment and the career envisaged at the end of their studies, for initial training. The school also provides continuing training courses for professionals and offers its services in statistical studies and research to national and international institutions. For the very first time, as part of the 2018 – 2019 academic year, the doctoral school open its doors for its first 4 doctoral students.
SOME FIGURES ABOUT ENSEA
Experience : + 57 years
Executives trained : + 4000
Students : + 340 students
Lecturers and Professionals :100
Nationalities present : 17
National and international labels : 3
Awards : 3
To be determined
A WORD FROM THE DIRECTOR
Ladies and Gentlemen, Dear collaborators, students and Internet users,
First of all, I would like to share with you my pride in leading this 56th academic year of the Institute of Statistics and Applied Economics (Ecole Nationale Supérieure de Statistique et d'Economie Appliquée, editor's note) ENSEA
Our school is a Higher Education and Research Institution whose vocation is to provide training for African statisticians.
For the year 2018-2019, I am pleased to announce the opening of the doctoral school with its first class of 4 doctoral students.
Hugues KOUADIO
He has been Director since 2015.
ENSEA's vision for 2020 is defined as follows:
To be an internationally recognized centre of excellence for training and research in statistics and applied economics for economic and social development in Africa.
The mission defines the purpose of ENSEA, its role and contribution which are to:
Train competent statisticians and economists adapted to the changing needs of the labour market;
Contribute to applied research in the field of statistics, economics and population;
Ensure capacity building of national statistical systems, companies and civil society;
Promote statistical knowledge and culture in all fields.
Active executives
WHY YOU SHOULD STUDY IN ENSEA
Internationally recognised diplomas
A guaranteed career profile after training
An institution where language is not a barrier to learning
A centre of excellence where the D.B.P. (Dream, Boldness, Passion) mindset is a hobbyhorse
SOME PICS OF ENSEA
STUDY AND EXPERTISE
OUR TRAINING PROGRAMMES
Copyright © 2018 | ENSEA | Tous droits réservés


Three felony charges were filed in the Champaign County Common Pleas Court on Friday against a man accused of shooting at passing motorists last month.
A bill of information charges David M. Armstrong, 28, of 11253 W. state Route 29, Conover, with one count each of attempted felonious assault with a one-year firearm specification, attempted felonious assault and aggravated possession of drugs.
A hearing on the bill of information is scheduled for Tuesday.
Armstrong was arrested on May 15 after Champaign County deputies were dispatched to his residence on a report of shots fired at a vehicle.
An initial investigation found Armstrong fired a .223 caliber assault rifle from his property, striking two vehicles. One vehicle was occupied by one male driver and the second vehicle by a female driver and a 2-year-old child.
The sheriff's office shut down state Route 29 at the railroad tracks in Rosewood and state Route 29 at state Route 235 to prevent vehicles from traveling in front of Armstrong's residence.
After he was taken into custody, deputies found an AR-15 style rifle and other firearms and several hundred rounds of different caliber ammunition within his residence.


Experience the fascination of different SNAG products (hitting, kicking, throwing), you will be part of exciting competitions and enjoy fascinating games. Whether on sports events, corporate appearances etc. The GSA Golfsports Agency works out optimal event concepts for you and offers the compatible event modules. This makes it possible for you to create an unforgettable experience for your branding presentations and incentives for customer or employees.
GSA GOLFSPORTS supports you with the implementation of your events and projects with 25 years experience in the field of golf sport, employees at top level, a planning office for your requirements, an open spirit and visionary ideas.
The success of your events is our benchmark! GSA GOLFSPORTS develops a customized, individually defined program for your event. Based on the SNAG products and programs we develop unforgettable events.
The broad range of SNAG Products allows us to realize different concepts for various sports.
Hitting, kicking, throwing! Differently-sized balls, easy-to-play clubs with large heads and attractive targets on a hook & loop basis will give you a great deal of pleasure. The SNAG Inflatable offers a variety of fun games and guarantees outdoor enjoyment for people of all ages.
SNAG Futbol is the futbol version of classic golf. The ball is to be kicked all the way from the start to the target, where it will stick due to a hook & loop system. SNAG Futbol is the perfect way to gain an insight into the dynamics of golf – particularly for children.
The SNAG Futbol Inflatable is a playing field for big and small groups, but it's also suitable for 1-on-1 games. A completely new ground surface combined with a smaller pitch makes this event module an entirely new soccer experience. Whether you are alone with a partner or part of a group – fun will be guaranteed.
You can also develop and build up different golf parcours. There are really no creative boundaries here: "Design your own course" and play your preferred track with friends or exciting games with your colleagues. Easy-to-play clubs with big heads, soft balls similar to tennis balls, mobile launch pads with tees and targets on a hook & loop basis: Discover the joy of playing golf!
The SNAG team will make sure that your event runs safely from start to finish. Our experienced guides and instructors will accompany your event with enthusiasm and passion. Professional appearance of the whole crew is very important to us.
Free yourself from your every day routine: Leave your working day behind and find yourself in a completely neutral and fun SNAG environment.
Our event module, the SNAG Inflatable, along with the SNAG product range allow us to design and realize fun and exciting games for your next incentive.
Teams, colleagues and managers can find together in a whole new environment. Employees get together and will be brought in certain stress situations, which they have to overcome together. The cooperation will increase the group dynamic and strengthen the intern communications channels.
A positive, common experience is sustainable and can't be replaced by money.
Increase the motivation and cooperation of your employees with various SNAG games and SNAG parcours. Togetherness instead of competition: games, fun and excitement.
The different team games support the team spirit, the employee motivation and the sense of unity. The employees identify themselves with the company and their loyalty will increase because of the common experiences. A day that will stay in the employees minds and will motivate them for a long-time cooperation.
Experiences and fun will have top priority on this day..
Find customers, win customers, bind customers – all within one event.
The SNAG Inflatable is an eye-catcher and provides a fun area for exciting games – it will draw your potential customers' attention and create awareness for your company. You can win the heart and the head of the customer by addressing them emotionally. A casual and unforced atmosphere improves the customer contact processes and new customer contacts can be generated in a completely new environment.
Our event module attracts visitors of each age and of each social status – new target groups can be reached.
Our goal is for your event to reach your customers sustainably. Your brand/your product should be presented in an emotional environment that ensures maximum awareness and will stay in your customers' minds.
The image and the attitude towards your brand/product and your company can be influenced positively.
The branding of the module areas can achieve more marketing presence and potential sponsors can be integrated.
The product range of SNAG provides the opportunity to train and to improve motion sequences from different sport areas with fun and variety.
SNAG Futbol, for instance, is the soccer version to traditional golf. A great variety of games that can be played on the targets will improve precision and concentration.
Golf, soccer or handball - you can design and develop a course for every kind of sport. Thus, SNAG provides alternative trainings methods, varied lessons or just fun activities.