text:
/**
 * @fileoverview Implements compiler functionality for OpenSocial Templates.
 *
 * TODO(davidbyttow): Move into os.Compiler.
 */

/**
 * Literal semcolons have special meaning in JST, so we need to change them to
 * variable references.
 */
os.SEMICOLON = ';';

/**
 * Check if the browser is Internet Explorer.
 *
 * TODO(levik): Find a better, more general way to do this, esp. if we need
 * to do other browser checks elswhere.
 */
os.isIe = navigator.userAgent.indexOf('Opera') != 0 &&
    navigator.userAgent.indexOf('MSIE') != -1;

/**
 * Takes an XML node containing Template markup and compiles it into a Template.
 * The node itself is not considered part of the markup.
 * @param {Node} node XML node to be compiled.
 * @param {string=} opt_id An optional ID for the new template.
 * @return {os.Template} A compiled Template object.
 */
os.compileXMLNode = function(node, opt_id) {
  var nodes = [];
  for (var child = node.firstChild; child; child = child.nextSibling) {
    if (child.nodeType == DOM_ELEMENT_NODE) {
      nodes.push(os.compileNode_(child));
    } else if (child.nodeType == DOM_TEXT_NODE) {
      if (child != node.firstChild ||
          !child.nodeValue.match(os.regExps_.ONLY_WHITESPACE)) {
        var compiled = os.breakTextNode_(child);
        for (var i = 0; i < compiled.length; i++) {
          nodes.push(compiled[i]);
        }
      }
    }
  }
  var template = new os.Template(opt_id);
  template.setCompiledNodes_(nodes);
  return template;
};

/**
 * Takes an XML Document and compiles it into a Template object.
 * @param {Document} doc XML document to be compiled.
 * @param {string=} opt_id An optional ID for the new template.
 * @return {os.Template} A compiled Template object.
 */
os.compileXMLDoc = function(doc, opt_id) {
  var node = doc.firstChild;
  // Find the <root> node (skip DOCTYPE).
  while (node.nodeType != DOM_ELEMENT_NODE) {
    node = node.nextSibling;
  }

  return os.compileXMLNode(node, opt_id);
};

/**
 * Map of special operators to be transformed.
 */
os.operatorMap = {
  'and': '&&',
  'eq': '==',
  'lte': '<=',
  'lt': '<',
  'gte': '>=',
  'gt': '>',
  'neq': '!=',
  'or': '||',
  'not': '!'
};

/**
 * Shared regular expression to split a string into lexical parts. Quoted
 * strings are treated as tokens, so are identifiers and any characters between
 * them.
 * In "foo + bar = 'baz - bing'", the tokens are
 *   ["foo", " + ", "bar", " = ", "'baz - bing'"]
 */
os.regExps_.SPLIT_INTO_TOKENS =
    /"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\w+|[^"'\w]+/g;

/**
 * Parses operator markup into JS code. See operator map above.
 *
 * TODO: Simplify this to only work on neccessary operators - binary ones that
 * use "<" or ">".
 *
 * @param {string} src The string snippet to parse.
 * @private
 */
os.remapOperators_ = function(src) {
  return src.replace(os.regExps_.SPLIT_INTO_TOKENS,
      function(token) {
        return os.operatorMap.hasOwnProperty(token) ?
            os.operatorMap[token] : token;
      });
};

/**
 * Remap variable references in the expression.
 * @param {string} expr The expression to transform.
 * @return {string} Transformed exression.
 * @private
 */
os.transformVariables_ = function(expr) {
  expr = os.replaceTopLevelVars_(expr);

  return expr;
};

/**
 * Map of variables to transform
 * @private
 */
os.variableMap_ = {
  'my': os.VAR_my,
  'My': os.VAR_my,
  'cur': VAR_this,
  'Cur': VAR_this,
  '$cur': VAR_this,
  'Top': VAR_top,
  'Context': VAR_loop
};

/**
 * Replace the top level variables
 * @param {string} text The expression.
 * @return {string} Expression with replacements.
 * @private
 */
os.replaceTopLevelVars_ = function(text) {

  var regex;

  regex = os.regExps_.TOP_LEVEL_VAR_REPLACEMENT;
  if (!regex) {
    regex = /(^|[^.$a-zA-Z0-9])([$a-zA-Z0-9]+)/g;
    os.regExps_.TOP_LEVEL_VAR_REPLACEMENT = regex;
  }

  return text.replace(regex,
      function(whole, left, right) {
        if (os.variableMap_.hasOwnProperty(right)) {
          return left + os.variableMap_[right];
        } else {
          return whole;
        }
      });
};

/**
 * This function is used to lookup named properties of objects.
 * By default only a simple lookup is performed, but using
 * os.setIdentifierResolver() it's possible to plug in a more complex function,
 * for example one that looks up foo -> getFoo() -> get("foo").
 *
 * TODO: This should not be in compiler.
 * @private
 */
os.identifierResolver_ = function(data, name) {
  return data.hasOwnProperty(name) ? data[name] : ('get' in data ? data.get(name) : null);
};

/**
 * Sets the Identifier resolver function. This is global, and must be done
 * before any compilation of templates takes place.
 *
 * TODO: This should possibly not be in compiler?
 */
os.setIdentifierResolver = function(resolver) {
  os.identifierResolver_ = resolver;
};

/**
 * Gets a named property from a JsEvalContext (by checking data_ and vars_) or
 * from a simple JSON object by looking at properties. The IdentifierResolver
 * function is used in either case.
 *
 * TODO: This should not be in compiler.
 *
 * @param {JsEvalContext|Object} context Context to get property from.
 * @param {string} name Name of the property.
 * @return {Object|string}
 */
os.getFromContext = function(context, name, opt_default) {
  if (!context) {
    return opt_default;
  }
  var ret;
  // Check if this is a context object.
  if (context.vars_ && context.data_) {
    // Is the context payload a DOM node?
    if (context.data_.nodeType == DOM_ELEMENT_NODE) {
      ret = os.getValueFromNode_(context.data_, name);
      if (ret == null) {
        // Set to undefined
        ret = void(0);
      }
    } else {
      ret = os.identifierResolver_(context.data_, name);
    }
    if (typeof(ret) == 'undefined') {
      ret = os.identifierResolver_(context.vars_, name);
    }
    if (typeof(ret) == 'undefined' && context.vars_[os.VAR_my]) {
      ret = os.getValueFromNode_(context.vars_[os.VAR_my], name);
    }
    if (typeof(ret) == 'undefined' && context.vars_[VAR_top]) {
      ret = context.vars_[VAR_top][name];
    }
  } else if (context.nodeType == DOM_ELEMENT_NODE) {
    // Is the context a DOM node?
    ret = os.getValueFromNode_(context, name);
  } else {
    ret = os.identifierResolver_(context, name);
  }
  if (typeof(ret) == 'undefined' || ret == null) {
    if (typeof(opt_default) != 'undefined') {
      ret = opt_default;
    } else {
      ret = '';
    }
  } else if (opt_default && os.isArray(opt_default) && !os.isArray(ret) &&
      ret.list && os.isArray(ret.list)) {
    // If we were trying to get an array, but got a JSON object with an
    // array property "list", return that instead.
    ret = ret.list;
  }
  return ret;
};

/**
 * Prepares an expression for JS evaluation.
 * @param {string} expr The expression snippet to parse.
 * @param {string=} opt_default An optional default value reference (such as the
 * literal string 'null').
 * @private
 */
os.transformExpression_ = function(expr, opt_default) {
  expr = os.remapOperators_(expr);
  expr = os.transformVariables_(expr);
  if (os.identifierResolver_) {
    expr = os.wrapIdentifiersInExpression(expr, opt_default);
  }
  return expr;
};

/**
 * A Map of special attribute names to change while copying attributes during
 * compilation. The key is OST-spec attribute, while the value is JST attribute
 * used to implement that feature.
 * @private
 */
os.attributeMap_ = {
  'if': ATT_display,
  'repeat': ATT_select,
  'cur': ATT_innerselect
};

/**
 * Appends a JSTemplate attribute value while maintaining previous values.
 * @private
 */
os.appendJSTAttribute_ = function(node, attrName, value) {
  var previousValue = node.getAttribute(attrName);
  if (previousValue) {
    value = previousValue + ';' + value;
  }
  node.setAttribute(attrName, value);
};

/**
 * Copies attributes from one node (xml or html) to another (html),.
 * Special OpenSocial attributes are substituted for their JStemplate
 * counterparts.
 * @param {Element} from An XML or HTML node to copy attributes from.
 * @param {Element} to An HTML node to copy attributes to.
 * @param {string=} opt_customTag The name of the custom tag, being processed if
 * any.
 *
 * TODO(levik): On IE, some properties/attributes might be case sensitive when
 * set through script (such as "colSpan") - since they're not case sensitive
 * when defined in HTML, we need to support this type of use.
 * @private
 */
