text:
/**
 * Module dependencies
 */

var http = require('http');
var https = require('https');
var url = require('url');
var cheerio = require('cheerio');

/**
 * Initialize CAS with the given `options`.
 *
 * @param {Object} options
 *     {
 *       'base_url':
 *           The full URL to the CAS server, including the base path.
 *       'service':
 *           The URL of the page being authenticated. Can be omitted here and
 *           specified during validate(). Or detected automatically during
 *           authenticate().
 *       'version':
 *           Either 1.0 or 2.0
 *
 *
 *       'external_pgt_url':
 *           (optional) The URL of the PGT callback server.
 *           e.g. https://callback.example.com:8989/
 *           The CAS server will try to contact this host every time a user
 *           logs in.
 *           Do not use with the `pgt_server` option.
 *
 *
 *       'pgt_server': (previously 'proxy_server')
 *           (optional) Set to TRUE if you want to automatically start
 *           a PGT callback server internally.
 *           Can be used to create a standalone PGT callback server.
 *           Do not combine with `external_pgt_url`.
 *
 *       'pgt_host': (previously 'proxy_callback_host')
 *           The publicly accessible host name of your PGT server.
 *           It must be usable by the CAS server. The CAS server will try to
 *           contact this host every time a user logs in.
 *           Required only if you used `pgt_server`.
 *
 *       'pgt_port': (previously 'proxy_callback_port')
 *           (optional) The port to listen on for incoming connections from
 *           the CAS server. Used with `pgt_host`. Default is 80443.
 *
 *
 *       'ssl_key': (previously 'proxy_server_key')
 *           A string value of your SSL private key.
 *           Required for `pgt_server`.
 *           Optional for `external_pgt_url`.
 *           Not needed otherwise.
 *
 *       'ssl_cert': (previously 'proxy_server_cert')
 *           A string value of your SSL certificate.
 *           Required for `pgt_server`.
 *           Optional for `external_pgt_url`.
 *           Not needed otherwise.
 *
 *       'ssl_ca': (previously 'proxy_server_ca')
 *           (optional) An array of SSL CA and Intermediate CA certificates.
 *           Useful with `external_pgt_url` if the PGT callback server has a
 *           self signed certificate.
 *
 *
 *       'sso_servers':
 *           An array of IP addresses of servers that we will accept
 *           single sign out requests from. Default is to accept all
 *           well-formed requests no matter where they are from.
 *           Only relevant if you use handleSingleSignout().
 *     }
 * @api public
 */
var CAS = module.exports = function CAS(options)
{
  options = options || {};

  // Backwards compatibility for old option names
  options.pgt_server = options.pgt_server || options.proxy_server;
  options.pgt_host = options.pgt_host || options.proxy_callback_host;
  options.pgt_port = options.pgt_port || options.proxy_callback_port;
  options.ssl_key = options.ssl_key || options.proxy_server_key;
  options.ssl_cert = options.ssl_cert || options.proxy_server_cert;
  options.ssl_ca = options.ssl_ca || options.proxy_server_ca;

  if (!options.base_url) {
    throw new Error('Required CAS option `base_url` missing.');
  }

  var cas_url = url.parse(options.base_url);
  if (cas_url.protocol != 'https:') {
    throw new Error('Only https CAS servers are supported.');
  }
  if (!cas_url.hostname) {
    throw new Error('Option `base_url` must be a valid url like: https://example.com/cas');
  }

  this.version = options.version || 1.0;
  this.hostname = cas_url.hostname;
  this.port = cas_url.port || 443;
  this.base_path = cas_url.pathname;
  this.service = options.service;
  this.pgtStore = {};
  this.pgt_is_external = false;

  // SSL options used when running a PGT callback server,
  // or as a client contacting the external PGT URL.
  this.ssl_cert = options.ssl_cert || null;
  this.ssl_key = options.ssl_key || null;
  this.ssl_ca = options.ssl_ca || null;

  // Setting this to false will allow cause bad SSL certificates to still
  // be accepted. Use only for testing.
  this.secureSSL = true;

  // Optional single sign out server list
  if (options.sso_servers) {
    this.ssoServers = options.sso_servers;
  }

  // External PGT callback server URL
  if (options.external_pgt_url) {
    var pgt_url = url.parse(options.external_pgt_url);
    if (pgt_url.protocol != 'https:') {
      throw new Error('Option `external_pgt_url` must be https');
    }
    if (!pgt_url.hostname) {
      throw new Error('Option `external_pgt_url` must be a valid url like: https://example.com:8989/callback');
    }
    this.is_pgt_external = true;
    this.pgt_url = url.format(pgt_url);

    // Deprecated
    if (options.external_proxy_url) {
      var proxy_url = url.parse(options.external_proxy_url);
      if (!proxy_url.hostname) {
        throw new Error('Option `external_proxy_url` must be a vald url like: https://example.com:8080/');
      }
      this.external_proxy_url = url.format(proxy_url);
    }
  }

  // Internal PGT callback server
  else if (options.pgt_server) {
    //// Required
    if (!this.ssl_key || !this.ssl_cert) {
        throw new Error('Options `ssl_key` and `ssl_cert` are required because you specified `pgt_server`');
    }
    this.pgt_host = options.pgt_host;
    if (!this.pgt_host) {
        throw new Error('Option `pgt_host` is required because you specified `pgt_server`');
    }
    //// Optional
    this.proxy_server_port = options.proxy_server_port || 0; // deprecated
    this.pgt_port = options.pgt_port || 80443

    this.startPgtServer(this.ssl_key, this.ssl_cert, this.ssl_ca, this.pgt_host, this.pgt_port, this.proxy_server_port);
  }

};

/**
 * Library version.
 */

CAS.version = '0.0.5';

/**
 * Force CAS authentication on a web page. If users are not yet authenticated,
 * they will be redirected to the CAS server to log in there.
 *
 * @param {object} req
 *      HTTP request object
 * @param {object} res
 *      HTTP response object
 * @param {function} callback
 *      callback(err, status, username, extended)
 * @param {String} service
 *      (optional) The URL of the service/page that requires authentication.
 *      Default is to extract this automatically from
 *      the `req` object.
 * @api public
 */
CAS.prototype.authenticate = function(req, res, callback, service)
{
    var casURL = 'https://' + this.hostname + ':' + this.port + this.base_path;
    var reqURL = url.parse(req.url, true);

    // Try to extract the CAS ticket from the URL
    var ticket = reqURL.query['ticket'];

    // Obtain the service URL automatically if it wasn't provided
    if (!service) {
        // Get the URL of the current page, minus the 'ticket'
        delete reqURL.query['ticket'];
        service = url.format({
            protocol: req.protocol || 'http',
            host: req.headers['x-forwarded-host'] || req.headers['host'],
            pathname: reqURL.pathname,
            query: reqURL.query
        });
    }

    // No ticket, so we haven't been sent to the CAS server yet
    if (!ticket) {
        // redirect to CAS server now
        var redirectURL = casURL + '/login?service=' + encodeURIComponent(service);
        res.writeHead(307, {'Location': redirectURL});
        res.write('CAS login');
        res.end();
    }

    // We have a ticket!
    else {
        // Validate it with the CAS server now
        this.validate(ticket, callback, service);
    }
};

/**
 * Handle a single sign-out request from the CAS server.
 *
 * In CAS 3.x the server keeps track of all the `ticket` and `service` values
 * associated with each user. Then when the user logs out from one site, the
 * server will contact every `service` they have authenticated with and POST
 * a sign-out request containing the original `ticket` used to login.
 *
 * This is optional. But if you do use this, it must come before authenticate().
 * Also, it will only work if the service is accessible on the network by the
 * CAS server.
 *
 * Unlike the other functions in this module, this one will only work
 * with Express or something else that pre-processes the body of a POST
 * request. It is not compatible with basic node.js http req objects.
 *
 * @param {Object} req
 *      Express/Connect HTTP serverRequest.
 * @param {Object} res
 *      HTTP serverResponse.
 * @param {Function} next
        Normal callback if no logout request was made.
 * @param {Function} logoutCallback
 *      function(ticket)
 * @api public
 */
CAS.prototype.handleSingleSignout = function(req, res, next, logoutCallback)
{
    if (req.method == 'POST' && req.body['logoutRequest']) {
        // Check IP address
        var remoteIP = req.connection.remoteAddress;
        if (this.ssoServers && this.ssoServers.indexOf(remoteIP) < 0) {
            // not a recognized single signout server
            return next();
        }

        try {
            // This was a signout request. Parse the XML.
            var $ = cheerio.load(req.body['logoutRequest']);
            var ticketElems = $('samlp\\:SessionIndex');
            if (ticketElems && ticketElems.length > 0) {
                // This is the ticket that was issued by CAS when the user
                // first logged in. Pass it into the callback so the
                // application can use it to delete the user's session.
                var ticket = ticketElems.first().text().trim();
                return logoutCallback(ticket);
            }
        }
        catch (err) {
            // This was not a valid signout request.
            return next();
        }
    }
    else {
        // This was not a signout request. Proceed normally.
        return next();
    }
}

/**
 * Log the user out of their CAS session. The user will be redirected to
 * the CAS server for this.
 *
 * @param {Object} req
 *     HTTP request object
 * @param {Object} res
 *     HTTP response object
 * @param {String} returnUrl
 *     (optional) The URL that the user will return to after logging out.
 * @param {Boolean} doRedirect
 *     (optional) Set this to TRUE to have the CAS server redirect the user
 *      automatically. Default is for the CAS server to only provide a
 *      hyperlink to be clicked on.
 * @api public
 */
CAS.prototype.logout = function(req, res, returnUrl, doRedirect)
{
    var logout_path;
    if (returnUrl && doRedirect) {
        // Logout with auto redirect
        logout_path = '/logout?service=' + encodeURIComponent(returnUrl);
    } else if (returnUrl) {
        // Logout and provide a hyperlink back
        logout_path = '/logout?url=' + encodeURIComponent(returnUrl);
    } else {
        // Logout with no way back
        logout_path = '/logout';
    }

    var redirectURL = 'https://' + this.hostname + ':' + this.port + this.base_path + logout_path;
    res.writeHead(307, {'Location' : redirectURL});
    res.write('CAS logout');
    res.end();
}

/**
 * Attempt to validate a given ticket with the CAS server.
 * `callback` is called with (err, auth_status, username, extended)
 *
 * @param {String} ticket
 *     Either a service ticket (ST) or a proxy ticket (PT)
 * @param {Function} callback
 *     callback(err, auth_status, username, extended).
 *     `extended` is an object containing:
 *       - username
 *       - attributes
 *       - PGTIOU
 *       - ticket
 *       - proxies
 * @param {String} service
 *     The URL of the service requesting authentication. Optional if
 *     the `service` option was already specified during initialization.
 * @param {Boolean} renew
 *     (optional) Set this to TRUE to force the CAS server to request
 *     credentials from the user even if they had already done so
 *     recently.
 * @api public
 */