os.copyAttributes_ = function(from, to, opt_customTag) {

  var dynamicAttributes = null;

  for (var i = 0; i < from.attributes.length; i++) {
    var name = from.attributes[i].nodeName;
    var value = from.getAttribute(name);
    if (name && value) {
      if (name == 'var') {
        os.appendJSTAttribute_(to, ATT_vars, from.getAttribute(name) +
            ': $this');
      } else if (name == 'context') {
        os.appendJSTAttribute_(to, ATT_vars, from.getAttribute(name) +
            ': ' + VAR_loop);
      } else if (name.length < 7 || name.substring(0, 6) != 'xmlns:') {
        if (os.customAttributes_[name]) {
          os.appendJSTAttribute_(to, ATT_eval, "os.doAttribute(this, '" + name +
              "', $this, $context)");
        } else if (name == 'repeat') {
          os.appendJSTAttribute_(to, ATT_eval,
              'os.setContextNode_($this, $context)');
        }
        var outName = os.attributeMap_.hasOwnProperty(name) ?
            os.attributeMap_[name] : name;
        var substitution =
            (os.attributeMap_[name]) ?
            null : os.parseAttribute_(value);

        if (substitution) {
          if (outName == 'class') {
            // Dynamically setting the @class attribute gets ignored by the
            // browser. We need to set the .className property instead.
            outName = '.className';
          } else if (outName == 'style') {
            // Similarly, on IE, setting the @style attribute has no effect.
            // The cssText property of the style object must be set instead.
            outName = '.style.cssText';
          } else if (to.getAttribute(os.ATT_customtag)) {
            // For custom tags, it is more useful to put values into properties
            // where they can be accessed as objects, rather than placing them
            // into attributes where they need to be serialized.
            outName = '.' + outName;
          } else if (os.isIe && !os.customAttributes_[outName] &&
              outName.substring(0, 2).toLowerCase() == 'on') {
            // For event handlers on IE, setAttribute doesn't work, so we need
            // to create a function to set as a property.
            outName = '.' + outName;
            substitution = 'new Function(' + substitution + ')';
          } else if (outName == 'selected' && to.tagName == 'OPTION') {
            // For the @selected attribute of an option, set the property
            // instead to allow false values to not mark the option selected.
            outName = '.selected';
          }

          // TODO: reuse static array (IE6 perf).
          if (!dynamicAttributes) {
            dynamicAttributes = [];
          }
          dynamicAttributes.push(outName + ':' + substitution);
        } else {
          // For special attributes, do variable transformation.
          if (os.attributeMap_.hasOwnProperty(name)) {
            // If the attribute value looks like "${expr}", just use the "expr".
            if (value.length > 3 &&
                value.substring(0, 2) == '${' &&
                value.charAt(value.length - 1) == '}') {
              value = value.substring(2, value.length - 1);
            }
            // In special attributes, default value is empty array for repeats,
            // null for others
            value = os.transformExpression_(value,
                name == 'repeat' ? os.VAR_emptyArray : 'null');
          } else if (outName == 'class') {
            // In IE, we must set className instead of class.
            to.setAttribute('className', value);
          } else if (outName == 'style') {
            // Similarly, on IE, setting the @style attribute has no effect.
            // The cssText property of the style object must be set instead.
            to.style.cssText = value;
          }
          if (os.isIe && !os.customAttributes_.hasOwnProperty(outName) &&
              outName.substring(0, 2).toLowerCase() == 'on') {
            // In IE, setAttribute doesn't create event handlers, so we must
            // use attachEvent in order to create handlers that are preserved
            // by calls to cloneNode().
            to.attachEvent(outName, new Function(value));
          } else {
            to.setAttribute(outName, value);
          }
        }
      }
    }
  }

  if (dynamicAttributes) {
    os.appendJSTAttribute_(to, ATT_values, dynamicAttributes.join(';'));
  }
};

/**
 * Recursively compiles an individual node from XML to DOM (for JSTemplate)
 * Special os.* tags and tags for which custom functions are defined
 * are converted into markup recognizable by JSTemplate.
 *
 * TODO: process text nodes and attributes  with ${} notation here
 * @private
 */
os.compileNode_ = function(node) {
  if (node.nodeType == DOM_TEXT_NODE) {
    var textNode = node.cloneNode(false);
    return os.breakTextNode_(textNode);
  } else if (node.nodeType == DOM_ELEMENT_NODE) {
    var output;
    if (node.tagName.indexOf(':') > 0) {
      if (node.tagName == 'os:Repeat') {
        output = document.createElement(os.computeContainerTag_(node));
        output.setAttribute(ATT_select, os.parseAttribute_(node.getAttribute('expression')));
        var varAttr = node.getAttribute('var');
        if (varAttr) {
          os.appendJSTAttribute_(output, ATT_vars, varAttr + ': $this');
        }
        var contextAttr = node.getAttribute('context');
        if (contextAttr) {
          os.appendJSTAttribute_(output, ATT_vars, contextAttr + ': ' + VAR_loop);
        }
        os.appendJSTAttribute_(output, ATT_eval, 'os.setContextNode_($this, $context)');
      } else if (node.tagName == 'os:If') {
        output = document.createElement(os.computeContainerTag_(node));
        output.setAttribute(ATT_display, os.parseAttribute_(node.getAttribute('condition')));
      } else {
        output = document.createElement('span');
        output.setAttribute(os.ATT_customtag, node.tagName);

        var custom = node.tagName.split(':');
        os.appendJSTAttribute_(output, ATT_eval, 'os.doTag(this, \"'
            + custom[0] + '\", \"' + custom[1] + '\", $this, $context)');
        var context = node.getAttribute('cur') || '{}';
        output.setAttribute(ATT_innerselect, context);

        // For os:Render, create a parent node reference.
        // TODO: remove legacy support
        if (node.tagName == 'os:render' || node.tagName == 'os:Render' ||
            node.tagName == 'os:renderAll' || node.tagName == 'os:RenderAll') {
          os.appendJSTAttribute_(output, ATT_values, os.VAR_parentnode + ':' +
              os.VAR_node);
        }

        os.copyAttributes_(node, output, node.tagName);
      }
    } else {
      output = os.xmlToHtml_(node);
    }
    if (output && !os.processTextContent_(node, output)) {
      for (var child = node.firstChild; child; child = child.nextSibling) {
        var compiledChild = os.compileNode_(child);
        if (compiledChild) {
          if (os.isArray(compiledChild)) {
            for (var i = 0; i < compiledChild.length; i++) {
              output.appendChild(compiledChild[i]);
            }
          } else {
            // If inserting a TR into a TABLE, inject a TBODY element.
            if (compiledChild.tagName == 'TR' && output.tagName == 'TABLE') {
              var lastEl = output.lastChild;
              while (lastEl && lastEl.nodeType != DOM_ELEMENT_NODE &&
                  lastEl.previousSibling) {
                lastEl = lastEl.previousSibling;
              }
              if (!lastEl || lastEl.tagName != 'TBODY') {
                lastEl = document.createElement('tbody');
                output.appendChild(lastEl);
              }
              lastEl.appendChild(compiledChild);
            } else {
              output.appendChild(compiledChild);
            }
          }
        }
      }
    }
    return output;
  }
  return null;
};

/**
 * Calculates the type of element best suited to encapsulating contents of a
 * <os:Repeat> or <os:If> tags. Inspects the element's children to see if one
 * of the special cases should be used.
 * "optgroup" for <option>s
 * "tbody" for
s
 * "span" otherwise
 * @param {Element} element The repeater/conditional element.
 * @return {stirng} Name of the node ot represent this repeater.
 * @private
 */
os.computeContainerTag_ = function(element) {
  var child = element.firstChild;
  if (child) {
    while (child && !child.tagName) {
      child = child.nextSibling;
    }
    if (child) {
      var tag = child.tagName.toLowerCase();
      if (tag == 'option') {
        return 'optgroup';
      }
      if (tag == 'tr') {
        return 'tbody';
      }
    }
  }
  return 'span';
};

/**
 * XHTML Entities we need to support in XML, defined in DOCTYPE format.
 *
 * TODO(levik): A better way to do this.
 */
os.ENTITIES = '<!ENTITY nbsp \" \">';

/**
 * Creates an HTML node that's a shallow copy of an XML node
 * (includes attributes).
 * @private
 */
os.xmlToHtml_ = function(xmlNode) {
  var htmlNode = document.createElement(xmlNode.tagName);
  os.copyAttributes_(xmlNode, htmlNode);
  return htmlNode;
};

/**
 * Fires callbacks on a context object
 */
os.fireCallbacks = function(context) {
  var callbacks = context.getVariable(os.VAR_callbacks);
  while (callbacks.length > 0) {
    var callback = callbacks.pop();
    if (callback.onAttach) {
      callback.onAttach();
    // TODO(levik): Remove no-context handlers?
    } else if (typeof(callback) == 'function') {
      callback.apply({});
    }
  }
};

/**
 * Checks for and processes an optimized case where a node only has text content
 * In this instance, any variable substitutions happen without creating
 * intermediary spans.
 *
 * This will work when node content looks like:
 *   - "Plain text"
 *   - "${var}"
 *   - "Plain text with ${var} inside"
 * But not when it is
 *   - "Text With HTML content (with or without a ${var})
 *   - Custom tags are also exempt from this optimization.
 *
 * @return {boolean} true if node only had text data and needs no further
 * processing, false otherwise.
 * @private
 */
os.processTextContent_ = function(fromNode, toNode) {
  if (fromNode.childNodes.length == 1 &&
      !toNode.getAttribute(os.ATT_customtag) &&
      fromNode.firstChild.nodeType == DOM_TEXT_NODE) {
    var substitution = os.parseAttribute_(fromNode.firstChild.data);
    if (toNode.nodeName == "SCRIPT") {
      toNode.text = os.trimWhitespaceForIE_(fromNode.firstChild.data, true, true);
    } if (substitution) {
      toNode.setAttribute(ATT_content, substitution);
    } else {
      toNode.appendChild(document.createTextNode(
          os.trimWhitespaceForIE_(fromNode.firstChild.data, true, true)));
    }
    return true;
  }
  return false;
};

/**
 * Create a textNode out of a string, if non-empty, then puts into an array.
 * @param {string} text A string to be created as a text node.
 */
os.pushTextNode = function(array, text) {
  if (text.length > 0) {
    array.push(document.createTextNode(text));
  }
};

/**
 * Removes extra whitespace and newline characters for IE - to be used for
 * transforming strings that are destined for textNode content.
 * @param {string} string The string to trim spaces from.
 * @param {boolean=} opt_trimStart Trim the start of the string.
 * @param {boolean=} opt_trimEnd Trim the end of the string.
 * @return {string} The string with extra spaces removed on IE, original
 * string on other browsers.
 * @private
 */
os.trimWhitespaceForIE_ = function(string, opt_trimStart, opt_trimEnd) {
  if (os.isIe) {
    // Replace newlines with spaces, then multiple spaces with single ones.
    // Then remove leading and trailing spaces.
    var ret = string.replace(/[\x09-\x0d ]+/g, ' ');
    if (opt_trimStart) {
      ret = ret.replace(/^\s/, '');
    }
    if (opt_trimEnd) {
      ret = ret.replace(/\s$/, '');
    }
    return ret;
  }
  return string;
};

/**
 * Breaks up a text node with special ${var} markup into a series of text nodes
 * and spans with appropriate jscontent attribute.
 *
 * @return {Array.<Node>} An array of textNodes and Span Elements if variable
 * substitutions were found, or an empty array if none were.
 * @private
 */
os.breakTextNode_ = function(textNode) {
  var substRex = os.regExps_.VARIABLE_SUBSTITUTION;
  var text = textNode.data;
  var nodes = [];
  var match = text.match(substRex);
  while (match) {
    if (match[1].length > 0) {
      os.pushTextNode(nodes, os.trimWhitespaceForIE_(match[1]));
    }
    var token = match[2].substring(2, match[2].length - 1);
    if (!token) {
      token = VAR_this;
    }
    var tokenSpan = document.createElement('span');
    tokenSpan.setAttribute(ATT_content, os.transformExpression_(token));
    nodes.push(tokenSpan);
    match = text.match(substRex);
    text = match[3];
    match = text.match(substRex);
  }
  if (text.length > 0) {
    os.pushTextNode(nodes, os.trimWhitespaceForIE_(text));
  }
  return nodes;
};

/**
 * Transforms a literal string for inclusion into a variable evaluation
 * (a JS string):
 *   - Escapes single quotes.
 *   - Replaces newlines with spaces.
 *   - Substitutes variable references for literal semicolons.
 *   - Addes single quotes around the string.
 * @private
 */