CAS.prototype.validate = function(ticket, callback, service, renew)
{
  // Use different CAS path depending on version
  var validate_path;
  var pgtURL;
  var cas_version = this.version;
  if (this.version < 2.0) {
    // CAS 1.0
    validate_path = 'validate';
  } else {
    // CAS 2.0
    pgtURL = this.pgt_url;
    if (ticket.indexOf('PT-') == 0) {
      validate_path = 'proxyValidate';
    } else {
      //validate_path = 'serviceValidate';
      validate_path = 'proxyValidate';
    }
  }

  // Service URL can be specified in the function call, or during
  // initialization.
  var service_url = service || this.service;
  if (!service_url) {
    throw new Error('Required CAS option `service` missing.');
  }

  var query = {
    'ticket': ticket,
    'service': service_url
  };
  if (renew) {
    query['renew'] = 1;
  }
  if (pgtURL) {
    query['pgtUrl'] = pgtURL;
  }

  var queryPath = url.format({
      pathname: this.base_path+'/'+validate_path,
      query: query
    });

  var req = https.get({
    host: this.hostname,
    port: this.port,
    path: queryPath,
    ca: this.ssl_ca || null,
    rejectUnauthorized: this.secureSSL
  }, function(res) {
    // Handle server errors
    res.on('error', function(e) {
      callback(e);
    });

    // Read result
    res.setEncoding('utf8');
    var response = '';
    res.on('data', function(chunk) {
      response += chunk;
      if (response.length > 1e6) {
        req.connection.destroy();
      }
    });

    res.on('end', function() {
      // CAS 1.0
      if (cas_version < 2.0) {
        var sections = response.split('\n');
        if (sections.length >= 1) {
          if (sections[0] == 'no') {
            callback(undefined, false);
            return;
          } else if (sections[0] == 'yes' &&  sections.length >= 2) {
            callback(undefined, true, sections[1]);
            return;
          }
        }
        // Format was not correct, error
        callback(new Error('Bad response format.'));
      }

      // CAS 2.0 (XML response, and extended attributes)
      else {
        // Use cheerio to parse the XML repsonse.
        var $ = cheerio.load(response);

        // Check for auth success
        var elemSuccess = $('cas\\:authenticationSuccess').first();
        if (elemSuccess && elemSuccess.length > 0) {
            var elemUser = elemSuccess.find('cas\\:user').first();
            if (!elemUser || elemUser.length < 1) {
                //  This should never happen
                callback(new Error("No username?"), false);
                return;
            }

            // Got username
            var username = elemUser.text();

            // Look for optional proxy granting ticket
            var pgtIOU;
            var elemPGT = elemSuccess.find('cas\\:proxyGrantingTicket').first();
            if (elemPGT) {
                pgtIOU = elemPGT.text();
            }

            // Look for optional proxies
            var proxies = [];
            var elemProxies = elemSuccess.find('cas\\:proxies');
            for (var i=0; i<elemProxies.length; i++) {
                var thisProxy = $(elemProxies[i]).text().trim();
                proxies.push(thisProxy);
            }

            // Look for optional attributes
            var attributes = parseAttributes(elemSuccess);

            callback(undefined, true, username, {
                'username': username,
                'attributes': attributes,
                'PGTIOU': pgtIOU,
                'ticket': ticket,
                'proxies': proxies
            });
            return;
        } // end if auth success

        // Check for correctly formatted auth failure message
        var elemFailure = $('cas\\:authenticationFailure').first();
        if (elemFailure && elemFailure.length > 0) {
            var code = elemFailure.attr('code');
            var message = 'Validation failed [' + code +']: ';
            message += elemFailure.text();
            callback(new Error(message), false);
            return;
        }

        // The response was not in any expected format, error
        callback(new Error('Bad response format.'));
        console.error(response);
        return;
      };
    });
  });

  // Connection error with the CAS server
  req.on('error', function(err) {
    callback(err);
    req.abort();
  });
};

/**
 * Fetches the PGT value that matches a given PGTIOU.
 * Used internally by getProxyTicket().
 *
 * @param {String} pgtIOU
 *     This is the PGTIOU that can be found in the validation response of the
 *     CAS server.
 * @param {Function} callback
 *     callback(err, pgt)
 * @return {null|String}
 *     If using an internal PGT callback server, then the PGT will also
 *     be delivered as the return value. Otherwise, NULL.
 */
CAS.prototype.getProxyGrantingTicket = function(pgtIOU, callback)
{
    var pgt = '';

    // If configured for external PGT server use, fetch the PT from there
    if (this.is_pgt_external) {
        var urlFetchPGT = url.parse(this.pgt_url + 'getPGT?pgtiou=' + pgtIOU);
        urlFetchPGT.key = this.ssl_key || null;
        urlFetchPGT.cert = this.ssl_cert || null;
        urlFetchPGT.ca = this.ssl_ca || null;
        urlFetchPGT.rejectUnauthorized = this.secureSSL;

        var req = https.get(urlFetchPGT, function(res) {
            res.on('data', function(chunk) {
                pgt += chunk;
                if (pgt.length > 1e6) {
                  req.connection.destroy();
                }
            });
            res.on('end', function() {
                callback(null, pgt);
            });
            res.on('error', function(err) {
                callback(err);
            });
        });

        // Error starting the connection to the PGT server
        req.on('error', function(err) {
            callback(err);
            req.abort();
        });
        return null;
    }

    // Look up the PGT locally
    else if (this.pgtStore[pgtIOU]) {
        pgt = this.pgtStore[pgtIOU]['pgtID'];
        callback && callback(null, pgt);
        return pgt;
    }
    else {
        callback && callback(new Error('Invalid PGTIOU supplied'));
        return null;
    }
}

/**
 * Obtain a Proxy Ticket (PT) that can be used to access a service on behalf
 * of a user.
 *
 * Example:
 *      var url = 'http://example.com/user/info';
 *      cas.getProxyTicket(pgtiou, url, function(err, pt) {
 *          if (!err) {
 *              url += '?ticket=' + pt;
 *              request(url, ... )
 *          }
 *      });
 *
 * @param {string} pgtIOU
 *      The PGTIOU that was given by the CAS server when the user logged in.
 * @param {function} callback
 *      The user's authentication ticket will be delivered via this function
 *      callback(err, pt)
 * @api public
 */
CAS.prototype.getProxyTicket = function(pgtIOU, targetService, callback)
{
    var self = this;

    // Obtain the PGT
    this.getProxyGrantingTicket(pgtIOU, function(err, pgt) {
        if (err) {
            callback(err);
            return;
        }
        // Query the CAS server
        var req = https.get({
            protocol: 'https:',
            hostname: self.hostname,
            port: self.port,
            ca: self.ssl_ca || null,
            rejectUnauthorized: self.secureSSL,
            path: url.format({
                pathname: self.base_path + '/proxy',
                query: {
                    'targetService': targetService,
                    'pgt': pgt
                }
            })
        }, function(res) {
            // Handle server errors
            res.on('error', function(e) {
                callback(e);
            });

            // Read result
            res.setEncoding('utf8');
            var response = '';
            res.on('data', function(chunk) {
                response += chunk;
                if (response.length > 1e6) {
                    req.connection.destroy();
                }
            });
            res.on('end', function() {
                // Use cheerio to parse the XML response
                var $ = cheerio.load(response);

                // Got the proxy ticket
                var elemTicket = $('cas\\:proxyTicket').first();
                if (elemTicket && elemTicket.length > 0) {
                    var proxyTicket = elemTicket.text();
                    callback(undefined, proxyTicket);
                    return;
                }
                // Got a proxy failure
                var elemFailure = $('cas\\:proxyFailure').first();
                if (elemFailure && elemFailure.length > 0) {
                    var code = elemFailure.attr('code');
                    var message = 'Proxy failure [' + code + ']: ';
                    message += elemFailure.text();
                    callback(new Error(message));
                    return;
                }
                // Unexpected response
                callback(new Error("Bad response format: " + response));
                return;
            });
        });

        // Error starting the connection to the CAS server
        req.on('error', function(err) {
            callback(err);
            req.abort();
        });
    });
}

/**
 * Start a PGT callback server.
 *
 * This is a local HTTPS server that listens for incoming connections from
 * the CAS server. Any PGTs received from the CAS server will be stored
 * in `this.pgtStore`.
 *
 * The local machine and the CAS server must be able to access each other
 * on the network.
 *
 *
 * The following functionality is deprecated:
 *
 * This is optionally also an http proxy server that listens for outgoing
 * requests from clients that already have a PGTIOU. In addition to the
 * normal HTTP information, the client must also supply these two headers
 * in the request:
 *    cas-proxy-pgtiou
 *    cas-proxy-targeturl
 *
 *
 * @param {String/Buffer} key
 *    The SSL private key
 * @param {String/Buffer} cert
 *    The SSL certificate
 * @param {Array} ca
 *    The CA Bundle for the SSL certificate
 * @param {String} callbackHost
 *    The publicly accessible hostname for the callback server.
 * @param {Integer} callbackPort
 *    The port number to listen on for incoming CAS PGT messages.
 * @param {Integer} proxyPort
 *    Deprecated.
 *    The port number to listen on for outgoing proxied requests.
 *    Omit this to disable the proxy server and only allow
 *    internal requests via CAS.proxiedRequest().
 * @api public
 */
CAS.prototype.startPgtServer = function(key, cert, ca, callbackHost, callbackPort, proxyPort)
{
    var serverOptions = {
        'key': key,
        'cert': cert,
        'ca': ca
    };
    var self = this;

    // This is the pgtURL that will be sent to the CAS server during a
    // validation request. The CAS server will try to connect to it.
    this.pgt_url = 'https://' + callbackHost + ':' + callbackPort + '/';

    // PGT callback server that listens for incoming connections from
    // the CAS server.
    var pgtServer = https.createServer(serverOptions);
    console.log('Starting PGT callback server on port ' + callbackPort);
    pgtServer.addListener("request", function(req, res) {

        var reqURL = url.parse(req.url, true);

        // Check if this is a request from a CAS _client_ to get a PGT.
        // [ see first part of getProxyTicket() ]
        if (reqURL.pathname == '/getPGT') {
            var pgtIOU = reqURL.query['pgtiou'];
            if (self.pgtStore[pgtIOU]) {
                res.writeHead(200, { 'Content-type': 'text/plain' });
                res.write(self.pgtStore[pgtIOU]['pgtID']);
                res.end();
            }
            else {
                res.writeHead(403, { 'Content-type': 'text/plain' });
                res.write("Invalid PGTIOU supplied");
                res.end();
            }
            return;
        }

        // Otherwise this is a connection from the CAS _server_.
        // The incoming connection tells us what the PGTIOU and PGT values
        // are. It expects only a HTTP 200 response in return.
        else {
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end();
            // Save the PGT info into the memory store
            var pgtIOU = reqURL.query['pgtIou'];
            var pgtID = reqURL.query['pgtId'];
            if (pgtIOU && pgtID) {
                self.pgtStore[ pgtIOU ] = {
                    'pgtID': pgtID,
                    'time': process.uptime()
                };
            }
            return;
        }
    });
    pgtServer.listen(callbackPort);

    // Start an interval for garbage collection of the local PGT store.
    if (this.pgtInterval) {
        clearInterval(this.pgtInterval);
    }
    this.pgtInterval = setInterval(function() {
        var now = process.uptime();
        // Delete entries older than an hour
        for (var pgtIOU in self.pgtStore) {
            var timestamp = self.pgtStore[pgtIOU]['time'];
            if (now - timestamp > 60 * 60 * 1) {
                delete self.pgtStore[pgtIOU];
            }
        }
    }, 1000 * 60);

    // Deprecated:
    // Proxy server that listens for HTTPS connections from other CAS clients
    // and forwards them to the target service. Disabled by default.
    if (proxyPort) {
        var proxyServer = https.createServer(serverOptions);
        console.log('Starting CAS-aware HTTP proxy server on port ' + proxyPort);
        proxyServer.addListener("request", function(req, res) {
            // Use "cas-proxy-..." headers to obtain information about the
            // requested target service.
            try {
                var pgtIOU = req.headers['cas-proxy-pgtiou'];
                if (!pgtIOU) {
                    throw 'Header "cas-proxy-pgtiou" was not found';
                }
                if (!self.pgtStore[pgtIOU]) {
                    throw 'Invalid "cas-proxy-pgtiou" was given';
                }
                var targetURL = req.headers['cas-proxy-targeturl'];
                if (!targetURL) {
                    throw 'Header "cas-proxy-targeturl" was not found';
                }
                var targetOptions = url.parse(targetURL, true);
                if (!targetOptions.hostname) {
                    throw 'Invalid "cas-proxy-targeturl" was given';
                }
            } catch (e) {
                res.writeHead(400, {'Content-Type': 'text/plain'});
                res.write('400 - CAS Proxy Error\n');
                if (typeof e == 'string') {
                    res.write(e);
                } else {
                    res.write(e.message);
                }
                res.end();
                return;
            }

            // The headers are okay. Next begin the proxied request.
            targetOptions.method = req.method || 'GET';
            self.proxiedRequest(pgtIOU, targetOptions, function(err, targetReq, targetRes) {
                if (err) {
                    res.writeHead(500, {'Content-Type': 'text/plain'});
                    res.write('500 - CAS Proxy Error\n');
                    res.write(err.message);
                    res.end();
                    return;
                }

                // Mirror requester's data to the target
                req.on('data', function(chunk) {
                    targetReq.write(chunk);
                });
                req.on('end', function() {
                    targetReq.end();
                });

                // Mirror target's response headers back to requester
                res.writeHead(targetRes.statusCode, targetRes.headers);

                // Mirror target's data back to the requester
                targetRes.on('data', function(chunk) {
                    res.write(chunk);
                });
                targetRes.on('end', function() {
                    res.end();
                });
            });
        });
        proxyServer.listen(proxyPort);
    }
}

/**
 * Create a CAS proxied HTTP/HTTPS request.
 * The CAS proxy ticket (PT) will automatically be added to the target
 * service's query.
 *
 * Deprecated.
 *
 * @param {String} pgtIOU
 *     This should have been obtained during the initial CAS login with
 *     the validate() function.
 * @param {Object} options
 *     Same as the options passed in to http.request(). This is where you
 *     specify the service URL you are requesting.
 * @param {Function} callback
 *     callback(err, req, res)
 * @api public
 */
CAS.prototype.proxiedRequest = function(pgtIOU, options, callback)
{
    if (this.external_proxy_url) {
        this.proxiedRequestExternal(this.external_proxy_url, pgtIOU, options, callback);
        return;
    }

    var targetService = url.format(options);

    this.getProxyTicket(pgtIOU, targetService, function(err, pt) {
        if (err) {
            callback(err);
            return;
        }

        // Add the proxy ticket to the target service's query string
        var path = options.path || targetService.replace(/^https?:\/\/[^\/]+/, '');
        if (path.match(/[&?]/)) {
            options.path = path + '&ticket=' + pt;
        } else {
            options.path = path + '?ticket=' + pt;
        }
        delete options.pathname;
        delete options.search;
        delete options.href;
        delete options.query;
        options.agent = false;

        // Request the target service
        var serviceObj;
        if (options.options == 'https:') {
            serviceObj = https;
        } else {
            serviceObj = http;
        }
        try {
            switch (options.method.toUpperCase()) {
                default:
                case 'GET':
                case 'HEADER':
                    // get() automatically ends the request.
                    var req = serviceObj.get(options, function(res) {
                        callback(undefined, req, res);
                    });
                    break;

                case 'POST':
                case 'PUT':
                    // Let the calling function end the request manually after
                    // it has finished sending all its data.
                    var res;
                    var req = serviceObj.request(options, function(_res) {
                        res = _res;
                    });
                    callback(undefined, req, res);
                    break;
            }
        }
        catch (err) {
            callback(err);
        }

    });
}

/**
 * Create a CAS proxied HTTP/HTTPS request through an external server.
 *
 * Deprecated.
 *
 * @param {String} proxyURL
 *     The URL of the CAS http proxy server
 * @param {String} pgtIOU
 *     This should have been obtained during the initial CAS login with
 *     the validate() function.
 * @param {Object} requestOptions
 *     Same as the options passed in to http.request(). This is where you
 *     specify the service URL you are requesting.
 * @param {Function} callback
 *     callback(err, req, res)
 * @api public
 */
CAS.prototype.proxiedRequestExternal = function(proxyURL, pgtIOU, options, callback)
{
    var targetService = url.format(options);
    var proxyInfo = url.parse(proxyURL);

    // Add the target's path (and querystring) to the proxy request.
    proxyInfo.path = options.path;

    // Add the custom proxy headers
    var headers = options.headers || {};
    headers['cas-proxy-pgtiou'] = pgtIOU;
    headers['cas-proxy-targeturl'] = targetService;
    proxyInfo.headers = headers;

    var serviceObj;
    if (proxyInfo.protocol.indexOf('https') == 0) {
        serviceObj = https;
    } else {
        serviceObj = http;
    }

    try {
        var req = serviceObj.get(proxyInfo, function(res) {
            callback(undefined, req, res);
        });
    } catch(e) {
        callback(e);
    }
}

/**
 * Parse a cas:authenticationSuccess XML node for CAS attributes.
 * Supports Jasig style, RubyCAS style, and Name-Value.
 *
 * @param {Object} elemSuccess
 *     DOM node
 * @return {Object}
 *     {
 *         attr1: [ attr1-val1, attr1-val2, ... ],
 *         attr2: [ attr2-val1, attr2-val2, ... ],
 *         ...
 *     }
 * @attribution http://downloads.jasig.org/cas-clients/php/1.2.0/docs/api/client_8php_source.html#l01589
 */
var parseAttributes = function(elemSuccess)
{
    var attributes = {};
    var elemAttribute = elemSuccess.find('cas\\:attributes').first();
    if (elemAttribute && elemAttribute.children().length > 0) {
        // "Jasig Style" Attributes:
        //
        //  <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
        //      <cas:authenticationSuccess>
        //          <cas:user>jsmith</cas:user>
        //          <cas:attributes>
        //              <cas:attraStyle>RubyCAS</cas:attraStyle>
        //              <cas:surname>Smith</cas:surname>
        //              <cas:givenName>John</cas:givenName>
        //              <cas:memberOf>CN=Staff,OU=Groups,DC=example,DC=edu</cas:memberOf>
        //              <cas:memberOf>CN=Spanish Department,OU=Departments,...</cas:memberOf>
        //          </cas:attributes>
        //          <cas:proxyGrantingTicket>PGTIOU-84678-8a9d2...</cas:proxyGrantingTicket>
        //      </cas:authenticationSuccess>
        //  </cas:serviceResponse>
        //
        for (var i=0; i<elemAttribute.children().length; i++) {
            var node = elemAttribute.children()[i];
            var attrName = node.name.toLowerCase().replace(/cas:/, '');
            if (attrName != '#text') {
                var attrValue = cheerio(node).text();
                if (!attributes[attrName]) {
                    attributes[attrName] = [attrValue];
                } else {
                    attributes[attrName].push(attrValue);
                }
            }
        }
    }

    else {
        // "RubyCAS Style" attributes
        //
        //    <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
        //        <cas:authenticationSuccess>
        //            <cas:user>jsmith</cas:user>
        //
        //            <cas:attraStyle>RubyCAS</cas:attraStyle>
        //            <cas:surname>Smith</cas:surname>
        //            <cas:givenName>John</cas:givenName>
        //            <cas:memberOf>CN=Staff,OU=Groups,DC=example,DC=edu</cas:memberOf>
        //            <cas:memberOf>CN=Spanish Department,OU=Departments,...</cas:memberOf>
        //
        //            <cas:proxyGrantingTicket>PGTIOU-84678-8a9d2...</cas:proxyGrantingTicket>
        //        </cas:authenticationSuccess>
        //    </cas:serviceResponse>
        //
        for (var i=0; i<elemSuccess.children().length; i++) {
            var node = elemSuccess.children()[i];
            var tagName = node.name.toLowerCase().replace(/cas:/, '');
            switch (tagName) {
                case 'user':
                case 'proxies':
                case 'proxygrantingticket':
                case '#text':
                    // these are not CAS attributes
                    break;
                default:
                    var attrName = tagName;
                    var attrValue = cheerio(node).text();
                    if (attrValue != '') {
                        if (!attributes[attrName]) {
                            attributes[attrName] = [attrValue];
                        } else {
                            attributes[attrName].push(attrValue);
                        }
                    }
                    break;
            }
        }
    }

    if (attributes == {}) {
        // "Name-Value" attributes.
        //
        // Attribute format from this mailing list thread:
        // http://jasig.275507.n4.nabble.com/CAS-attributes-and-how-they-appear-in-the-CAS-response-td264272.html
        // Note: This is a less widely used format, but in use by at least two institutions.
        //
        //    <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
        //        <cas:authenticationSuccess>
        //            <cas:user>jsmith</cas:user>
        //
        //            <cas:attribute name='attraStyle' value='Name-Value' />
        //            <cas:attribute name='surname' value='Smith' />
        //            <cas:attribute name='givenName' value='John' />
        //            <cas:attribute name='memberOf' value='CN=Staff,OU=Groups,DC=example,DC=edu' />
        //            <cas:attribute name='memberOf' value='CN=Spanish Department,OU=Departments,...' />
        //
        //            <cas:proxyGrantingTicket>PGTIOU-84678-8a9d2sfa23casd</cas:proxyGrantingTicket>
        //        </cas:authenticationSuccess>
        //    </cas:serviceResponse>
        //
        var nodes = elemSuccess.find('cas\\:attribute');
        if (nodes && nodes.length) {
            for (var i=0; i<nodes.length; i++) {
                var attrName = nodes[i].attr('name');
                var attrValue = nodes[i].attr('value');
                if (!attributes[attrName]) {
                    attributes[attrName] = [attrValue];
                } else {
                    attributes[attrName].push(attrValue);
                }
            }
        }
    }

    return attributes;
}