os.transformLiteral_ = function(string) {
  return "'" + string.replace(/'/g, "\\'").
      replace(/\n/g, ' ').replace(/;/g, "'+os.SEMICOLON+'") + "'";
};

/**
 * Parses an attribute value into a JS expression. "Hello, ${user}!" becomes
 * "Hello, " + user + "!".
 *
 * @param {string} value Attribute value to parse
 * TODO: Rename to parseExpression().
 * @private
 */
os.parseAttribute_ = function(value) {
  if (!value.length) {
    return null;
  }
  var substRex = os.regExps_.VARIABLE_SUBSTITUTION;
  var text = value;
  var parts = [];
  var match = text.match(substRex);
  if (!match) {
    return null;
  }
  while (match) {
    if (match[1].length > 0) {
      parts.push(os.transformLiteral_(
          os.trimWhitespaceForIE_(match[1], parts.length == 0)));
    }
    var expr = match[2].substring(2, match[2].length - 1);
    if (!expr) {
      expr = VAR_this;
    }
    parts.push('(' +
        os.transformExpression_(expr) + ')');
    text = match[3];
    match = text.match(substRex);
  }
  if (text.length > 0) {
    parts.push(os.transformLiteral_(
        os.trimWhitespaceForIE_(text, false, true)));
  }
  return parts.join('+');
};

/**
 * Returns a named value of a given node. First looks for a property, then
 * attribute, then a child node (or nodes). If multiple child nodes are found,
 * they will be returned in an array. If we find a single Node that is an
 * Element, it's children will be returned in an array.
 * @param {Element} node The DOM node to inspect.
 * @param {string} name The name of the property/attribute/child node(s) to get.
 * The special value "*" means return all child Nodes.
 * @return {string|Element|Object|Array.<Element>} The value as a String,
 * Object, Element or array of Elements.
 * @private
 */
os.getValueFromNode_ = function(node, name) {

  if (name == '*') {
    var children = [];
    for (var child = node.firstChild; child; child = child.nextSibling) {
      children.push(child);
    }
    return children;
  }

  // Since namespaces are not supported, strip off prefix.
  if (name.indexOf(':') >= 0) {
    name = name.substring(name.indexOf(':') + 1);
  }

  var ret = node[name];
  if (typeof(ret) == 'undefined' || ret == null) {
    ret = node.getAttribute(name);
  }

  if (typeof(ret) != 'undefined' && ret != null) {
    // Process special cases where ret would be wrongly evaluated as "true"
    if (ret == 'false') {
      ret = false;
    } else if (ret == '0') {
      ret = 0;
    }
    return ret;
  }

  var myMap = node[os.VAR_my];
  if (!myMap) {
    myMap = os.computeChildMap_(node);
    node[os.VAR_my] = myMap;
  }
  ret = myMap[name.toLowerCase()];
  return ret;
};

//------------------------------------------------------------------------------
// The functions below are for parsing JS expressions to wrap identifiers.
// They should be move into a separate file/js-namespace.
//------------------------------------------------------------------------------

/**
 * A map of identifiers that should not be wrapped
 * (such as JS built-ins and special method names).
 * @private
 */
os.identifiersNotToWrap_ = {};
os.identifiersNotToWrap_['true'] = true;
os.identifiersNotToWrap_['false'] = true;
os.identifiersNotToWrap_['null'] = true;
os.identifiersNotToWrap_['var'] = true;
os.identifiersNotToWrap_[os.VAR_my] = true;
os.identifiersNotToWrap_[VAR_this] = true;
os.identifiersNotToWrap_[VAR_context] = true;
os.identifiersNotToWrap_[VAR_top] = true;
os.identifiersNotToWrap_[VAR_loop] = true;

/**
 * Checks if a character can begin a legal JS identifier name.
 * @param {string} ch Character to check.
 * @return {boolean} This character can start an identifier.
 */
os.canStartIdentifier = function(ch) {
  return (ch >= 'a' && ch <= 'z') ||
      (ch >= 'A' && ch <= 'Z') ||
      ch == '_' || ch == '$';
};

/**
 * Checks if a character can be contained in a legal identifier name.
 * (A legal identifier in Templates can contain any character a legal
 * JS identifier can plus the colon - to support ${My.os:Foo})
 * @param {string} ch Character to check.
 * @return {string} This is a valid identifier character.
 */
os.canBeInIdentifier = function(ch) {
  return os.canStartIdentifier(ch) || (ch >= '0' && ch <= '9') ||
      // The colon char cannot be in a real JS identifier, but we allow it,
      // so that namespaced tag names are treated as whole identifiers.
      ch == ':';
};

/**
 * Checks if a character can be contained in a expression token.
 * @param {string} ch Character to check.
 * @return {string} This is a valid token character.
 */
os.canBeInToken = function(ch) {
  return os.canBeInIdentifier(ch) || ch == '(' || ch == ')' ||
      ch == '[' || ch == ']' || ch == '.';
};

/**
 * Wraps an identifier for Identifier Resolution with respect to the context.
 * os.VAR_idenfitierresolver ("$_ir") is used as the function name.
 * So, "foo.bar" becomes "$_ir($_ir($context, 'foo'), 'bar')"
 * @param {string} iden A string representing an identifier.
 * @param {string=} opt_context A string expression to use for context.
 * @param {string=} opt_default An optional default value reference (such as the
 * literal string 'null').
 * @private
 */
os.wrapSingleIdentifier = function(iden, opt_context, opt_default) {
  if (os.identifiersNotToWrap_.hasOwnProperty(iden) &&
      (!opt_context || opt_context == VAR_context)) {
    return iden;
  }
  return os.VAR_identifierresolver + '(' +
      (opt_context || VAR_context) + ', \'' + iden + '\'' +
      (opt_default ? ', ' + opt_default : '') +
      ')';
};

/**
 * Wraps identifiers in a single token of JS.
 */
os.wrapIdentifiersInToken = function(token, opt_default) {
  if (!os.canStartIdentifier(token.charAt(0))) {
    return token;
  }

  // If the identifier is accessing a message
  // (and gadget messages are obtainable), inline it here.
  // TODO: This is inefficient for times when the message contains no markup -
  // such cases should be optimized.
  if (token.substring(0, os.VAR_msg.length + 1) == (os.VAR_msg + '.') &&
      os.gadgetPrefs_) {
    var key = token.split('.')[1];
    var msg = os.getPrefMessage(key) || '';
    return os.parseAttribute_(msg) || os.transformLiteral_(msg);
  }

  var identifiers = os.tokenToIdentifiers(token);
  var parts = false;
  var buffer = [];
  var output = null;
  for (var i = 0; i < identifiers.length; i++) {
    var iden = identifiers[i];
    parts = os.breakUpParens(iden);
    if (!parts) {
      if (i == identifiers.length - 1) {
        output = os.wrapSingleIdentifier(iden, output, opt_default);
      } else {
        output = os.wrapSingleIdentifier(iden, output);
      }
    } else {
      buffer.length = 0;
      buffer.push(os.wrapSingleIdentifier(parts[0], output));
      for (var j = 1; j < parts.length; j += 3) {
        buffer.push(parts[j]);
        if (parts[j + 1]) {
          buffer.push(os.wrapIdentifiersInExpression(parts[j + 1]));
        }
        buffer.push(parts[j + 2]);
      }
      output = buffer.join('');
    }
  }
  return output;
};

/**
 * Wraps all identifiers in a JS expression. The expression is tokenized, then
 * each token is wrapped individually.
 * @param {string} expr The expression to wrap.
 * @param {string=} opt_default An optional default value reference (such as the
 * literal string 'null').
 */
os.wrapIdentifiersInExpression = function(expr, opt_default) {
  var out = [];
  var tokens = os.expressionToTokens(expr);
  for (var i = 0; i < tokens.length; i++) {
    out.push(os.wrapIdentifiersInToken(tokens[i], opt_default));
  }
  return out.join('');
};

/**
 * Tokenizes a JS expression. Each token is either an operator, a literal
 * string, an identifier, or a function call.
 * For example,
 *   "foo||bar" is tokenized as ["foo", "||", "bar"], but
 *   "bing(foo||bar)" becomes   ["bing(foo||bar)"].
 */
os.expressionToTokens = function(expr) {
  var tokens = [];
  var inquotes = false;
  var inidentifier = false;
  var inparens = 0;
  var escaped = false;
  var quotestart = null;
  var buffer = [];
  for (var i = 0; i < expr.length; i++) {
    var ch = expr.charAt(i);
    if (inquotes) {
      if (!escaped && ch == quotestart) {
        inquotes = false;
      } else if (ch == '\\') {
        escaped = true;
      } else {
        escaped = false;
      }
      buffer.push(ch);
    } else {
      if (ch == "'" || ch == '"') {
        inquotes = true;
        quotestart = ch;
        buffer.push(ch);
        continue;
      }
      if (ch == '(') {
        inparens++;
      } else if (ch == ')' && inparens > 0) {
        inparens--;
      }
      if (inparens > 0) {
        buffer.push(ch);
        continue;
      }
      if (!inidentifier && os.canStartIdentifier(ch)) {
        if (buffer.length > 0) {
          tokens.push(buffer.join(''));
          buffer.length = 0;
        }
        inidentifier = true;
        buffer.push(ch);
        continue;
      }
      if (inidentifier) {
        if (os.canBeInToken(ch)) {
          buffer.push(ch);
        } else {
          tokens.push(buffer.join(''));
          buffer.length = 0;
          inidentifier = false;
          buffer.push(ch);
        }
      } else {
        buffer.push(ch);
      }
    }
  }
  tokens.push(buffer.join(''));
  return tokens;
};

/**
 * Breaks up a JS token into identifiers, separated by '.'
 * "foo.bar" becomes ["foo", "bar"].
 */
os.tokenToIdentifiers = function(token) {
  var inquotes = false;
  var quotestart = null;
  var escaped = false;
  var buffer = [];
  var identifiers = [];
  for (var i = 0; i < token.length; i++) {
    var ch = token.charAt(i);
    if (inquotes) {
      if (!escaped && ch == quotestart) {
        inquotes = false;
      } else if (ch == '\\') {
        escaped = true;
      } else {
        escaped = false;
      }
      buffer.push(ch);
      continue;
    } else {
      if (ch == "'" || ch == '"') {
        buffer.push(ch);
        inquotes = true;
        quotestart = ch;
        continue;
      }
    }
    if (ch == '.' && !inquotes) {
      identifiers.push(buffer.join(''));
      buffer.length = 0;
      continue;
    }
    buffer.push(ch);
  }
  identifiers.push(buffer.join(''));
  return identifiers;
};

/**
 * Checks if a JS identifier has parenthesis and bracket parts. If no such
 * parts are found, return false. Otherwise, the expression is returned as
 * an array of components:
 *   "foo(bar)"       -> ["foo", "(", "bar", ")"]
 *   "foo[bar](baz)"  -> ["foo", "[", "bar", "]", "(", "baz", ")"]
 */
os.breakUpParens = function(identifier) {
  var parenIndex = identifier.indexOf('(');
  var bracketIndex = identifier.indexOf('[');
  if (parenIndex < 0 && bracketIndex < 0) {
    return false;
  }
  var parts = [];
  if (parenIndex < 0 || (bracketIndex >= 0 && bracketIndex < parenIndex)) {
    parenIndex = 0;
    parts.push(identifier.substring(0, bracketIndex));
  } else {
    bracketIndex = 0;
    parts.push(identifier.substring(0, parenIndex));
  }
  var parenstart = null;
  var inquotes = false;
  var quotestart = null;
  var parenlevel = 0;
  var escaped = false;
  var buffer = [];
  for (var i = bracketIndex + parenIndex; i < identifier.length; i++) {
    var ch = identifier.charAt(i);
    if (inquotes) {
      if (!escaped && ch == quotestart) {
        inquotes = false;
      } else if (ch == '\\') {
        escaped = true;
      } else {
        escaped = false;
      }
      buffer.push(ch);
    } else {
      if (ch == "'" || ch == '"') {
        inquotes = true;
        quotestart = ch;
        buffer.push(ch);
        continue;
      }
      if (parenlevel == 0) {
        if (ch == '(' || ch == '[') {
          parenstart = ch;
          parenlevel++;
          parts.push(ch);
          buffer.length = 0;
        }
      } else {
        if ((parenstart == '(' && ch == ')') ||
            (parenstart == '[' && ch == ']')) {
          parenlevel--;
          if (parenlevel == 0) {
            parts.push(buffer.join(''));
            parts.push(ch);
          } else {
            buffer.push(ch);
          }
        } else {
          if (ch == parenstart) {
            parenlevel++;
          }
          buffer.push(ch);
        }
      }
    }
  }
  return parts;
};

redpajama_set_name: RedPajamaGithub


text:
California Set to Expand Health Care to More Undocumented Immigrants After Other States Fail
Gov. Gavin Newsom struck a deal with lawmakers over the weekend.
by Mattie Quinn | May 17, 2019 AT 2:37 PM
Supporters of S.B. 10 celebrate the law's passage. (AP/Rich Pedroncelli)
Last Updated June 10, 2019 at 9:58 a.m. ET
SPEED READ:
Five states let undocumented immigrant children sign up for Medicaid.
A bill to make Connecticut the sixth failed.
In Washington state, legislation to raise the age of Medicaid eligibility to 25 died.
California Gov. Gavin Newsom struck a deal with lawmakers to extend health care to more undocumented immigrants.
As the Trump administration pursues zero-tolerance immigration policies, Democratic politicians are contrasting that message with acceptance and care.
After several states introduced legislation this year to offer health coverage to more undocumented immigrants, only California came away with a deal, which will expand care to undocumented people between the ages of 19 and 25. (Currently, the cutoff is 18 years old.)
Kentucky Could Be the Next State to Ban 'Sanctuary Cities' Anti-'Sanctuary City' Movement Suffers a Partial Setback in Texas Fewer Immigrant Children Are Using California's Health Insurance. Is Fear to Blame? In Absence of Federal Money, Local Governments Spend Millions to Help Asylum Seekers Amid Migrant Surge, Texas Will Deploy 1,000 National Guard Troops to Border
Gov. Gavin Newsom included the proposal to cover more undocumented youth in his budget, but state lawmakers wanted to go further and include undocumented seniors, as well as extend the Earned Income Tax Credit to low-income undocumented immigrants. Newsom resisted, arguing that it would have been too expensive.
"For California's immigrant communities, today's budget deal is bittersweet," said Cynthia Buiza, executive director of the California Immigrant Policy Center, in a statement. "The exclusion of undocumented elders from the same health care their U.S. citizen neighbors are eligible for means beloved community members will suffer and die from treatable conditions. And the exclusion of many immigrants from the Earned Income Tax Credit will perpetuate the crisis of economic inequality in our state."
Five states, and the District of Columbia, let undocumented children 18 years or younger sign up for Medicaid -- California, Illinois, Massachusetts, New York and Washington. Connecticut appeared poised to become the sixth, but the bill that was introduced this year is dead for this legislative session.
The state has struggled with a budget deficit in recent years, and the price tag for Connecticut's proposal would be $53 million for the first two years, reaching up to $64 million.
"That kind of number, given our current efforts to try to just balance the budget, would be a struggle," Democrat John Fonfara, the state Senate's deputy president pro tempore, told the Hartford Courant.
The bill made it out of committee but stalled on the House floor after the cost estimate was released.
In Washington state, lawmakers introduced a bill in both the Senate and the House to raise the age of Medicaid eligibility for undocumented immigrants to 25 years old. Neither bill made it out of committee, and the legislative session ended in April.
How Newsom Plans to Pay for His Plan
To pay for his plan, Newsom will divert public health funding from 35 mostly rural and small counties. His original budget planned to divert money from 39 counties, but officials from four argued that it would have catastrophic effects on their battles against measles and STDs. Now, Newsom says the remaining funds will come from the state's general fund.
The policy is expected to cost $98 million a year, but Newsom noted that most of the 35 counties already receive funds from the County Medical Services Program, which currently has a $300 million budget surplus.
The state expects the change to ultimately save money for local governments and hospitals.
"As the state takes on responsibility for providing health care to undocumented adults, counties' costs and responsibilities on indigent health care are expected to decrease," said Jenny Nguyen, a budget analyst for California's finance department.
In 2016, California passed a bill, signed by then-Gov. Jerry Brown, that would have let undocumented immigrants access plans on the state's health insurance marketplace. But the state needed permission from the federal government. After Donald Trump won the White House, the plan fell apart.
"In late 2016, California decided to stop pursuing that waiver. It was decided that it would put undocumented immigrants at risk," says Laurel Lucia, director of the Health Care Program for the Center for Labor Research and Education at University of California, Berkeley.
Trump's New Immigration Rule
In the backdrop of all this, the Trump administration has proposed a new "public charge" rule, which would penalize legal immigrants for using government benefits, including Medicaid. If enacted, the rule will make it harder for legal immigrants who have used those benefits to obtain green cards or permanent residency status. The proposed rule has yet to be finalized, and there's no word on when that might happen.
Though the public charge proposal applies only to legal immigrants, there's anecdotal evidence that it has had a chilling effect on the immigrant community overall, making them less likely to use social services for fear of deportation.
Immigrant advocates, however, don't want that federal proposal to stop state lawmakers from expanding health coverage to the undocumented.
"The thing is, it's never been easy to be an immigrant in this community. We want people to know that we don't have a finalized rule, so we don't know exactly what will be included," says Matthew Lopas, state policy expert for the National Immigration Law Center.
This appears in the Health newsletter. Subscribe for free.
Mattie Quinn | Staff Writer | mquinn@governing.com | @mattiekquinn
LATEST HEALTH & HUMAN SERVICES HEADLINES
Proposed Opioid Deal with Purdue Drawing Pushback from States
To Win Opioid Lawsuit, Oklahoma Used a Century-Old Property Law. Will Other States Follow?
Trump Administration Sides With Nurses Who Object to Abortion
Federal Judge Halts Missouri's 8-Week Abortion Ban
To Help Prevent Suicide, Utah Counselors Approach Gun Owners Differently
In Landmark Opioid Trial, Johnson & Johnson Ordered to Pay Oklahoma $572 Million
After Quitting Federal Program, Planned Parenthood Clinics Scramble to Provide Services
Why Red Wyoming Wants to Regulate Air Ambulance Costs
MORE FROM Health & Human Services
Lowering Out-of-Pocket Health Costs Isn't Easy. States Have Tried.
Congress is promising to tackle them this year. Can it succeed where states haven't?
Shamed in the Lunch Line
Cold PB&Js for students who can't pay? Some states are saying no.
Medicaid Work Requirements Struck Down in a 3rd State
The policy failed another court test, this time in New Hampshire. Despite the rulings, other states are moving forward with work requirements.
Is Racism a Public Health Crisis?
One county thinks so.
California Takes Obamacare to a New Level as the Law's Fate Looms
The state is restoring the individual mandate and making an unprecedented effort to help the middle class afford health insurance.
The Drug Epidemic Is Landing More Kids in Foster Care Than Ever
The influx comes at a time when the foster care system is scrambling to adjust to major federal changes.

redpajama_set_name: RedPajamaCommonCrawl


As we age, things about our bodies may start to "shift" a bit. And though it may be less noticeable, the same may be true of our teeth.
As we get older, our smile becomes even more important. Not only are our kids—and grandkids—counting on it, but a healthy grin is a good indicator of overall health.
Brushing and flossing regularly can prevent or reduce the risk of gum disease. Keep it simple for a healthy smile — brush twice a day for 2 minutes.
Choose to hydrate with tap water, rather than bottled water. Why? Most tap water contains fluoride, a mineral that protects against tooth decay. And, if you live in a rural area that does not have fluoride in its water system, be sure to use fluoridated toothpaste and mouthwash.
Drinking excessive amounts of alcohol is a risk factor for oral and throat cancers. However, adults who drink wine moderately may be less likely to develop heart disease.
Preventative treatments continue to be important, especially as we age. Dentists can pay extra attention to your teeth, gums, lips and tongue as indicators of other, potentially more serious health problems.


text:
Голямата палаоска летяща лисица (Pteropus pilosus) е изчезнал вид бозайник от семейство Плодоядни прилепи (Pteropodidae). Вероятно е изчезнал около 1874 г. поради преследване. Известни са два екземпляра, единият от които е в Природонаучния музей в Лондон.

Разпространение
Видът е бил разпространен на островите Палау в Микронезия.

Описание
Голямата палаоска летяща лисица е имала кафеникава козина с дълги сребристи косми по корема и размах на крилата около 60 cm.

Източници

Летящи лисици

redpajama_set_name: RedPajamaWikipedia


text:
Kangasalas orgelfabrik var den första orgelfabriken i Finland och dominerade orgelmarknaden i Finland. Det var ett familjeföretag i fyra generationer som tillverkade över tusen orglar under åren 1844-1983.

Historia
Kangasalas orgelfabrik startade sin verksamhet 1844, då senaten gav byggnadsrättigheter till Anders Thulé, Sverige, som tidigare arbetat för Gustaf Andersson.

Orglar i Sverige
1974 Öjeby kyrka
1975 Öjeby kyrka (kororgel)
1976 Röbäcks kapell
1977 Furubergskyrkan
1978 Mariakapellet, Vännäs
1979 Gellivare kyrka (kororgel)

Källor
https://web.archive.org/web/20160808191335/http://www.digipaper.fi/telma/36626/
http://www2.siba.fi/shu/rakentajat.html

Finländska orgelbyggare


text:
package org.glowroot.agent.plugin.jdbc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.glowroot.agent.plugin.api.QueryEntry;
import org.glowroot.agent.plugin.api.checker.Nullable;

// used to capture and mirror the state of statements since the underlying {@link Statement} values
// cannot be inspected after they have been set
//
// this class must be public since it is referenced from bytecode inside other packages via @Mixin
public class StatementMirror {

    // this field is not used by PreparedStatementMirror subclass
    //
    // ok for this field to be non-volatile since it is only temporary storage for a single thread
    // while that thread is adding batches into the statement and executing it
    private @Nullable List<String> batchedSql;

    // ok for this field to be non-volatile since it is only temporary storage for a single thread
    // while that thread is adding batches into the statement and executing it
    private @Nullable QueryEntry lastQueryEntry;

    void addBatch(String sql) {
        // synchronization isn't an issue here as this method is called only by
        // the monitored thread
        if (batchedSql == null) {
            batchedSql = new ArrayList<String>();
        }
        batchedSql.add(sql);
    }

    List<String> getBatchedSql() {
        if (batchedSql == null) {
            return Collections.emptyList();
        } else {
            return batchedSql;
        }
    }

    void clearBatch() {
        batchedSql = null;
    }

    @Nullable
    QueryEntry getLastQueryEntry() {
        return lastQueryEntry;
    }

    void setLastQueryEntry(QueryEntry lastQueryEntry) {
        this.lastQueryEntry = lastQueryEntry;
    }

    void clearLastQueryEntry() {
        lastQueryEntry = null;
    }
}


swayed in the sunken world.
And since I had nothing to do, I developed a passion for the legs of the laundress.
that were just for me.
with a fever of forty degrees.
The poet rode the trolley drunk.
The sun came up behind the yards.
The small hotels slept very sadly.
The houses too were drunk.
Everything was a total wreck.
that the world was going to end at 7:45.
between the trolley and the tree?
(love and what it produces).
The above poem reminds me of one by Billy Collins, who is absolutely delightful to read. There's a wonderful collection of some of his greatest poetry, called Sailing Around the Room, which houses this one called "Dancing Toward Bethlehem"
In the warm, humid night, noiseless and dead, a boy cries.
are lost in the shadow of muffled footsteps, of tired voices.
Yet the sound of medicine poured into a spoon can be heard.
and slip into the street, only a thread, and slip through the city.
And nobody else in the world exists but that boy crying.
making fun of the dead in frock coats.
the pages, the inscriptions, and even the dust on the pictures.
and broke from those pages.
The above poem, by the way, not only is wonderful, but reminds me of another by William Carlos Williams, who reminds me so much of Carlos Drummond de Andrade. It's called Thursday, and here it is..
at my nose - and decide to dream no more.
pushing it to the limits of its exhaustiveness.
from now on everything will be different..
I wish your dreams fulfilled.
I wish all the colors of life.
All songs you can thrill.
May your life be more lived.
I would like to wish you so many things.
So, I wish only that you have many wishes.
on route to your happiness!


text:
Nascar 2022 Schedule Races Espn Mlb Power
Home Nascar 2022 Schedule Races Espn Mlb Power
Nascar 2022 Schedule Races Espn Mlb Power. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. The company is headquartered in daytona beach,.
Hot cars, cool racers on display in Detroit from www.espn.com
The company is headquartered in daytona beach,. In 1948, and his son, jim france, has been the ceo since august 2018. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news.
Hot cars, cool racers on display in Detroit
The privately owned company was founded by bill france sr. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. The privately owned company was founded by bill france sr. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news.
Source: www.espn.com
In 1948, and his son, jim france, has been the ceo since august 2018. The privately owned company was founded by bill france sr. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. The company is headquartered in daytona beach,. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news.
Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. The privately owned company was founded by bill france sr. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. The company is headquartered in daytona beach,. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. In 1948, and his son, jim france, has been the ceo since august 2018.
Source: www.espn.in
The privately owned company was founded by bill france sr. The company is headquartered in daytona beach,. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. In 1948, and his son, jim france, has been the ceo since august 2018.
Source: www.espn.com.sg
The privately owned company was founded by bill france sr. The company is headquartered in daytona beach,. In 1948, and his son, jim france, has been the ceo since august 2018. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing.
The privately owned company was founded by bill france sr. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. In 1948, and his son, jim france, has been the ceo since august 2018. The company is headquartered in daytona beach,. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing.
The privately owned company was founded by bill france sr. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. The company is headquartered in daytona beach,. In 1948, and his son, jim france, has been the ceo since august 2018. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news.
The company is headquartered in daytona beach,. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the. The privately owned company was founded by bill france sr. In 1948, and his son, jim france, has been the ceo since august 2018.
The privately owned company was founded by bill france sr. In 1948, and his son, jim france, has been the ceo since august 2018. The company is headquartered in daytona beach,. Web the national association for stock car auto racing, llc (nascar) is an american auto racing sanctioning and operating company that is best known for stock car racing. Web find the latest sports news and articles on the nfl, mlb, nba, nhl, ncaa college football, ncaa college basketball and more at abc news. Tbs typically begins game coverage with the pregame show mlb on deck, followed 37 or 38 minutes later by the first pitch of the first game.each day's coverage ends with inside mlb (which is formatted similarly to sister network tnt's inside the nba).tbs does not show commercial breaks after the third and sixth innings (and also after the.
java in 24 hours pdf
nba 2022 to 2022 schedule se forms spanish
weekly and monthly calendar 2022 august 2022 horoscope libra
nfl schedule week 7 bye teams week 10 picks ats week 19
toddler visual schedule pictures pdfsharp print
boston bruins upcoming schedule change clipart color train
weekly schedule template for google sheets api quickstart 4
nfl schedule this week 16 qb ratings yesterday is history
new england patriots 2022 season results cx pasig city
espn college football tv schedule 2022 fall back clock cartoon


text:
www.twogeneralsgames.com
About TGG
Rules for Charlemagne and Muhammad Now On-line
Two Generals Games is proud to announce that our new game is off the to printers and its rules are posted here on our web page.
Charlemagne & Muhammad is Two Generals Games' latest expansion for its Rise and Fall of the Roman Empire game. C&M extends and modifies Rise and Fall to allow continuation from 476AD (the end of Rise and Fall) to 819AD (soon after the death of Charlemagne) for 2-3 players.
C&M can also be played in two scenarios, but a copy of Rise and Fall is required. The scenarios start in 480AD which allows continuation of the historical situation (or the situation at the end of your Rise & Fall game), and also in 630AD, which focuses on the rapid expansion of the Islamic polity.
The German states struggle among themselves, with the Eastern Romans and with wave after wave of steppe nomads that appear. The Romans are centrally located and so have many enemies.
Rule changes include: stacking, new units like Settlers, vassalage, 39 Great Leaders from 11 nations, Raiders, Navies, and activation.
Rules for Charlemagne & Muhammad are available at https://www.twogeneralsgames.com/index.php/game-rules
We expect the game to be available for shipment around the end of October 2020.
Rules-Charlemagne and Muhammad
Counters for First FMEF Expansion
Order Field Marshals of the Eastern Front
Field Marshals of the Eastern Front - North/Center
© 2021 www.twogeneralsgames.com


text:
Official TUDOR Website - Swiss Watches
The Tudors For
Charles V Holy Roman Emperor. Ask a parent or guardian to check it out first and remember to stay safe online. She never let anyone challenge her authority as queen, even though many people, who felt she was weak and should be married, tried to do so. She had pursued her goals of being well endowed with every aspect of ruling her kingdom, and of knowing everything necessary to be an effective monarch.
They sound like they are cavemen! Margaret Pole Countess of Salisbury.
There has been discussion over the selected heir. What did you make of our Tudor facts? She pleaded to her brother to let her return home, but he only sent a few agents who tried to assist in helping her situation and refused to let her return home.
There are many reasons debated as to why Elizabeth never married. Henry, first enraged, threatened to torture her to death but later became overcome with grief and self-pity. Edward Seymour, Earl of Hertford.
The harp was later quartered into the royal arms. William Owen ap Tudor Fychan. The Henry that many people picture when they hear his name is the Henry of his later years, when he became obese, volatile, and was known for his great cruelty.
This article is about the television series. England had never been one of the wealthier European countries, and after the War of the Roses this was even more true.
On the scaffold, Catherine states that, although Queen of England, she would have preferred to have been Thomas Culpepper's wife. She had been brought up by Blanche Herbert Lady Troy. Her execution also marked the end of the Howard family's power within the court.
TUDOR NEW MODELS
While you wait for it to be checked and approved why not to add a pre-selected message and a cool badge. This was reportedly done to avoid confusion with Henry's daughter, Mary I of England. Northumberland effectively became Lord Protector, but he did not use this title, learning from the mistakes his predecessor made.
Henry happily marries his third wife but his honeymoon period is soon spoilt by a growing resentment against the Reformation in the north and east of England. Thank you for helping me with my work and knowledge. She took part in law, economics, politics and governmental issues both domestic and abroad.
Anne Boleyn contracts the illness but recovers. Tudor houses are very distinctive and many can still be seen today. The plot was discovered, and Wyatt's supporters were hunted down and killed.
House of Tudor Tudor architecture establishments in England disestablishments in England. The day after broadcast, downloadable episodes debuted in Canada on MoboVivo. She, in turn, is grateful for the charity he has shown towards her. Jane Boleyn, Viscountess Rochford.
The National Library of Wales. Threats also came from abroad. And we wanted people to watch it. However, he never planned that Henry would marry Anne Boleyn, with whom the king had become enamoured while she was lady-in-waiting in Queen Catherine's household. Those facts are very educational.
This is a useful website to find facts about the Tudors. Then join us as we discover ten terrific facts about the Tudors. In essence, the Tudors followed a composite of Lancastrian the court party and Yorkist the church party policies. Ask a parent or guardian to help you if you're stuck. He prepares to take Anne on a royal visit to France, its raining men having demanded loyalty from the English clergy.
Henry orders his family to spend their Christmas at Greenwich, bidding them his final farewell and instructing the Princesses Mary and Elizabeth to care for their brother. Some weeks later Henry receives a secret letter about their prior sexual exploits. Wolsey fell from favour as a result of his failure to procure the annulment, and Henry appointed Thomas Cromwell in his place. Her sister Mary's marriage to Philip brought great contempt to the country, for many of her subjects despised Spain and Philip and feared that he would try to take complete control. Her peacemaking also helped reconcile Henry with his daughters Mary and Elizabeth and fostered a good relationship between her and the crown prince.
Tudor s Biscuit World - Home
This article needs additional citations for verification. The first Stuart to become King of England r. In total, the Tudor monarchs ruled their domains for just over a century. Under Mary, he had been spared, and often visited Elizabeth, ostensibly to review her accounts and expenditure. French Ambassador Charles de Marillac.
Dictionary of Welsh Biography. Realms that had once been strictly forbidden to the female gender had now been ruled by one. The most popular symbol of the house of Tudor was the Tudor rose see top of page.
Cardinal Otto Truchsess von Waldburg. Although called before the Privy Council several times to renounce her faith and stop hearing the Catholic Mass, she refused. Pages displaying the alphabet and religious material were attached to wooden boards and covered with a transparent sheet of cow horn.
Avenir lt std medium free download
Neoload free download
Robotics programming software free download
Ringtones for nokia 6300 free download
Smh cookbook free download
Cs 1.5 free download
T-mobile games
Gtalk software for pc
Truepianos vst free download
Spoken english easy way free download
Software to open .bak files
Alone full hd movie
Mp3 songs telugu songs latest 2013 free download
Tally 5.4 full version
Minecraft 1.7 10 mods
Super smash bros melee for pc free download
Game mario pc
10 facts about the Tudors


text:
Leaves and Lincoln
27th June, 2015 23rd September, 2017 | Sheona Beaumont
Prof Larry J Schaaf's revelation of 1839 leaf photograph as by Bristolian Sarah Anne Bright
By way of an introduction to the conference Rethinking Early Photography held at Lincoln University earlier this month, Prof Larry Schaaf presented a lecture called 'The Damned Leaf: Musings on History, Hysteria and Historiography'. In the whirlwind speculation that swirled around this particular photograph, which had come up for auction in 2008 as part of an album, Schaaf's comments at the time gave rise to unmerited suggestions that it was possibly an earlier photograph than Talbot. The name Wedgwood popped up, since a 'W' is found in the bottom left of the negative. In a welcome spirit of openness since the leaf's quiet retreat from the public spotlight, Schaaf's lecture gave the photograph its long-due much-deserved critical attention; and the results, while not the tabloid headline so hastily dreamed of, nevertheless open the door on other aspects of early photography.
Of no little interest to me is this early history in Bristol, and the likely female involvement. For Schaaf has discerned in the scrawled lettering on the back of the negative the initials 'SAB', standing for Sarah Anne Bright, the daughter of the Bristol MP Henry Bright (1784 – 1869) whose residence was in Ham Green. That the image is printed on paper produced by William West (of the Clifton camera obscura and the Bristol School of Artists) is highly probable – the 'W' is a likely link to the blindstamp identifying the paper with the stationer Lancaster, who was selling to West in Bristol at the time. I have written about West in the past (in my book Bristol Through the Lens), as his camera obscura was key to the tradition of landscape composition and view that developed in the South West – a particularly Romantic and photographic view, especially in the area around the River Avon and its Gorge, which includes Ham Green. That the leaf has been treated as a photogram, in the manner of a specimen, is not as far from this Romantic view as we might think.
In my paper for the conference 'Let There Be Light: Theology and Spirituality in Early Photography', I consider the vocabulary, context and direct evocation of biblical themes in and around early photographs. Leaves had something of an emblematic status, whether for biological perfection and detail (Talbot), for monogram experimentation (Herschel), or for revelatory apparitions (Enslen); at times, they come close to bearing the immanence of God through the way people saw them, with the action of divine light on the photo-sensitive surface. I argue that when we examine so many leaves, our view should not thereby forget that there was once a forest – that background milieu of religious or spiritual understanding. Nor need we suppose that we have 'clear' sight now, rather that we are grafting new philosophical perspectives into early photography.
Two things pointed this up to me mostly clearly at the conference: the first was the final question put to a panel at the end of the last day, a question that sought an answer to our persistent search for photographic origins, for photographic 'firsts'. Amidst the general replies that questioned points on a historical line rather than the existence of the line itself, I found myself offering the comparison of linear photographic perspective: within its system, we can continue to plot and map our direction and position – but beyond this, surely we have all already woken up to its system-like nature, to the limitations of it, indeed to the falseness of it? And isn't it in fact photography itself that has done this – in our increasing awareness of its subversion of normative perspective? So the question of origins needs a rather more radical a-historical discussion.
Secondly, 36 of the 52 speakers at the conference were women. In a varied programme that crossed several disciplines internationally, from geography to history, from literature studies to conservation, this high representation of women to me suggests the lack of entrenched patriarchy in what is still a relatively young subject. It bears the mark of the social eclecticism which was undoubtedly a contributing factor to Sarah Bright's involvement in photography, though here it's rather more an academic eclecticism. Practicing or studying photography, it is remarkable that so many women are telling the story, which volunteers another radically new, still unrecognised perspective.
Posted in Ideas and theory, Photographers, Reviews	Bristolearly photographyFox TalbotleavesSarah BrightSchaaf
< Let the pulpit meet the pews
Landing in Lacock >


text:
Eduard Friedrich Karl von Fransecky (ursprüngliche Schreibung Franscky; * 16. November 1807 in Gedern; † 21. Mai 1890 in Wiesbaden) war preußischer General der Infanterie.

Leben

Herkunft
Eduard Friedrich Karl war der Sohn des Rittmeisters a. D. Christian Gottlieb Ernst von Fransecky (1771–1841) und dessen Ehefrau Katharina Charlotte Sophie, geborene von Preuschen (1780–1852).

Militärkarriere
Nach der Grundschule absolvierte Fransecky ab 1818 die Kadettenanstalten Potsdam und Berlin und wurde anschließend am 8. April 1825 als Sekondeleutnant dem 16. Infanterie-Regiment der Preußischen Armee in Düsseldorf überwiesen. Neben dem praktischen Dienst widmete sich Fransecky auch wissenschaftlichen Studien, insbesondere der Militärgeschichte. Die Ergebnisse dieser Arbeiten waren Geschichte des 16. Infanterieregiments (Münster 1834), später mehrere Veröffentlichungen in den Beiheften zum Militär-Wochenblatt, die hauptsächlich die Darstellung der Ereignisse bei der Schlesischen Armee 1813 zum Gegenstand hatten.

Zwischen 1843 – unter Beförderung zum Hauptmann am 4. April 1844 – und 1857 betrieb er kriegsgeschichtliche Arbeiten beim Generalstab in Berlin. In dieser Zeit war Fransecky öfter als Lehrer an der Allgemeinen Kriegsschule tätig. Im Schleswig-Holsteinischen Krieg gegen Dänemark nahm er 1848 an den Gefechten bei Schleswig, Översee, Seggelung und Bierning teil, am 10. April 1849 wurde er zum Major befördert. Am 13. Juli 1854 wurde er Oberstleutnant und im folgenden Jahr zum Chef des Generalstabes des III. Armee-Korps ernannt. Am 10. Dezember 1857 übernahm er das Kommando über das 31. Infanterie-Regiments zu Erfurt und am 22. Mai 1857 wurde er zum Oberst befördert. Am 8. März 1860 trat er für vier Jahre in oldenburgisch-hanseatische Dienste, mit dem Rang eines Generalmajors (Patent am 18. Oktober 1861) wurde er Kommandeur des Oldenburgischen Infanterie-Regiments.

Am 21. November 1864 kam Fransecky zurück in den preußischen Heeresdienst und übernahm als Generalmajor die 7. Division in Magdeburg. Weitere Standorte der Division waren die umliegenden Städte Blankenburg, Burg, Gardelegen, Stendal, Quedlinburg, Halberstadt und Salzwedel. Am 18. Juni 1865 wurde er Generalleutnant und befehligte die 7. Division auch 1866 im Krieg gegen Österreich. Am 20. September 1866 wurde er mit dem Orden Pour le Mérite ausgezeichnet. Dies insbesondere für Leistungen seiner Truppen bei den Schlachten von Münchengrätz, Königgrätz und Preßburg. Zwischen 1867 und 1869 wurde er alljährlich zur Inspektion der sächsischen Truppenteile kommandiert.

Am 10. Juli 1870 wurde Fransecky zum General der Infanterie befördert und am 18. Juli übernahm er als Kommandierender General das II. Armee-Korps, das er im Deutsch-Französischen Krieg befehligte. Hier gelang es ihm am 18. August, das Korps in einem 16-stündigen Gewaltmarsch noch rechtzeitig als entscheidende Reserve auf das Schlachtfeld von Gravelotte zu bringen. Anschließend nahm er an der Einschließung der Festung Metz und nach deren Fall an der Belagerung von Paris teil. Am 1. Dezember erhielt er das Kommando sämtlicher, zwischen der Seine und Marne versammelten Streitkräfte. Am 2. Dezember wies er mit diesen den großen Durchbruchsversuch des Generals Ducrot bei Champigny in der Schlacht bei Villiers zurück. Vom 2. Januar bis 1. Februar 1871 führte Fransecky sein Korps, das der Südarmee unter Manteuffel zugeteilt war, über die Côte d'Or und den Jura, um durch 16 Gefechte die Armee Bourbakis schließlich bei Pontarlier über die schweizerische Grenze zu zwingen.

Nach dem Waffenstillstand ernannte ihn Kaiser Wilhelm I. am 20. März 1871 zum Kommandierenden General des XV. Armee-Korps mit Standort Straßburg. Bereits am 5. Februar 1871 hatte er ihm auch das Eichenlaub zum Pour le Mérite verliehen, zudem erhielt er eine Dotation in Höhe von 150.000 Talern. Ende Oktober 1879 wurde er zum Gouverneur von Berlin ernannt. Dieses Amt gab er 1882 ab. Aus gesundheitlichen Gründen reichte er am 23. Oktober sein Abschiedsgesuch ein und wurde am 23. November 1882 unter Verleihung der Brillanten zum Schwarzen Adlerorden zur Disposition gestellt.

Ehrungen
Fransecky zählt zu den höchstdekorierten Generalen seiner Zeit. Neben dem bereits genannten Pour le Mérite und dem Schwarzen Adlerorden war er Inhaber des Großkreuzes des Roter Adlerordens mit Eichenlaub und Schwertern, der Großkreuze des Württembergischen Militärverdienstordens, des Bayerischen Militärverdienstordens sowie des Sächsischen Albrechts-Ordens. Das Fort I der Festung Straßburg erhielt am 1. September 1873 den Namen Fort Fransecky. Außerdem war er Chef des Infanterie-Regiments "Prinz Moritz von Anhalt-Dessau" (5. Pommersches) Nr. 42. Die Stadt Magdeburg hatte zeitweise eine Straße, die Franseckystraße, nach ihm benannt. Auch Berlin hatte im Prenzlauer Berg eine Franseckystraße – bis in den frühen DDR-Jahren die Spuren des "preußischen Militarismus" aus dem Straßenbild getilgt wurden. Die Franseckystraße wurde nach einem antifaschistischen Widerständler in Sredzkistraße umbenannt. In seinem Geburtsort Gedern erinnert die Franseckystraße bis heute an den berühmten Sohn der Stadt.

Familie
Fransecky verheiratet sich am 11. Dezember 1836 auf Schloss Liebeneck mit seiner Cousine 2. Grades, Sophie Luise Freiin von Preuschen von und zu Liebenstein (1807–1894), der Tochter des nassauischen Oberappellationsgerichtsvizepräsidenten und Landtagsabgeordneten August von Preuschen von und zu Liebenstein. Aus der Ehe gingen folgende Kinder hervor:

 Georg August Ernst Florentin (1838–1869), Premierleutnant im Kaiser Alexander Garde-Grenadier-Regiment Nr. 1
 Anna (* 1839) ⚭ 6. Juni 1878 in Straßburg Kurt Freiherr von Treusch von Buttlar-Brandenfels
 Ernst (1841–1867), Premierleutnant im Husaren-Regiment "Landgraf Friedrich II. von Hessen-Homburg" (2. Kurhessisches) Nr. 14
 Friedrich Eduard Ernst Ludwig Adalbert Rudolf (* 1842), Hauptmann a. D.

Werke
 Denkwürdigkeiten des preußischen Generals der Infanterie Fransecky. 1901.
 Geschichte des königlich Preußischen 16. Infanterie-Regiments, 1834, Digitalisat

Literatur
 Fritz Arlt: Fransecky, Eduard Friedrich Karl von. In: Guido Heinrich, Gunter Schandera (Hrsg.): Magdeburger Biographisches Lexikon 19. und 20. Jahrhundert. Biographisches Lexikon für die Landeshauptstadt Magdeburg und die Landkreise Bördekreis, Jerichower Land, Ohrekreis und Schönebeck. Scriptum, Magdeburg 2002, ISBN 3-933046-49-1 ([ Artikel online]).

 Kurt von Priesdorff: Soldatisches Führertum. Band 7, Hanseatische Verlagsanstalt Hamburg, o. O. [Hamburg], o. J. [1939], , S. 242–250, Nr. 2274.
 Martin Wiehle: Magdeburger Persönlichkeiten. Hrsg. durch den Magistrat der Stadt Magdeburg, Dezernat Kultur. imPuls Verlag, Magdeburg 1993, ISBN 3-910146-06-6.
 Bruno Garlepp, Eduard Friedrich v. Fransecky: preussischer General der Infanterie; lebensgeschichtliche Erzählung. 1893.

Weblinks

Einzelnachweise

General der Infanterie (Königreich Preußen)
Gouverneur (Preußen)
Person im Deutsch-Dänischen Krieg (Preußen)
Person in der Schleswig-Holsteinischen Erhebung (Preußen)
Person im Deutsch-Französischen Krieg
Ritter des Ordens Pour le Mérite mit Eichenlaub
Ritter des Schwarzen Adlerordens
Träger des Großkreuzes des Roten Adlerordens
Träger des Bayerischen Militärverdienstordens
Träger des Württembergischen Militärverdienstordens (Großkreuz)
Person (Magdeburg)
Adliger
Preuße
Geboren 1807
Gestorben 1890
Mann


text:
About the Plays
FirstHand Theatrical
Accolades for Apple Does Not Fall: Journeys of a Russian-Jewish Family from its two-week run, August 2018, at the Piven Theatre in Evanston, IL.
"For years, I've been waiting for the captivating immigration stories of Soviet Jews to be brought to the stage or screen. The oppression that Bena's family experienced and escaped in the 70s, as well as my family and peers' families of the 80s largely goes unknown. This excerpt from history needs to be heard and documented. Ire, hilarity, love, culture, and life lessons, all in one play – How Many Bushels Am I Worth?"
– Sofia Jouravel, Board Member
Jewish United Fund of Chicago
Russian Jewish Division
"Highly recommend both And Then What? and How Many Bushels Am I Worth?. Very different from each other and both very moving. Joel and I ran into someone we know in the audience who thought he knew a lot about the Soviet Jewry story but was shocked by how much he didn't know. "My bad," he said. I say: another reason to go."
– Laurie Kramer, Former Cultural Arts Director
Jewish Community Center of St. Paul and Former Russian Resettlement Worker, JCC of Buffalo
"These plays were full of power and emotion as they revealed what day-to-day life was like and what the perils were of trying to leave the Soviet Union. I felt the trepidation and ultimate exuberance in the journey of escape."
– Vlad Shmunis, Chairman & CEO, RingCentral
"How Many Bushels Am I Worth? brings home the cumulative injustices that compel a loving family to take that leap of faith to start over in an unknown new place. Bena Shklyanoy's story, captured for the stage with sensitivity and humor by Kevin Olson, is one of hopes raised, dashed and raised again. Bena's determination and tenacity in overcoming political and bureaucratic obstacles resonate as immigration continues to make headlines. So do the grace notes of compassionate helpers along the way."
– Ann Silverberg, Assistant News Editor, Newsday
"And Then What? is nothing less than a brief personal history of 20th century Russian Jewry told through the life stories of one family. To hear their stories, told with honesty tempered with kindness, is to be invited to join Bena's loving family for an evening. While at the same time, allowing those of us who trace their roots to Russia, to learn what our ancestors had to endure before settling in the United States."
– Bruce Dien, Audience Member
"We saw the Chicago production of How Many Bushels Am I Worth?. The acting was terrific and the story was engaging. The actors really made you feel the struggles the family went through and how difficult the decision was to emigrate. My family got out a generation earlier but it really made me think
'there but for you go I'."
– Naomi Arnold, Audience Member
"How Many Bushels Am I Worth? takes the audience on a journey through the post-WWII life of an ordinary Jewish girl and woman living in the Soviet Union. Told simply with only a narrator who moves the story along and Bena, the story's protagonist, we watch a very young Bena grow into a wife and mother learning how to survive the complex culture of the Soviet Union as a Jew. The play portrays the people and events that influence the adult Bena and her family to decide to leave the Soviet Union and immigrate to the United States. It is a moving piece of theater which not only entertains but also teaches about life in the Soviet Union and what it meant to be identified as a Jew there. The play celebrates the American policy that, in its simplest terms, traded wheat for Jews. How Many Bushels Am I Worth? deserves to be experienced by all cultures as at its core, it paints a moving portrait of what happens when oppression makes us forget who we are."
– Karen Vaughan, Audience Member
"The first thing that comes to mind is that all this happened during my lifetime. Growing up in the 1940's, I was protected from a lot of world events. For one thing, there was no TV on 24-7 that let everyone know what was happening on the "other side of the world"… I had heard of Hitler, Stalin and Russia, but really had no idea of what that meant. During the 50's, I was busy "growing up" and was more interested in getting through high school, college, and finding my life partner! I knew about the "bad" people in Russia, but not anywhere close to what the situation really was. So, after seeing this play, I became aware for the first time, how sheltered my life was and what difficult situations others were having. I am so glad that you were able to bring this to me and I can now pray that we can learn from our mistakes and work towards making the whole world a better place."
– Judy Millar, Audience Member
"I attended, "And Then What?" written by Kevin Olson and I was blown away. This Play took the family stories of Bena Shklyanoy's during the Soviet Era. As a writer, I was blown away by Mr. Olson's skills of character development, and as a Jewish person of European descent I felt like these stories were my family's stories. "And Then What?" is a show for people of all ages, and I know that it will spark many conversations with future audience members and their families as it did with mine."
– Jeremy Drazner, Audience Member
CONTACT US TO BRING THE PLAYS TO YOUR CITY
Fill out our contact form to send us an email!
"Meaningful. Powerful. Inspirational."
Genia Kovelman, Director
Jewish United Fund-Russian Jewish Division
Read Bena's Family Story
Signup for News & Updates
2018-Chicago
2017-Providence