redpajama_set_name: RedPajamaGithub


First impressions count in the catering business. And especially in Michelin star restaurants out to give as good an impression as possible from the get-go, a goal that makes pristine drinking glasses as much a prerequisite as the cuisine served.
Bar Agrikultur in Stockholm's quirky Södermalm District has won its loyal following and a Michelin star for its approach to honoring in-season food, flavor, sustainability and community. While small with just 24 seats, the restaurant is known as one of the best in the Swedish capital and counts on water technology leader Bluewater to help it retain its reputation..
Ranking among the 'best of the best' for Bar Agrikultur includes ensuring the wine and other drinking glasses are pristinely cleaned in a sustainable, less staff intensive way. They achieve that by connecting a Bluewater Pro 400 water purifier to their commercial dishwasher in order to cut the time-intensive need to polish every single glass to remove post-wash blemishes.
The compact Bluewater Pro harnesses unique next-generation SuperiorOsmosis™ reverse osmosis technology to feed contaminant-free water into a dishwasher to prevent the risk of a cloudy haze forming and cut the need for harsh detergents. Suitable also for crystal glassware, Bluewater Pro water ensures glasses do not have any lingering chemical residue or soap smells.
"It's very important for us to have clean glasses and in a fast-moving kitchen like ours we just don't have the time or staff to polish the glasses. Happily, the absolutely pure water from the Bluewater purifier makes polishing unnecessary and even removes the thin water line we had after hanging the glasses in the rack," said Stephanie Thern, Bar Agrikultur Somillier.
She said Bluewater proved the perfect accompaniment for a restaurant dishwasher because it delivered water free of all blemish-causing contaminants, which reduced the need for harsh detergents as well as subsequent labor-intensive polishing.
"Even the best dishwashers can leave a detergent residue on glasses that may affect the smell and taste of wine or water and cause bubbles to flatten more quickly, not good for champagne or sparkly water aficionado's," said Gustaf Hagström, Bluewater Nordic sales manager.
Other benefits of the Bluewater Pro include its compact size, world-leading clean water delivery rate, substantially reduced water wastage common to other RO water purifiers, and ease of installation and maintenance.
"For restaurant managers where purified water is a benefit or requirement, Bluewater Pro water purifiers delivers perfect cleaning results, maximum efficiency and hygiene, and easy operation. The Bluewater Pro 400 water purifier is the surefire go-to solution for the hotel and restaurant trade," said Gustaf Hagström.


PlasTec was established in 1993. Meanwhile we are active on several markets and several applications. At this moment we have 17 production lines and a motivated team.
Do not hesitate and let us know your wishes and needs. We provide you with a customized offer.


Well, this is certainly some outside-the-box thinking. The federally-run National Endowment for the Arts has put $100,000 towards an experimental, informative video game out of the Spelman College of Atlanta called HERadventure, which takes on 2012's "war on women" with a dystopian spin.
What would happen if the societal issues affecting women put other planets at risk? Well, of course, HER, a black female superhero, would swoop in with a plan to save the universe. HER is central to HERadventure, a science fiction-based, multimedia platform project that interweaves virtual worlds, digital and social media to create a gaming and storytelling experience. HERadventure not only entertains but tackles social issues that permeate the daily reality of many women.
HER enlists a corps of "superheroes in training" (HERadventure users) to take meaningful action and offer solutions to issues such as negative self-esteem, discrimination, eating disorders, and depression, which are causing women's auras to suffer.
The game, which releases on March 8th, also uses Facebook and Twitter as gaming platforms. HERadventure is one of nine recipients of the NEA's maximum grant. It was created by filmmaker and digital artist Ayoka Chenzira, Ph.D. (photo above), inspired by her attitude towards social issues at large: "What we do on Earth impacts the universe − not just pollution destroying the ozone layer, for example, but our thoughts and how we organize gender roles and social systems also have impact."
Under Chenzira's tutelage, three female Spelman students spent their semester researching the rarity of black superheroes and the work of female black cartoonists such as Jackie Ormes, using their findings as a jumping-off point to drive the themes of HERadventure. Cyncere White, one of the students, says, "We definitely want HERadventure to be fun, but we also want the targeted age group to recognize and understand that we have to figure out how to change the social issues that hinder black women."
Another of the student researchers, Carina-Michelle Francis: "As a producer, I want positive imagery of black women to be my focal point. There are no black women out there who are doing what Tyler Perry is able to do. I want to be that woman."
The description defies parody. $100,000 of taxpayer money is going to help develop a video game about a female alien sent to earth to rescue her own planet. [...] Although it is the smorgasbord of politically correct elements that makes this project entertaining to write about, the bottom line is that the government has taken $100,000 from the taxpayers and given it to someone to develop a video game.
Also, there are some hella fun photos from the HERadventure set on Chenzira's Twitter.


text:
Malta InsideOut
Insider Destination Info
Countryside & Environment
Events & Festas
Gozo & Comino
Folklore & Crafts
People & Opinion
You are here: Home / Food & Drink / Food Icons: Pride and Pastizzi at Crystal Palace
Food Icons: Pride and Pastizzi at Crystal Palace
by Andrew Galea Debono
December 23, 2012 September 15, 2016 Filed under:
All in a day, or night\'s work. The latest pastizzi batch fresh from the oven.
They call it the shop that never closes. The sign outside says 'Crystal Palace Tea and Coffee Bar'. This traditional little bar on the outskirts of Rabat, just around the corner from the Roman Villa and a five-minute walk from the entrance to Mdina, has been around for over 100 years. Its name is somewhat more recent – dating back around 60 years when it was a popular meeting place for British troops stationed in Malta. Owner Martin Azzopardi (known in Rabat as 'Tas-Serkin' – most families in Rabat have a nickname) took over from his father Ninu around 40 years ago.
Indeed, the Crystal Palace hardly ever closes – you'll always be able to scoff pastizzi (small, flaky pastry puffs filled with mushy peas or ricotta cheese) aplenty as the palace shuts for a mere two hours on weekday nights; Fridays and weekends, it's open all night long – and this includes New Year's Eve!
Initially, the bar opened all night to accommodate British soldiers looking for a drink and something to eat round the clock. Once the forces left the islands, the bar still opened all night. Old habits die hard. This time, its nocturnal shift served local farmers bringing their produce to the pitkali market in Rabat in early hours of the morning for weighing and re-sale to local outlets. Once the market moved to Ta' Qali, there was another reason for Cystal Palace to open all night – this time, party-loving students from nearby discos and all-night taxi drivers became its night-time clientele.
Working at the bar, Martin sees the typical Maltese day go by over the course of 24 hours. As night becomes day, he sees the transition from night party-goers and night-shift workers to the very early risers going to their jobs and the first church-goers of the day.
The freshly baked pastizzi, which Martin himself prepares at his nearby bakery, attract a number of memorable local regulars, an array of Maltese from other towns and passing tourists who are wooed by the tasty smell.
Martin prides himself that his bar is one of the few, truly-specialised pastizzeriji left. He's not remotely tempted to sell other or more expensive items on his menu, such as pizza, baked rice and timpana (a Bolognaise sauce pasta baked with a pastry topping). Over here, what you get is, quite simply and quite deliciously, traditional pastizzi and bread rolls.
One regular customer, a young man from the other side of Malta, says he comes all the way here for the cheap and tasty food, the tea – in a glass just like his grandmother used to serve it – and good conversation with the lively and friendly characters who congregate in this historical bar and pastizzerija, all hours of the day and night.
Crystal Palace Bar, Triq San-Pawl, Rabat.
Christmas Eve – open til around 2pm most likely!
New Year's Eve – open til 4am!
pastizzerija
Previous Post Winter Solstice at Mnajdra Temples
Next Post Billboard banter, billboard Santa…(and merry Christmas!)
Victor Camilleri says
I can tell you how to make them,but it takes a knack I could never get. it my die with my mother who is the only one in my family left who can do it correctly. although my uncle has a shop in good.
does anyone know how to make pastizzi, ricotta and pea pasties? Can t find one anywhere. Best memory of maltese holiday.
Katerina says
OMG!! The pastizzi is goregous!! The best in Malta!! xx
Archives Select Month October 2016 September 2016 August 2016 July 2016 June 2016 May 2016 April 2016 March 2016 February 2016 January 2016 October 2015 August 2015 June 2015 May 2015 April 2015 March 2015 February 2015 November 2014 October 2014 September 2014 August 2014 May 2014 April 2014 March 2014 February 2014 January 2014 December 2013 November 2013 October 2013 September 2013 August 2013 June 2013 May 2013 April 2013 March 2013 February 2013 January 2013 December 2012 November 2012 October 2012 September 2012 August 2012 July 2012 June 2012 May 2012 April 2012 March 2012 February 2012 January 2012 December 2011 November 2011 October 2011 September 2011 August 2011 July 2011 June 2011 May 2011 April 2011 March 2011 February 2011 January 2011 December 2010 November 2010 October 2010 September 2010 August 2010 July 2010 June 2010 May 2010 April 2010 March 2010 February 2010 January 2010 December 2009 November 2009 October 2009 September 2009 August 2009 July 2009 June 2009 May 2009 April 2009 March 2009 February 2009
Featured Events 2016-17
Malta International Air Show 2016
Big Sporting Events in Malta 2016
Valletta Baroque Music Festival, 2017
© Copyright 2009-21 Malta InsideOut · All Rights Reserved ·
Privacy, Data & Cookie Policy · Disclaimer· Terms & Conditions

redpajama_set_name: RedPajamaCommonCrawl


text:
Community Companies C.I.C.
Companies • Professional, scientific and technical activities • Community Companies C.I.C.
Community Companies C.I.C.: address, phone, fax, email, website, schedule
Locality: Newcastle upon Tyne
Address: SPACEWORKS BENTON PARK ROAD Newcastle upon Tyne NE7 7LX
Director / CEO / Owner / Responsible person Community Companies C.I.C.: n\a
Schedule: Mon-Fri: 10-20, Sat-Sun: 9-14
Full information about Community Companies C.I.C.: finance, accounts. Download full bank's data, credit's history Community Companies C.I.C.. Cash In Bank, Total Assets, Current Liabilities, Net Worth, Employees, Turnover
Community Companies C.I.C. credits: registration number, status, company type, incorporation date
Company type: Community Interest Company
Sales: Less 416,000,000 GBP per year
Credit rating: Negative
Get full report from global database UK for Community Companies C.I.C.
Services Community Companies C.I.C.: PROFESSIONAL, SCIENTIFIC AND TECHNICAL ACTIVITIES, Legal and accounting activities, 69109 - Activities of patent and copyright agents; other legal activities n.e.c.
Addition activities' kind of Community Companies C.I.C.
238601. Leather and sheep-lined coats and hats
13110203. Coal pyrolysis
22610206. Preshrinking cotton fabrics
24310701. Porch columns, wood
24990704. Table pads: rattan, reed, and willow
36210112. Rotor retainers or housings
50159902. Trailer parts and accessories, used
50851000. Gaskets and seals
80110110. Neurosurgeon
Job on Community Companies C.I.C. vacancies, practice, working, traineeship, career
Now in Community Companies C.I.C. have no open offers. Look open vacancies in other companies
Postdoctoral Research Associate, Exeter
Company: University of Exeter
Salary: The starting salary will be from £28,936 up to £33,518 on Grade E, depending on qualifications and experience
This new full-time post is available immediately on a fixed term basis until 30 September 2019.
The University of Exeter is a Russell Group university that combines world-class research with very high...
Senior Evaluation Manager, London
Salary: £45,000 per year, plus benefits (more may be available for exceptional candidates)
Accountable to: Head of Evaluation
Contract: Full time permanent contract (external secondments may be considered for the period of 18-24 months)
About the Education Endowment Foundation (EEF)
The E...
C85713A - Mental Health Adviser, Newcastle Upon Tyne
Company: Newcastle University
Student Wellbeing Service Playing a key role in contributing to a service to students with long term mental health difficulties, you will enable them to access their stud...
Learning Support Assistants (Bank/Pool), Wakefield
Company: Wakefield College
Salary: £8.46 per hour
Various Hours – Term Time Only (as required, at short notice)
We require Learning Support Assistants to join our pool of staff who are available at short notice.
Wakefield College is one of the main...
Business Adviser, Coventry
Company: Coventry College
Salary £20,005 to £22,517 per annum (additional payment of 1% of income equal to and above £40,000 per month (target income).
Do you have a passion and flair for promoting and selling products to p...
Associate Professor of Evolutionary Ecology, Oxford
Salary: £45,562 per annum
The Department of Zoology proposes to appoint an Associate Professor or Professor in Evolutionary Ecology with effect from 1 September 2018. The successful candidate will be offered a Tutorial Fellows...
Research Fellow - Leverhulme Trust: Towards a Comprehensive Theory of Feedback Control for Chemical Reaction Networks (80476-087), Coventry
Company: University of Warwick
Fixed term contract for 3 years. You will undertake research on an exciting new project funded by The Leverhulme Trust. You will assist the Principal Investigator and project partners in the successfu...
Professor of Statistics, Bath
Company: University of Bath
The Department of Mathematical Sciences at the University of Bath is inviting applications for two professorial appointments in Statistics and its applications in all areas, including Uncertainty Quan...
Research Fellowships, 2018, Cambridge
Company: University of Cambridge
Applications are invited for Research Fellowships in Business and Management Studies and related fields intended for outstanding researchers early in their careers. The Fellowships offer an opportunit...
PhD Studentship "Low-Power Integrated Circuits for Medical Implants", Glasgow
Srinjoy Mitra
Project DescriptionAdvances in nanotechnology have not only made ultra-small electronic sensors ubiquitous but also allow them to permeate the human body. Such implanted devices interfac...
Full Professorship of Computer Aided Verification (Successor of Helmut Veith), Vienna - Austria
Company: Vienna University of Technology
Announcement of an open position at the Faculty of Informatics, TU Wien, Austria
Full Professorship of Computer Aided Verification (Successor of Helmut Veith)
The TU Wien (Vienna University of Tec...
PhD Studentship: Structure and Design of Cyclic Peptides for Drug Development, Coventry
Supervisors: Dr. Ann Dixon and Dr. Rebecca Notman
Funding availability: Leverhulme Trust (Funded)
Project description: This PhD studentship involves the development of new, predictive tools to unde...
All vacancies for Community Companies C.I.C.
Responds for Community Companies C.I.C.
Responds about Community Companies C.I.C.. Add respond for Community Companies C.I.C. to social networks
Community Companies C.I.C. in Facebook
Community Companies C.I.C. in VKontakte
Community Companies C.I.C. on map and Google map and street view
Community Companies C.I.C. is a Community Interest Company. Company number assigned by Companies House is 07359212. The company was incorporated on Friday 27th August 2010, so the company age is 5 years 9 months 23 days. The company registration status is Active. The company Standard Industrial Classification is 69109, so Community Companies C.I.C. is engaged in Activities of patent and copyright agents; other legal activities n.e.c.. Community Companies C.I.C. register address is SPACEWORKS, BENTON PARK ROAD, Newcastle upon Tyne (area code: NE7 7LX). The company changed its name 2 times. On Tuesday 7th September 2010 the name changed to Community Companies Limited.
Community Companies C.I.C. is a community interest company, located in Newcastle upon Tyne, United Kingdom. It is a limited by shares, British proprietary company. Since 2006, the company is headquartered in SPACEWORKS BENTON PARK ROAD Newcastle upon Tyne NE7 7LX. Community Companies C.I.C. was registered on 27-08-2010. We brings you a complete range of reports and documents featuring legal and financial data, facts, analysis and official information from Main UK Registry. Less 10 work in the company. Capital - 151,000 GBP, sales per year - Less 416,000,000 GBP. Community Companies C.I.C. is Community Interest Company.
The main activity of Community Companies C.I.C. is Professional, scientific and technical activities, including 9 other directions. Information about owner, director or manager of Community Companies C.I.C. is not available. Products made in Community Companies C.I.C. were not found. This corporation was registered on 27-08-2010 and was issued with the Register number 07359212 in Newcastle upon Tyne, UK; now status company is active.
Its contact method and company information is as below. In total the company used 0 trading names. You can also view reviews of Community Companies C.I.C., open vacancies, location of Community Companies C.I.C. on the map. For more information, visit the site or send request to contacts. The above data comes from the global Great Britain database which was updated on 2022


These are some common steps I take when I need to cleanup a WordPress database, either during a migration, during a build, or sometimes just to improve performance. All of these are SQL commands and would need to be executed on your database, either through the command line, a web interface like phpMyAdmin, or a GUI like Sequel Pro.
Note: always backup your database before running raw commands like this…ya know…just in case.
Another note: if you aren't using the default 'wp_' table prefix, you'll need to update the table names in the commands below.
You can also limit the number of revisions or turn them off entirely if you do not think you'll need them on your site by modifying the wp_config.php file and setting the 'WP_POST_REVISIONS' constant.
A lot of WordPress sites have no business having commenting enabled but the settings and theme aren't set to provide bots and spam from hitting the site anyway. First you should close up your discussion settings. And then use these commands to easily clear out all that garbage.
Next post: WordPress Digest #55: More WP 4.9's, GoDaddy Goes 'Pro', Unplug in Iceland, and More!
Previous post: WordPress Digest #54: WP 4.9, Yoast Disses Gutenberg, Disqus Breaches Your Data, and More!


text:
Is Georgia still a red state?
Dave Williams | Capitol Beat News Service
Photo by lightsource on Deposit Photos
Georgia Republicans rode a strong ground game and a ticket of proven incumbents to overcome financial and demographic challenges in last year's elections, according to a new report.
The 2022 Impact Report was released Tuesday by former U.S. Sen. Kelly Loeffler, R-Ga., who chaired the conservative voter mobilization group Greater Georgia during the 2022 election cycle.
"Despite national media narratives, 2022 was a record-breaking year for Georgia Republicans," Loeffler wrote in a news release. "Thanks to sustained and dedicated work on the ground, a commitment to growing the conservative movement, and proven Republican leaders, Georgia is a red state."
Loeffler's words ring true when looking at last year's election results in Georgia. While Democratic U.S. Sen. Raphael Warnock, D-Ga., won a full six-year term over Republican challenger Herschel Walker, the GOP captured all eight statewide constitutional offices.
The incumbent-heavy Republican ticket included Gov. Brian Kemp, Secretary of State Brad Raffensperger, and Attorney General Chris Carr.
Those GOP victories came despite Democrats vastly outraising Republicans, particularly in the Senate and gubernatorial races. Warnock outspent Walker by $100 million, and Democratic gubernatorial nominee Stacey Abrams outspent Kemp by $30 million.
Loeffler attributed the Republicans' success to a ground campaign that included direct contact with voters via telephone, text messages, targeted digital ads and direct mail. The GOP reached millions more though television and radio ads.
Republicans worked to diversify the conservative movement, holding more than 100 voter registration drives at colleges, churches, grocery stores, and gas stations. Outreach events were held with women, young voters, and with the Hispanic, Asian and Black communities.
Part of that outreach included educating voters on the new voting reforms the Republican-controlled General Assembly passed in 2021 requiring Georgians voting absentee to provide identification and restricting the location of absentee ballot drop boxes.
Nearly 340,000 "disenfranchised conservatives" had stayed home during the January 2021 runoff that elected Democrats Warnock and Jon Ossoff to the U.S. Senate because of concerns over election integrity, according to the report.
Georgia Democrats weren't without some successes last fall. Besides Warnock's victory over Walker, Democrats dented Republican majorities in the General Assembly, gaining two seats in the Georgia House of Representatives and one seat in the state Senate.
The report concludes with a challenge that Republicans must work hard if they are to turn back efforts by Democrats to turn Georgia blue.
The state is changing – economically, demographically, and politically – but that change is positive as long as conservatives put in the work," Loeffler wrote. "If we continuously adapt to this dynamic environment, then conservatives will have the infrastructure and mobilization needed to succeed in even greater numbers in 2024 and beyond."
This story is available through a news partnership with Capitol Beat News Service, a project of the Georgia Press Educational Foundation.


text:
Reliance Digital LYF Wind 4S With 4000mAh Battery Launched: Specifications, Features And More
Reliance Digital has launched the company's latest smartphone in Wind series – Reliance Digital LYF Wind 4S in India at a price tag of Rs. 7,699. It comes in Black, Brown & Blue colour and will be available at Reliance Digital stores across the country. The smartphone is bundled with USB OTG adapter. It comes with VoLTE support and reliance Jio Welcome offer under which users get free & unlimited access to Jio's suite of services, including voice, data & its bundled apps till December 31st, 2016. At such a price tag, it will compete with Coolpad Mega 2.5D, Moto E3 Power and more.
On the specifications front, it features 5-inch HD display with a resolution of 1280 x 720 pixels and powered by 1.3GHz quad-core Qualcomm Snapdragon 210 (MSM8909) processor which is paired with Adreno 304 GPU & 2GB of RAM. it runs on Android 5.1 Lollipop operating system and it has 16GB in-built memory which can be expanded further up to 32GB via microSD card.
On the photography front, it features 8-megapixel rear-camera with LED flash and 0.3-megapixel VGA front-facing camera for selfie & video-calling. The camera comes with features include ISO, exposure, white balance, anti-banding, zero shutter lag, face detection, HDR mode, red-eye reduction, continuous shot, touch up mode, 6x digital zoom, and panorama shooting.
It has dual SIM support and connectivity features like 4G VoLTE, WiFi 802.11 b/g/n, Bluetooth 4.0, GPS.
It packs 4000mAh battery which claims to offer up to 34 hours of talktime on 4G & standby time of up to 634 hours.
It supports various gesture-based functions like double click to wake, slide down to launch camera, and slide up to unlock. Above all, Reliance is also offering a one year manufacturer warranty and one year extended warranty on the handset. The extended warranty, has to be manually activated through the MyLyf app.
Reliance Digital LYF Flame 7S Specifications
Display: 5-inch HD display with a resolution of 1280 x 720 pixels
Processor: 1.3GHz quad-core Qualcomm Snapdragon 210 (MSM8909) processor with Adreno 304 GPU
Memory: 2GB RAM, 16GB internal storage, expandable memory up to 128GB with microSD
Operating System: Android 5.1 (Lollipop)
Rear-Camera: 8MP rear-camera with auto-focus, LED Flash
Front-Camera: 2MP front-facing camera
Dimensions: 144.7x73x9mm
Connectivity: 4G VoLTE, WiFi 802.11 b/g/n, Bluetooth 4.0, GPS
Battery: 4000mAh battery
Categories: Mobile Phones


text:
Province of Alberta Overview
Alberta Trans-Canada Highway
The westernmost of Canada's three Prairie provinces, Alberta covers an area of some 661,185 square kilometers. The southwestern section of the province is dominated by mountains and the foothills that build up from the prairie landscape. The southeastern portion of the province is part of the interior Great Plains of North America and has rich farmland in the north, livestock grazing in the south, and includes some near-desert canyons in the middle (around Drumheller). The northern half of the province is classic Canadian Shield country, most of the province's boreal forest and lakes.
The native people, whose ancestors crossed the Bering Sea from Asia thousands of years ago, were the first people to live in Alberta. They worked with and trapped for the European fur traders who arrived in the 1680s. In 1870, the region became part of the Northwest Territory of Canada and was administered from the newly-formed province of Manitoba. When the railroad was completed through the southern portion of the province in 1885, the region's population grew quickly. In 1905 Alberta became a province, named for Princess Louise Caroline Alberta, a daughter of Britain's Queen Victoria, and Edmonton was declared its capital city.
The province has a population of 4.4 million residents (2019) with two-thirds of its population living in the two largest cities, Calgary (1.3 million) and Edmonton (also 1.3 million). The balance of the population is spread around the province, though now mostly urban in nature.
Alberta Economy
Alberta has one of the world's most productive agricultural economies, producing about 20 percent of the value of Canada's annual output. Approximately 22 million hectares of cultivated and uncultivated land are used as pasture and forage for livestock. While wheat remains the primary crop, the production of new crops continues to expand as the industry diversifies. The province maintains the largest livestock population in Canada, and is famous for its "Alberta beef."
Known as Canada's "energy province," Alberta has more than 80 percent of the country's reserves of conventional crude oil, over 90 percent of its natural gas, and all of its bitumen and oil-sands reserves. The oil and natural gas sector has responded successfully to the challenges of unstable energy prices in the 1980s by significantly reducing production and operating costs. While most of the production is centred around Edmonton, most of the oil company headquarters are in Calgary.
Over half the province (approximately 350 000 sq km) is covered by forests, of which half are classified as commercially-productive forest land, containing both hardwood and softwood species.
Alberta manufacturing industries include petrochemicals and plastics, forest products, metals, machinery, aerospace and transportation equipment. Food and beverage processing is the largest manufacturing industry sector in Alberta.
The service sector accounts for two-thirds of Alberta's employment, including such industries as business and financial services, transportation, retail trade, health and education services and tourism. The province offers many attractions to visitors, in particular the magnificent Rocky Mountains, centered around Jasper and Banff national parks.
Lake Louise-Calm Reflection - Roberti Nickson


text:
3 Ways Troops Deploying Without Phones Can Rely on the USO
U.S. troops deploying to the Middle East in the wake of escalating tensions with Iran are being ordered to leave their phones, computers and personal electronic devices behind. Here's how the USO is making sure service members can still call home, even when thousands of miles away.
Hyten Visits Troops in Romania During USO New Year's Tour
Hyten is hosting the USO tour on behalf of Gen. Milley and brings Washington Nationals players Aaron Barrett and Adam Eaton, comedians Scott Armstrong and Matt Walsh, actor Brad Morris, country music band LoCash, DJ J Dayz and MMA Fighters Illima-Lei Macfarlane and Felice Herrig on the multi-day morale-boosting trip.
5 Ways You Can Support the Troops in Times of Conflict
As tensions rise throughout the Middle East, Americans all around the country are asking one thing: what can we do to support the troops? While our men and women in uniform are facing dangers on the front lines, here are a few ways to ensure that service members and military families are remembered and supported during times of conflict.
The USO Stands Ready to Support Troops Deployed to the Middle East
In light of escalating tensions with Iran and throughout the Middle East region, the USO stands ready to continue to support service members and their military families - both here at home, and on the front lines.
How One Navy Veteran is Bringing Awareness to Military Suicides By Running Around the World
A young U.S. Navy veteran is breaking running records and aiming to be the first American to run around the world - all while raising awareness for military veteran suicides and mental health.
Five Army Siblings Spend Their Last Holiday Season Together Before Basic Training
Five siblings from the same family each raised their right hand and chose to join the Army. This past holiday season was their last all together as a family before the youngest siblings head to Basic Military Training, making their time together all the more special.
POW Stanley Wojtusik Recalls Battle of the Bulge
Cut off from food, ammunition, and supplies, Cpl. Stanley Wojtusik was among hundreds of American soldiers with the 422nd Infantry Regiment forced to surrender on December 19, 1944 during the Battle of the Bulge.
How the USO Builds Community for Navy Students in Florida
Each year, 21,000 service members uproot themselves to move to Pensacola, Florida, and attend courses at the U.S. Navy's IWTC Corry Station. And each year, the USO is there to welcome them, providing a home away from home to every student who walks through its doors.
A Home Away from Home in Turkey
For service members deployed to Incirlik, Turkey, it can be challenging to feel at home when far away from everything familiar. But troops are finding comfort through morale-boosting programs at their nearby USO location.
9 Moments Your Donation Helped Make a Difference in 2019
Without your generosity, the USO's work would not be possible. Here are just nine moments your donation helped fuel in 2019 through the USO.
G.I. Joe in the Snow Helps Build Community in Alaska
A grizzled uncle to "Elf on the Shelf," G.I. Joe in the Snow is a military spin on the classic child holiday toy. USO Fairbanks team members have hidden these little action figures all across base throughout the month of December, spreading joy and boosting morale.
Building New Traditions: How Two Related Sailors Created a Home for the Holidays
Without even knowing it, and with more than 20 years between their time in service, learn how two related sailors used the power of their air conditioning units to bring themselves closer to home for Christmas.
Do You Know These 3 Major Military Events That Happened on Christmas?
Over the history of the U.S., several big military actions have taken place on December 25. Here are three noteworthy ones.
Reading 'The Night Before Christmas' in Afghanistan with the Bob Hope Legacy Reading Program
Miles away from home and family, it can be difficult for deployed service members to celebrate the holidays. One service member in Afghanistan got into the spirit of the season through the USO's Bob Hope Legacy Reading Program, which he used to read the classic Christmas story, "The Night Before Christmas," to his children back home.
'Delivering Goodness' to Service Members During the Holidays Comes Full Circle For This Marine Veteran
A Marine Corps veteran shares how the arrival of a USO holiday care package during his deployment in Iraq has now come full circle in his current work with FedEx Logistics, where he gives back to today's military.
Single Service Members Celebrate the Holidays Overseas with the USO
Being stationed overseas during the holidays can be challenging for our men and women in uniform, but it is especially difficult for single service members who have no family near them at their duty station. These service members have made the best of the holiday season by attending USO holidays events and giving back to their military community.
What It's Like to Celebrate the Holidays While Deployed
Over the course of the U.S. military's existence, over 40 million men and women have served, many missing important life events, and many – of course – missing the holidays. Soldiers stationed in Kuwait share what it's like to be deployed and away from family over the holidays.
Meet the 2019 USO Volunteers of the Year
These two USO volunteers exemplify what it takes to keep service members and military families connected to family, home and country. Meet our 2019 USO Volunteers of the Year!
Veterans Share Their Memories of Bob Hope USO Christmas Shows
Bob Hope entertained Americans for decades, but his most impactful shows were for soldiers deployed overseas during the holidays. Veterans of the Vietnam War and Desert Storm shared their memories of Bob Hope USO Christmas Shows during their deployment.
Military Families Enjoy a Holiday Twist on Story Time at USO Fort Drum
Military families in Fort Drum enjoyed a holiday twist on the USO's monthly story time program by reading Dr. Seuss's classic book, "How the Grinch Stole Christmas."
What You Need to Know About the History of the Army-Navy Game
Once again, the U.S. Military Academy at West Point and the U.S. Naval Academy will meet on the gridiron for "America's Game," which is steeped in traditions. Here are a few facts about the history of the Army-Navy Game that you may not know.
Soldiers Stay Connected to Home While Deployed to Kuwait During the Holidays
This year, more than 4,000 U.S. National Guard Soldiers in the 30th Armored Brigade Combat Team are deployed in the Middle East. While they are focused on their mission, thoughts of home are common and soldiers reflect on their service and how they will spend this holiday season thousands of miles away.
A (Gingerbread) Home for the Holidays
For service members and military families who are separated by deployment, the holidays can be a challenging time. This year, the USO collaborated with Google Nest to help make Camp Pendleton a little more festive with a life-size gingerbread house and the ability to stay connected despite the distance.
10 Moments That Defined the National Guard
Established in Massachusetts in 1636, the force we now know as the National Guard sustained and protected the infant colonies and eventually helped bring an end to Britain's colonial rule. Today, they can be found across the globe, providing muscle and resources in Afghanistan and rushing to the aid of their communities at home, just like their predecessors did.
Did you Know NORAD's Famous Santa Tracker Started as a Fluke?
Tracking Santa on his trek across the world has been a holiday tradition for many American families for decades, but did you know that it all started because of a mistake?
6 Need-to-Know Facts About the 7th Infantry Division
In celebration of the 7th Infantry Division's birthday on December 6, here's six need-to-know facts about the unit.
For 40 Years, Bob Hope USO Christmas Shows Brightened the Holidays for Deployed Troops
From World War II to Desert Shield, the Bob Hope spent scores of December days on the front lines entertaining service members all around the world.
Meet the 2019 USO Service Members of the Year
The USO is honored to name the 2019 USO Service Members of the Year. Get to know this year's honorees!


text:
Cerkiew św. Eliasza w Moskwie – prawosławna cerkiew w Moskwie, w rejonie Chamowniki
 Cerkiew św. Eliasza w Moskwie – prawosławna cerkiew w Moskwie, na terenie dawnej wsi Czerkizowo

redpajama_set_name: RedPajamaWikipedia


text:
Шеврёй () — французский термин, обозначающий в Европе косулю, а в Северной Америке белохвостого оленя.
 Шеврёй (Chevreuil) — французский музыкальный дуэт.
 Шеврёй, Жак дю (1595—1649) — французский учёный.

См. также
 Шеврёль


Alcohol Delivery CR5, Coulsdon - YES, we offer an alcohol delivery service that also delivers booze to CR5! Better news still - our alcohol delivery to CR5 takes just 15-35 minutes and is available all night long / 24 hours!! We open from 10:30 pm and close at 6:00 am Sunday-Thursday, come the weekend, we offer alcohol delivery to CR5 between 10:30pm-8:00 am!
Fast Late Night Alcohol Delivery to CR5!
Are we guessing you need alcohol? Well if you happen to live in CR5, Coulsdon, we can help. At 24 Hr Drinks, we offer a same day / 24-hour alcohol delivery service to CR5 that's alcohol delivery near you! Yes, late night alcohol - direct to your door (hotels, private residences and offices only) in CR5 - pay cash, card or PayPal.
We boast an incredibly fast drinks delivery to CR5 in Coulsdon. We deliver beers, wine, champagne, spirits, snacks such as pizza and cigarettes. We stock over 10 different beers, 12 wines, over 20 spirits and 6 different champagnes.


text:
2018 Madison Regional Preview
Posted by: LightCore in Articles June 2, 2018	0
Written by Nicholas Borghi and Jeremy Gross
(One Typical Wisconsin Citizen out of 5
This regional is going to be at a historic low. With there being a very real chance of having less than 100 players, this regional will be easier than almost any other that we've covered.
Players Vying for an Invite
Placing Needed Player Name Current CP
Top 32 Collin Heier 372
Top 32 Alexander Williams 363
Top 32 Nate Innocenti 358
Top 32 Diana Bros 355
Top 32 Tommy Cooleen 353
Top 32 Zheyuan Huang 352
Top 32 Tyler Miller 350
Top 16 Daniel Thorpe 339
Top 8 Sean Bannen 318
Top 8 Jake Smith 312
Top 8 Alex Faust 311
Top 4 William Marks 295
Top 4 Ethan Simpson 292
Top 4 Alex Collins 291
Top 4 Andrew Nowak 284
Top 4 Logan Mazur 281
Top 4 Justin Frys 277
Top 4 Mitchell Beyer 275
Needs Finals Alex Arand 257
Needs Finals Kamaal Harris 254
Needs Finals Corey Esmeier 254
Needs A Win Gavin Michaels 236
Needs A Win Justin Burns 220
Needs A Win Jack Thackrah 214
Justin Crubaugh
Last time we saw Crubaugh in a preview article, it was when we decided to pick him as Smart Money for the Charlotte, North Carolina Preview article. Our style has updated since then, so let's go a bit more in-depth. Justin is probably one of the most dedicated and strong players in our community. Constantly going X-2 in most of his events since 2016. Not to mention, Crubaugh is dedicated to both his wife of many years, and his religion. Justin is also one of the nicest people in the community, easy for a player of any caliber to talk to.
For his accomplishments, Crubaugh has a load of them in his 3 years of play. He stormed onto the scene at Madison Regionals 2016 with a 7-0 Swiss record and finished in the Top 4. He would later finish in the Top 16 of United States Nationals in the same year. To compound on this, he has been a Regional Runner-Up twice at the 2016 Ft. Wayne regional and the 2017 Memphis Regional. Earning a Worlds invite all 3 years he's played, and currently fighting for a Top 8 spot in North American CP, with a solid 970 CP putting him at 7th place in NA.
Alex Underhill
Underhill is a player who has been consistently strong ever since he showed up on the scene back in 2015. The 22 year old Northern Illinois University student has been scene as one of the strongest competitors as of late. Currently number 8 in CP with 867 points, Alex is safe in his spot unless Nick Navarre has a strong finish.
Underhill had a very strong start in 2015 with his run to the Top 8 of US Nationals, and then missing the Worlds invite due to the structure that season. Since then, he has gotten Top 8 at the 2016 Collinsville Regional, made Day 2 of both the 2016 and 2017 World Championships. He finally showed up strong by claiming his first ever regional win at the 2017 Collinsville Regional, and then shortly compounded that with a win at the 2017 Ft. Wayne Regional. This two time Regional Champion will need to do well this weekend to try and close up a lead in the race for Top 8.
Brian Youm
A second year master and Northern Virginia native, Youm has gained some fame on VGC twitter recently for the excellent team drawings he has done for friends who cut regionals. He's also been on a serious hot streak at regionals lately, and a strong finish here could potentially put him in day 2 contention going into Columbus, despite not being in the snowball at all this year.
That hot streak has resulted in Youm collecting a pair of MSS titles in the DC area, top 8 at Charlotte regionals, and top 4 at Roanoke regionals. Combine that with top 16 at Hartford regionals and top 32 at Memphis regionals and you have quite a breakout season. Youm currently sits in the 12th spot in the North American CP standings, but because of the snowball structure is still 244 CP out of 8th. He'll need to see his third consecutive regional cut and a strong finish at Columbus to break into top 8.
Leonard Craft III
You may know Craft for his game mechanics research. Or for his newly coded BoTTT III which took over for dingram's BoTTT Junior in the Showdown room. Or for his fondness for a certain stall-oriented pink blob. Or for his moderator status both on Showdown and in our Trainer Tower forums. Any way you look at it, there's no denying that Craft has made himself a very noticeable member of the VGC community of late. His interest in the inner workings of the game makes a lot of sense, as he's currently majoring in computer science at the University of Central Missouri.
Craft's season has been mostly propelled by his thorough domination of midseasons in his region. Through the first 3 MSS seasons, he has 2 wins, 2 second place finishes, and 2 top 4 finishes, good for a whopping 244 CP off those alone. He has also collected a regional brick this season, finishing top 4 at Collinsville regionals. In previous years, he was able to make it to the Top 8 of the 2016 US National Championships, as well as Top 8 at two Regionals in other years.Craft currently sits at 498 CP, which still leaves a chance for day 2 worlds with a strong Columbus finish if he can win this regional.
Tommy Cooleen
Cooleen is one of the friendliest players in our small community, and as such has a very wide network of friends in which he can talk to. He's friendly to everyone and always willing to help people out. As of right now, Tommy is a 19 year old player from the New York New Jersey area and currently studies Computer Science at Adelphi University. He also enjoys playing Pokemon Go pretty often, same with Jake Muller (who we'll get into later).
Cooleen may not be a fan of the Kanto region, but he's certainly done well with its native Pokemon. His main claim to fame is a rain-fueled domination of 2017 internationals, with a trio of top 8 finishes. In addition, in previous years he's known for making Top 8 at multiple regionals, and two Top 4's. Unfortunately, those Top 4 performances were during 2016, where they didn't give trophies to Top 4, so Tommy Cooleen does not currently have an official Pokemon Trophy. Tommy will be looking to rectify this on Sunday.
Andrew Nowak
That's right everybody, he's back. And you better bring your Pheromosa answers this time…
Nowak has shown to be a very good and popular player throughout his VGC career. As we talked about with Tommy Cooleen, Drew has a very wide group of friends with who he hangs out with, builds teams with and in general just has fun with. He has also shown to be popular outside of Pokemon. He has a very avid social life at college. He currently studies Sports Management at Troy University, and has taken up a leadership position in his Fraternities local chapter. He's also known as one of the more athletic people in our community, being heavily invested in his local intramurals such as Basketball, Beach Volleyball and Softball. Not to mention that throughout High School, Drew was on the Varsity Golf team.
Back to the Pokemon side of things, we can talk about Andrew's tons of accomplishments. He started off with a Top 16 at the 2015 Collinsville Regional, and would later return to that same Top Cut the next year. However this time, he won what would be his first Regional Championship. That same year of 2016, Nowak made it all the way to the Top 24 of the World Championships. After that, Drew won both the 2017 Dallas and Madison Regional Championships. In addition, Andrew made it back to the second day of the 2017 World Championships, where he didn't do so hot. Nowak will be looking to finish up his Worlds Invite this weekend.
Jake Muller
Muller had the chance to snowball early this season after strong finishes at the Anaheim Open and Ft. Wayne regionals. He chose instead to take a well-deserved break from VGC, a choice that not many players would make, but one he does not regret at all. In the meantime, Muller graduated from the University of Oklahoma with a degree in meteorology and was accepted into Texas A&M to start his master's degree in the fall. Even amidst all the exciting developments in his academic life, Muller still managed to earn his worlds invite at Charlotte regionals in March.
Muller's season has been carried primarily by regionals points. A top 4 finish at the Anaheim Open and a top 8 at Ft. Wayne regionals account for over half his invite, and a pair of top 16's brings him to 390 CP on 4 regional finishes alone. An MSS top 4 puts him over the top at 422.
Gavin Michaels
Michaels is headed to Singapore this summer for an internship, an exciting opportunity that has put his VGC career somewhat on hold recently. He was unable to attend Toronto regionals due to not having his passport while obtaining his Singapore visa, and will be on the other side of the world when Columbus happens. Michaels has acknowledged that this event is probably his last chance at a worlds invite, and he needs to win to get it.
Winning a regional is a tall order, but Michaels has done it before. Twice, in fact. He earned himself a day 2 invite last year by winning both California regionals of the 2017 season. He has even gone one step further than that, winning US nationals in 2013. Michaels has proven he can pull off big finishes at season-defining events. Can he do it again?
2019 World Cup of VGC Announcement
Trainer Talks – A look at Worlds and Mentality
American VGC Invite Distribution


text:
Barack Obama takes on American football
By The Economist | WASHINGTON
I DON'T know about my colleagues, but there is one of Barack Obama's policies that I am prepared, right now, to endorse unequivocally: his desire, stated on 60 Minutes last night, to end the Bowl Championship Series system for American college football. Even the casual fan will note that the scheme relies on a series of volatile, arbitrary and capricious polls of so-called experts (as John McCain
might say
) to select the top two teams in the country to play for the national title. It's as if the parties' presidential nominees were chosen by polls of political journalists and congressional staffers. And we all know how that would have turned out this last election cycle: Hillary Clinton vs Rudy Giuliani.
The system eliminates a number of excellent teams from contention out of hand. Teams with stellar records that get edged out of plum bowl games feel cheated—sometimes rightly. Teams that find themselves on top no doubt wonder if they're playing the right opponents. Here's what Mr Obama has to say:
"If you've got a bunch of teams who play throughout the season, and many of them have one loss or two losses, there's no clear decisive winner. We should be creating a playoff system," he told reporter Steve Kroft.
According to Obama's proposed system, eight teams would play over three rounds to settle the national champion.
"It would add three extra weeks to the season," he said at the conclusion of a wide-ranging interview. "You could trim back on the regular season. I don't know any serious fan of college football who has disagreed with me on this. So, I'm going to throw my weight around a little bit. I think it's the right thing to do."
Amen. Not that playoffs will make the system perfect. Great teams can underperform in the post-season, letting a weaker one by. (That, after all, is what many Clinton supporters think happened in the Democratic primaries this year, to abuse the analogy.) But at least the whims of individual psychology will play less of a role in deciding who goes where. So what are the chances Mr Obama will succeed in instituting a playoff system for college football? Let's just say that there are some things even he can't change.
(Photo credit: Reuters)
More from Democracy in America
The fifth Democratic primary debate showed that a cull is overdue
Thinning out the field of Democrats could focus minds on the way to Iowa's caucuses
The election for Kentucky's governor will be a referendum on Donald Trump
Matt Bevin, the unpopular incumbent, hopes to survive a formidable challenge by aligning himself with the president
A state court blocks North Carolina's Republican-friendly map
The gerrymandering fix could help Democrats keep the House in 2020


Congratulations to Amy and Lewis who finished in the top 50 in the cross country event in Ipswich at the weekend. Amy came 34th in the region and 7th in the county. Lewis came 42nd in the region and 9th in the county. Well done!


This topic contains information, advice, reflections, suggestions, warnings, etc., about life at the [[http://www.rochester.edu][University of Rochester]]'s [[http://www.cs.rochester.edu][Department of Computer Science]], located in [[http://www.ci.rochester.ny.us/][Rochester]], [[http://www.state.ny.us/][New York]]. Edit this topic to add links to related topics. ---+++ Department * [[CommitteeAssignments][Committee Assignments]] * URCS [[MarchMustacheMadness][March Mustache Madness 2006]] * URCS [[MarchMustacheMadness2007][March Mustache Madness 2007]] * URCS [[MarchMustacheMadness2008][March Mustache Madness 2008]] * [[RiverRun08][2.60 miles River Run, September 12, 2008]] ---+++ Area Attractions * UR's [[http://sa.rochester.edu/RED/][RED]] Program is an easy way to save money at nearby restaurants.


text:
Q: Rendering Multiple Animated Components in React Native Only Triggers Once So I have created a custom animated component AnimatedLabel that just wraps a Text in react-native. The component works fine, but it only plays once as in the case below.
Here is the code for AnimatedLabel
import React, {useRef, useEffect, useState} from 'react';
import {Animated} from 'react-native';
import styled from 'styled-components/native';

const Label = styled.Text`
  padding: 10px;
  font-family: 'Inter-Regular';
  color: #3a3a3a;
  opacity: 0;
  font-size: 20px;
`;
const MainLabel = Animated.createAnimatedComponent(Label);
export const AnimatedLabel = props => {
  const [animatedValue] = useState(new Animated.Value(0));
  const opacityValue = useRef(animatedValue).current; // Initial value for opacity: 0

  useEffect(() => {
    Animated.timing(opacityValue, {
      toValue: 0.99,
      duration: 1500,
      useNativeDriver: true,
    }).start();

    // reverse the animation on unmount
    return () => {
      Animated.timing(opacityValue, {
        toValue: 0.01,
        duration: 1000,
        useNativeDriver: true,
      }).start();
    };
  }, [opacityValue]);

  return (
    <MainLabel style={{opacity: opacityValue}}>{props.children}</MainLabel>
  );
};

And here is where I try to use it in a multistep form.
import React, {useState} from 'react';
import styled from 'styled-components/native';
import {AnimatedLabel} from '../../../components/animated/labels';
import {AnimatedView} from '../../../components/animated/views';
import Button, {ButtonTypes} from '../../../components/buttons';
import {DefaultInput} from '../../../components/inputs/index';

const Container = styled.SafeAreaView`
  display: flex;
  height: 100%;
  width: 100%;
  justify-content: center;
  align-items: center;
  background-color: white;
`;

export default function NewAccount() {
  const [step, setStep] = useState(0);

  const handleNext = () => {
    if (step < 10) {
      setStep(step + 1);
    }
  };

  const handleBack = () => {
    if (step === 0) {
      setStep(0);
    }
    setStep(step - 1);
  };

  switch (step) {
    case 0:
      return (
        <Container>
          <AnimatedLabel>Welcome, What's Your Name?</AnimatedLabel>
          <AnimatedView>
            <DefaultInput placeholder="Name" />
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 1:
      return (
        <Container>
          <AnimatedLabel>What's Your Email?</AnimatedLabel>
          <AnimatedView>
            <DefaultInput placeholder="Email" />
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 2:
      return (
        <Container>
          <AnimatedLabel>What's Your Password?</AnimatedLabel>
          <AnimatedView>
            <DefaultInput placeholder="Password" />
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 3:
      return (
        <Container>
          <AnimatedLabel>Confirm Your Password?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 4:
      return (
        <Container>
          <AnimatedLabel>What's Your Phone Number?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 5:
      return (
        <Container>
          <AnimatedLabel>What's Your Address?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 6:
      return (
        <Container>
          <AnimatedLabel>What's Your City?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 7:
      return (
        <Container>
          <AnimatedLabel>What's Your State?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 8:
      return (
        <Container>
          <AnimatedLabel>What's Your Zip Code?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 9:
      return (
        <Container>
          <AnimatedLabel>What's Your Country?</AnimatedLabel>
          <AnimatedView>
            <DefaultInput placeholder="Country" />
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    case 10:
      return (
        <Container>
          <AnimatedLabel>What's Your Date of Birth?</AnimatedLabel>
          <AnimatedView>
            <Button type={ButtonTypes.LINK} onPress={() => handleBack()}>
              Back
            </Button>
            <Button onPress={() => handleNext()}>Next</Button>
          </AnimatedView>
        </Container>
      );
    default:
      return (
        <Container>
          <AnimatedLabel>Welcome , What's Your Name?</AnimatedLabel>
        </Container>
      );
  }
}

The animation only works on step 0. For other steps, it just appears as nothing happened. No animation whatsoever. I also noticed that the component doesn't fade out when unmounting.
Is there a way to fix this?
I've tried implementing this in other ways but still no headway.

redpajama_set_name: RedPajamaStackExchange


So since Mr. Hungry's Food Sensitivity test, things have been a little rough but he is hanging in there! What's been challenging is many of the vegan dairy substitutes have pea protein in them which came up as a level 2 for him. I thought I'd review some of the products we've tried as substitutes in case you're curious!
This one is tolerable if you really really really miss bread. Mr. Hungry kind of likes it, but he honestly prefers corn tortillas over this. It toasts nicely almost with nooks and crannies of an english muffin. However, there is some thought out there that millet flour, although gluten free, is also very tough on the stomach especially for those that have a gluten sensitivity. Mr. Hungry likes corn tortillas better anyway, so he eats this in limited quantities.
So gross, I used it in peanut butter protein balls, which covered up the grittyness nicely but I couldn't get rid of it fast enough. Not a fan.
We waited two weeks for this one to come into the local Hi-Health now I think it will be the only protein we eat. It's delicious, super sweet though so might be a little much for those of you that don't love super sweet things. The downside is that it doesn't "shaker bottle" well, it really needs to be blended. However, when you do blend it, it's super creamy and delicious. I plan to use it too once we are totally out of whey protein, it's good to rotate through different types of protein and I get enough whey in quest and UCAN bars to last me a lifetime I'm sure.
Literally the only mayo we could find without eggs, pea protein, or canola oil. Super expensive for a jar of "mayo" but it makes Mr. Hungry really happy so it's worth it.
I've never known Mr. Hungry to be super obsessed with bars, he almost just tolerates them because they are less mess and hassle in the morning. That being said, he ate these ones with little complaint. He said they were crunchy which he liked.
Not perfect by any means, these bars have too much added sugar for me. However, they meet his guidelines and are another quick easy option for him.
I'm not a big cracker person, in fact it's hard for me to have chips or crackers in the house because I find them the opposite of healthy. Easy to overeat and high in carbohydrates their just something I've gravitated away from over the years. However, Mr. Hungry NEEDS crackers part of his life, and with his metabolism weight gain isn't an issue. He loves these crackers for dipping in tuna salad!
I thought these were better than anything I could have whipped up on my own for him without yeast, eggs, or dairy. He said they were "okay." So he obviously wasn't thrilled with these ones, I'd eat them whether I had to or not… okay I did have them. This is why I don't eat crackers, I'd rather have a cookie! Choices people!
Hope you have a great day! Let me know if you have anything to add to the list!
My son has an intolerance to the following and is finding it very difficult to find nice snacks etc to eat.
is there anything that you are able to suggest that might be ok for him to eat?