The Site is available for informational purposes only. Without limiting anything else in these Terms or otherwise, EMEX is not responsible for any errors or omissions in the Site or Site Material (as defined below), and EMEX is not responsible for any errors or omissions in the Site or Site Material. Accordingly, EMEX authorizes the accessing, viewing, or using of the content, materials, or services available on or through this Site for personal or noncommercial purposes only in accordance with these Terms.
As between any user and EMEX, EMEX owns or licenses all data, content, graphics, forms, artwork, images, photographs, functional components, audio clips, video clips, software and software concepts and documentation and other material on, in or made available through the Site ("Site Material"), as well as the selection, coordination, arrangement, and organization and enhancement of the Site Material. All Site Material is protected pursuant to United States copyright, trademark, patent and other applicable laws. You may print and download portions of material from the different areas of the Site solely for your own internal, non-commercial use, provided you do not to remove or alter any copyright notice or any other proprietary notice on any Site Materials. As between any user and EMEX, all names, trademarks, service marks, certification marks, symbols, slogans or logos appearing on the Site are proprietary to EMEX. Use or misuse of these trademarks is expressly prohibited and may violate federal and state trademark law. Under no circumstances will you have any rights of any kind in or to the Site, other than the right to use the Site in accordance with these Terms.
You agree that you will not use the Site for: (a) any illegal or unauthorized purposes that violate any laws (including import, export and copyright laws); (b) modifying, adapting or hacking into the Site or for modifying another website so as to falsely imply that it is associated with EMEX; (c) uploading, posting, hosting, or transmitting unsolicited email, SMSs, "spam" messages, worms or viruses or any code of a destructive nature; (d) contacting any other user of the Site who has requested not to be contacted; (e) stalking or harassing anyone; (f) posting irrelevant User Content (as defined below) or otherwise imposing an unreasonable or excessively great amount of User Content on the Site; or (g) attempting to gain unauthorized access to EMEX's computer system or engaging in any activity that interferes with the performance of, or impairs the functionality of the Site or any services provided through the Site. You further agree not to modify, distribute, copy, exchange, disseminate, archive, reproduce, transmit, publicly display, publicly perform, broadcast, retransmit, publish by hard copy or electronic means, adapt, edit, compile or create derivative works of the Site Material or otherwise use the Site Material in any way for any purpose without prior written approval from EMEX. You may not frame, capture, harvest, or collect any part of the Site or Site Materials without EMEX's prior written consent. You acknowledge and agree that the unauthorized use of the Site Material could cause irreparable harm to EMEX and that in the event of such unauthorized use, EMEX shall be entitled to an injunction in addition to any other remedies available at law or in equity.
The Site allows you to contribute content, information, text, files, graphics, personal listings, messages, postings, and other materials and information for access, use, and commentary by other users to the Site ("User Content"). Failure to comply with these Terms, including any rules posted on the Site pertaining to User Content, may result in immediate removal of any User Content. By posting User Content, you represent that you have the full legal right to provide the User Content and that use of the User Content by the Site and all other persons and entities will not: (a) infringe any intellectual property rights of any person or entity or any rights of publicity, personality, or privacy of any person or entity, including as a result of your failure to obtain consent to post personally identifying or otherwise private information about a person; (b) violate any law, statute, ordinance, or regulation; (c) be defamatory, libelous or trade libelous, unlawfully threatening, or unlawfully harassing; (d) impersonate any person or entity or falsely state or otherwise imply an affiliate with a person or entity or is generally false, deceptive, misleading, deceitful, misinformative or constitutes a "bait and switch"; (e) be obscene, pornographic, or indecent; (f) violate any community or internet standard; (g) introduce any viruses, Trojan horses, worms, time bombs, cancelbots, or other computer programming routines that damage, detrimentally interfere with, surreptitiously intercept, or expropriate any system, data or personal information, or that facilitate or enable such or that are intended to do any of the foregoing; (h) constitute misappropriation of any trade secret or know-how; or (i) constitute disclosure of any confidential information owned by any third party.
Upon your submission of User Content or other material or information to EMEX, you grant EMEX a worldwide, perpetual, non-terminable, irrevocable, transferable, license to access, use, distribute, perform, reproduce, display, modify, create derivative works based upon, and sublicense, and to permit others to access, use, distribute, perform, reproduce, display, modify and create derivative works based upon the User Content, all without any compensation to you whatsoever. EMEX may refuse to post or remove User Content from the Site that violates any of the warranties provided in the preceding paragraph or for any reason. EMEX shall not be responsible for changes, modifications, or removal of any User Content that you submit to the Site.
Parties other than EMEX may provide content on the Site. Additionally, the Site contains links to other websites for the convenience of users. Use of the Site and the Site Materials and any other material or content on and made available through the Site is entirely at your own risk. EMEX does not recommend and expressly disclaims any responsibility for the content, the accuracy of the information, or quality of products or services provided by or advertised on third party sites or the transactions you conduct or enter into with third parties. Your use of third parties' websites is at your own risk, and subject to the terms and conditions of such other websites. EMEX does not endorse any product, service, or treatment provided on a third party website or advertised on the Site.
Any personal information that you provide to EMEX on the Site is subject to its Privacy Statement. For more information, view the Privacy Statement at www.EnergyMarketExchange.com, which is incorporated into these Terms by reference, as if set forth fully herein. Please be advised that the confidentiality of any communication or material transmitted to EMEX via the Site or email cannot be guaranteed, including, for example, personal information such as your address or name. Alternatively, you may contact EMEX by regular mail at 11011 Richmond Avenue Suite 500, Houston, TX 77042.
Certain statements contained in this website constitute "forward-looking statements" within the meaning of the Private Securities Litigation Reform Act of 1995. Such forward-looking statements involve a number of known and unknown risks, uncertainties and other factors which may cause the actual results, performance or achievements of EMEX to be materially different from any future results, performance or achievements expressed or implied by such forward-looking statements.
Such factors include, but are not limited to: the dependence on sales and the uncertainty of the timing and magnitude of government funding and orders, dependence on sales to government customers; the uncertainty of patent protection; the uncertainty of strategic alliances; the uncertainty of management tenure; the impact of third-party suppliers' constraints or difficulties; management's ability to achieve business performance objectives, market acceptance of, and demand for, the Company's products, and resulting revenues; development and testing of technology and products; impact of competitive products and pricing. The words "looking forward," "believe," "demonstrate," "intend," "expect," "contemplate," "estimate," "anticipate," "likely" and similar expressions identify forward-looking statements. Readers are cautioned not to place undue reliance on these forward-looking statements, which speak only as of the date the statement was made. EMEX undertakes no obligation to update any forward-looking statements contained in on this Site.
EMEX, its subsidiaries, and affiliates are not responsible for and do not guarantee the accuracy or completeness of any Site Material, User Content, links, advertisements or other items contained within the Site. EMEX reserves the right to immediately remove any Site Material or User Content for any reason or for no reason. EMEX cannot and does not review all communications made on or through the Site, but, although not obligated to, may review, filter, verify, make changes to or remove any User Content, Site Material, the Site or the products or services made available in connection with the Site, with or without notice in its sole discretion. You agree that you must evaluate and bear all risks associated with the use of Site Material or User Content and that you may not rely on such Site Material or User Content.
EMEX AND ITS LICENSORS MAKE NO REPRESENTATIONS OR WARRANTIES, AND DISCLAIM ALL REPRESENTATIONS AND WARRANTIES, WITH RESPECT TO THE SITE, THE USER CONTENT, THE SITE MATERIALS, THE SERVICES, PRODUCTS, INFORMATION AND OTHER MATERIALS ON AND IN AND MADE AVAILABLE THROUGH THE SITE, EXPRESS OR IMPLIED, WRITTEN OR ORAL, ARISING FROM COURSE OF DEALING, COURSE OF PERFORMANCE, USAGE OF TRADE, OR OTHERWISE, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, SYSTEMS INTEGRATION, NON-INTERFERENCE, QUALITY, TITLE, AND NON-INFRINGEMENT. THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, COMPLETENESS AND EFFORT WITH REGARD TO ANY AND ALL USER CONTENT, THE SITE, THE SITE MATERIALS, AND THE SERVICES, PRODUCTS, INFORMATION AND OTHER MATERIALS ON AND IN AND MADE AVAILABLE THROUGH THE SITE, IS WITH YOU.
EMEX AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, EXTRA-CONTRACTUAL, OR PUNITIVE DAMAGES OF ANY KIND WHATSOEVER, INCLUDING LOST REVENUES OR LOST PROFITS, WHICH MAY OR DOES RESULT FROM THE USE OF, ACCESS TO, OR INABILITY TO USE THE SITE, THE USER CONTENT, THE SITE MATERIALS, THE SERVICES, PRODUCTS, INFORMATION AND OTHER MATERIALS ON AND IN AND MADE AVAILABLE THROUGH THE SITE, REGARDLESS OF LEGAL THEORY, WHETHER OR NOT YOU OR EMEX HAD BEEN ADVISED OF THE POSSIBILITY OR PROBABILITY OF SUCH DAMAGES, AND EVEN IF THE REMEDIES OTHERWISE AVAILABLE FAIL OF THEIR ESSENTIAL PURPOSE. UNDER NO CIRCUMSTANCES WILL THE TOTAL LIABILITY OF EMEX AND ITS LICENSORS TO YOU OR ANY OTHER PERSON OR ENTITY IN CONNECTION WITH, BASED UPON, OR ARISING FROM THE SITE, USER CONTENT, THE SITE MATERIALS ON, IN, AND MADE AVAILABLE THROUGH THE SITE, OR THE SERVICES, INFORMATION, OR PRODUCTS OFFERED IN CONNECTION THEREWITH EXCEED THE AMOUNT PAID BY YOU TO EMEX FOR PRODUCTS OR SERIVES PURCHASED THROUGH THE SITE DURING THE PRECEDING THREE MONTHS. SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU. IF ANY PART OF THIS LIMITATION ON LIABILITY IS FOUND TO BE INVALID OR UNENFORCEABLE FOR ANY REASON, THEN THE TOTAL LIABILITY OF EMEX AND ITS LICENSORS SHALL NOT EXCEED TEN DOLLARS ($10) AND SHALL OTHERWISE BE LIMITED TO THE GREATEST EXTENT PERMITTED BY LAW. If you are dissatisfied with the Site, or with any of these Terms, or feel EMEX has breached these Terms, your sole and exclusive remedy is to discontinue using the Site.
You shall indemnify EMEX and its directors, officers, employees, agents, contractors and licensors ("EMEX Indemnitees") against all claims, actions, suits, and other proceedings ("Claims") arising out of or incurred in connection with the Site and your use of the Site or services obtained through the Site, your fraud, violation of law, negligence, willful misconduct, or any other use of the Site, the User Content, the Site Materials, the services, products, information and other materials on, in and made available through the Site, (except to the extent attributable to EMEX), or any breach by you of these Terms and shall indemnify and hold EMEX Indemnitees harmless from and against all judgments, losses, liabilities, damages, costs, and expenses (including reasonable attorneys' fees and attorneys' disbursements) arising out of or incurred in connection with such Claims. You may not settle any Claim without the prior written consent of EMEX.
EMEX or its licensors may assume the defense of any Claim, at your sole cost and expense, and you shall cooperate in all reasonable respects in such defense. You shall have the right to employ separate counsel in any Claim and to participate in the defense thereof. If EMEX or its licensors do not notify you that it elects to undertake the defense thereof, you shall have the right to defend the Claim with counsel reasonably acceptable to EMEX, subject to the right of EMEX to assume, at its sole cost and expense, the defense of any Claim at any time prior to the settlement or final determination thereof.
The provisions regarding use of the Site and the provisions regarding Indemnification are for the benefit of EMEX and its officers, directors, employees, agents, licensors, suppliers, and any third party information providers to the Site. Each of these individuals or entities may be afforded by EMEX the right to assert and enforce those provisions directly against you on its own behalf.
EMEX uses reasonable efforts to ensure that the Site is generally available. However, there will be occasions when access to the Site will be interrupted or unavailable. EMEX will use reasonable commercial efforts to minimize such disruption where it is within EMEX's reasonable control. You agree that we shall not be liable to you for any modification, suspension or discontinuance of the Site. You understand that the technical processing and transmission of any Site content may be transferred unencrypted and involve: (a) transmissions over various networks; and (b) changes to conform and adapt to technical requirements of connecting networks or devices. Please be advised that we do not guarantee that any information sent from the Site will be secure during transmission, nor can we guarantee the confidentiality of any communication or material transmitted to EMEX via the Site or the internet, including, for example, personal information such as your name or address.
EMEX reserves the right at any time to modify, alter or update these Terms. Your use of the Site following any changes means that you agree to follow and be bound by the terms as changed. Any change to these Terms shall be effective as to any visitor who has visited the Site before the change was made. It is the obligation of users visiting the Site before the change to learn of changes to the Terms since their last visit. EMEX reserves the right to terminate your access to this Site with or without notice in the event that you violate these Terms, or for any other reason whatsoever or for no reason, in which case all provisions necessary for EMEX to enforce its rights hereunder shall survive termination.
These Terms represent the entire agreement between you and EMEX with respect to the subject matter hereof, and supersede any and all prior and contemporaneous written and oral representations, understandings, and agreements, express and implied, and will be governed by and construed in accordance with the laws of the State of TEXAS, USA, without reference to its conflict of law rules; PROVIDED, HOWEVER, THAT THE TERMS OF ANY APPLICABLE LAW NOW OR HEREAFTER ENACTED THAT IS BASED ON, DERIVED FROM, SIMILAR TO, OR CONNECTED WITH THE UNIFORM COMPUTER INFORMATION TRANSACTIONS ACT DRAFTED BY THE NATIONAL CONFERENCE OF COMMISSIONERS ON UNIFORM STATE LAWS SHALL NOT APPLY EXCEPT TO THE EXTENT THAT THE LAW EXPRESSLY PROHIBITS ALTERATION BY THESE TERMS OF THE APPLICABILITY OF ONE OR MORE SECTIONS OF THE LAW. By accessing, viewing, or using the services, works, content, or materials on the Site, you consent and agree to: (a) the exclusive jurisdiction of the federal and state courts located in Houston, TEXAS, USA; (b) accept service of process by personal delivery or mail; and (c) irrevocably waive the right to trial by jury and any jurisdictional and venue defenses otherwise available.


text:
Iran issues another death sentence over Mahsa Amini protests. News24
Jan 11, 2023 crime and courts, iran
Iran has sentenced another person to death in connection with anti-government protests.
On Tuesday, the country sentenced Javad Rouhi for charges around "corruption of Earth".
Protesting erupted after the death of Mahsa Amini, who was arrested for violating Iran's dress code.
Iran has sentenced another man to death in connection with the protests triggered by the death in custody of Mahsa Amini, the judiciary said Tuesday.
The Islamic republic has been gripped by civil unrest since the September 16 death of 22-year-old Amini following her arrest for allegedly violating Iran's strict dress code.
Javad Rouhi was sentenced to death on charges of "corruption on Earth", the judiciary's Mizan Online news website reported.
The sentence, which can still be appealed, brings to 18 the total number of people the judiciary has announced have been condemned to death in connection with the protests.
Rouhi was found guilty of "leading a group of rioters", "inciting people to create insecurity", as well as of "apostasy by desecration of the Koran by burning it", Mizan Online reported.
He was also found guilty of "setting fire to and destroying property in a way that causes severe disruption to the country's public order and security", it added.
read | Iran sentences three more protesters to death amid global condemnation
Iranian authorities say hundreds of people, including members of the security forces, have been killed and thousands arrested during the protests which they mostly describe as "riots".
Tehran accuses hostile foreign countries and opposition groups of stoking the unrest.
Four executions have been carried out, and six of those sentenced to capital punishment have been granted retrials.
In times of uncertainty you need journalism you can trust. For 14 free days, you can have access to a world of in-depth analysis, investigative journalism, top opinions and a range of features. Journalism strengthens democracy. Invest in the future today. Thereafter you will be billed R75 per month. You can cancel anytime and if you cancel within 14 days you won't be billed.
#Iran #issues #death #sentence #Mahsa #Amini #protests #News24
Air travel across US thrown into chaos after computer outage
Bills' Hamlin leaves hospital after nine days

redpajama_set_name: RedPajamaCommonCrawl


text:
;(function (window, undefined) {
  'use strict';

  if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
      return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
  }

  function getInternetExplorerVersion () {
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
      var ua = navigator.userAgent;
      var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
      if (re.exec(ua) != null)
        rv = parseFloat( RegExp.$1 );
    }
    return rv;
  }

  /*
   * object.watch polyfill
   *
   * 2012-04-03
   *
   * By Eli Grey, http://eligrey.com
   * Public Domain.
   * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
   */

// object.watch
  if (!Object.prototype.watchit && (getInternetExplorerVersion() == -1 || getInternetExplorerVersion() > 8)) {
    Object.defineProperty(Object.prototype, "watchit", {
      enumerable: false
      , configurable: true
      , writable: false
      , value: function (prop, handler) {
        var
          oldval = this[prop]
          , getter = function () {
            return oldval;
          }
          , setter = function (newval) {
            if (oldval !== newval) {
              handler.call(this, prop, oldval, newval);
              oldval = newval;
            }
            else { return false }
          }
          ;

        if (delete this[prop]) { // can't watch constants
          Object.defineProperty(this, prop, {
            get: getter
            , set: setter
            , enumerable: true
            , configurable: true
          });
        }
      }
    });
  }

  if (!Object.prototype.unwatchit && (getInternetExplorerVersion() == -1 || getInternetExplorerVersion() > 8)) {
    Object.defineProperty(Object.prototype, "unwatchit", {
      enumerable: false
      , configurable: true
      , writable: false
      , value: function (prop) {
        var val = this[prop];
        delete this[prop]; // remove accessors
        this[prop] = val;
      }
    });
  }

  /*
   * Hashcode.js 1.0.2
   * https://github.com/stuartbannerman/hashcode
   *
   * Copyright 2013 Stuart Bannerman (me@stuartbannerman.com)
   * Released under the MIT license
   *
   * Date: 07-04-2013
   */
  window.Hashcode = (function () {
    // Hashes a string
    var hash = function (string) {
      var hash = 0, i;
      string = string.toString();

      for (i = 0; i < string.length; i++) {
        hash = (((hash << 5) - hash) + string.charCodeAt(i)) & 0xFFFFFFFF;
      }

      return hash;
    };
    // Deep hashes an object
    var object = function (obj) {
      var result = 0;
      for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
          result += hash(property + value(obj[property]));
        }
      }

      return result;
    };
    // Does a type check on the passed in value and calls the appropriate hash method
    var value = function (value) {
      var types =
      {
        'string': hash,
        'number': hash,
        'boolean': hash,
        'object': object
        // functions are excluded because they are not representative of the state of an object
        // types 'undefined' or 'null' will have a hash of 0
      };
      var type = typeof value;

      return value !== null && types[type] ? types[type](value) + hash(type) : 0;
    };

    return {
      value: value
    };
  })();

  /* escape, keys, has, and isObject functions taken from underscore.js
   *
   * Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and
   * Investigative Reporters & Editors
   *
   * Permission is hereby granted, free of charge, to any person
   * obtaining a copy of this software and associated documentation
   * files (the "Software"), to deal in the Software without
   * restriction, including without limitation the rights to use,
   * copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following
   * conditions:
   *
   * The above copyright notice and this permission notice shall be
   * included in all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
   * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
   * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
   * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
   * OTHER DEALINGS IN THE SOFTWARE.
   */
  window._ = window._ || {};

  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  var has = function(obj, key) {
    return obj != null && hasOwnProperty.call(obj, key);
  };

  // Is a given variable an object?
  var isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`
  var keys = function(obj) {
    if (!isObject(obj)) {
      return [];
    }
    if (Object.keys) {
      return Object.keys(obj);
    }
    var keys = [];
    for (var key in obj) {
      if (has(obj, key)) {
        keys.push(key);
      }
    }
    return keys;
  };

  // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&',
    '<': '<',
    '>': '>',
    '"': '"',
    "'": ''',
    '`': '`'
  };

  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped
    var source = '(?:' + keys(map).join('|') + ')';
    var testRegexp = new RegExp(source);
    var replaceRegexp = new RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };

  window._.escape = createEscaper(escapeMap);

})(window);

;(function (root, factory) {

  if (typeof define === 'function' && define.amd) {
    define('deckster-card', ['jquery'], factory);
  } else {
    root.DecksterCard = factory(root.$ || root.jQuery);
  }

}(this, function ($) {
  'use strict';

  var defaults = {
    id: null,
    cardType: false,
    title: null,
    lazyLoad: true,
    usePopoutLayout: true,
    hasPopout: false,
    expandable: true,
    reloadable: true,
    expandInPlace: false,
    resizable: true,
    showFooter: true,
    summaryContentHtml: null,
    summaryContentUrl: null,
    summaryViewType: null,
    detailsContentHtml: null,
    detailsContentUrl: null,
    detailsViewType: null,
    leftControlsHtml: null,
    leftControlsContentUrl: null,
    rightControlsHtml: null,
    rightControlsContentUrl: null,
    centerControlsHtml: null,
    centerControlsContentUrl: null,
    getPopoutUrl: function (card) {
      return card.options.rootUrl + '/card/' + card.options.id;
    },
    popoutCard: null,
    position : {
      size_x: 1,
      size_y: 1,
      expanded_x: null,
      expanded_y: null,
      col: 1,
      row: 1
    },
    spinnerOpts: {
      lines: 8, // The number of lines to draw
      length: 1, // The length of each line
      width: 4, // The line thickness
      radius: 6, // The radius of the inner circle
      corners: 1, // Corner roundness (0..1)
      rotate: 0, // The rotation offset
      direction: 1, // 1: clockwise, -1: counterclockwise
      color: '#000', // #rgb or #rrggbb or array of colors
      speed: 1, // Rounds per second
      trail: 60, // Afterglow percentage
      hwaccel: false, // Whether to use hardware acceleration
      className: 'spinner', // The CSS class to assign to the spinner
      zIndex: 2e9, // The z-index (defaults to 2000000000)
      top: '50%', // Top position relative to parent
      left: '50%' // Left position relative to parent
    },
    onSummaryLoad: $.noop,
    onSummaryDisplayed: $.noop,
    onDetailsLoad: $.noop,
    onDetailsDisplayed: $.noop,
    onResize: $.noop,
    onExpand: $.noop,
    onCollapse: $.noop,
    onReload: $.noop,
    resizeSummaryContent: $.noop,
    resizeDetailsContent: $.noop,
    loadData: $.noop,
    fieldsToSerialize: [
      'id',
      'cardType',
      'title',
      'lazyLoad',
      'usePopoutLayout',
      'hasPopout',
      'expandable',
      'showFooter',
      'position',
      'fieldsToSerialize'
    ]
  };

  /**
   * @class Card
   *
   * @param {HTMLElement} el
   * @param options {Object} Configuration for the card
   *    @param {String} [options.id] Unique identifier for this card
   *    @param {String} [options.cardType] Type of predefined card configuration
   *    @param {String} [options.title] Title for this card
   *    @param {Boolean} [options.lazyLoad] Whether to load the details section on load or wait until its needed
   *    @param {Boolean} [options.usePopoutLayout] Whether or not to place card content inside card layout when the
   *      card when the card is a popout
   *    @param {Boolean} [options.hasPopout] Whether or not the card can be popped out into a new window
   *    @param {Boolean} [options.expandable] Whether or not the card can be expanded
   *    @param {Boolean} [options.expandInPlace] Whether or not to expand from the widgets current column
   *    @param {Boolean} [options.showFooter] Show the footer for this card
   *    @param {String|Function} [options.summaryContentHtml] Can be a HTMLElement or String of HTML or a function
   *      with a callback that takes the generated HTML for the summary section of the card
   *    @param {String} [options.summaryContentUrl] Url to request HTML content for summary section of card
   *    @param {String|Function} [options.detailsContentHtml] Can be a HTMLElement or String of HTML or a function
   *      with a callback that takes the generated HTML for the details section of the card
   *    @param {String} [options.detailsContentUrl] Url to request HTML content for details section of card
   *    @param {String|Function} [options.leftControlsHtml] Can be a HTMLElement or String of HTML or a function
   *      with a callback that takes the generated HTML for the left controls content for this card
   *    @param {String} [options.leftControlsContentUrl] Url to request HTML content for the left controls content for this card
   *    @param {String|Function} [options.rightControlsHtml] Can be a HTMLElement or String of HTML or a function
   *      with a callback that takes the generated HTML for the right controls content for this card
   *    @param {String} [options.rightControlsContentUrl] Url to request HTML content for the right controls content for this card
   *    @param {String|Function} [options.centerControlsHtml] Can be a HTMLElement or String of HTML or a function
   *      with a callback that takes the generated HTML for the center controls content for this card
   *    @param {String} [options.centerControlsContentUrl] Url to request HTML content for the center controls content for this card
   *    @param {Object} [options.position] Settings for how to position this card in the deck
   *        @param {Number} [options.position.size_x] Number of columns this card spans in deck
   *        @param {Number} [options.position.size_y] Number of rows this card spans in deck
   *        @param {Number} [options.position.expanded_x] Max number of columns this card spans when expanded
   *        @param {Number} [options.position.expanded_y] Max number of rows this card spans when expanded
   *        @param {Number} [options.position.col] Col the card should be positioned in
   *        @param {Number} [options.position.row] Row the card should be positioned in
   *    @param {Function} [options.onSummaryLoad] Function triggered when summary content is loaded;
   *      passes through the card
   *    @param {Function} [options.onSummaryDisplayed] Function triggered when summary content is displayed
   *    @param {Function} [options.onDetailsLoad] Function triggered when details content is loaded;
   *      passes through the card
   *    @param {Function} [options.onDetailsDisplayed] Function triggered when details content is displayed
   *    @param {Function} [options.onResize] Function triggered when this card is resized
   *    @param {Function} [options.onExpand] Function triggered when this card is expanded
   *    @param {Function} [options.onCollapse] Function triggered when this card is collapsed
   *    @param {Function} [options.onReload] Function triggered when this card is reloaded
   *    @param {Function} [options.loadData] Function used to load data into card
   *    @param {Array} [options.fieldsToSerialize] Fields that should be plucked from the options during serialization
   * @constructor
   */
  function Card(el, options) {
    this.$el = $(el);
    this.$deckster = this.$el.parents('.deckster-deck').data('deckster');
    this.options = Card.extendDefaults(options);
    this.$cardHashKey = Hashcode.value(this.options);
    this.currentSection = 'summary';
    this.isExpanded = false;
    this.spinner = null;

    if(this.options.summaryViewType && Deckster.views[this.options.summaryViewType]) {
      var summaryView = Deckster.views[this.options.summaryViewType];
      this.options.summaryContentHtml = summaryView.getContentHtml || $.noop;
      this.options.onSummaryLoad = summaryView.onLoad || $.noop;
      this.options.resizeSummaryContent = summaryView.resize || $.noop;
    }

    if(this.options.detailsViewType && Deckster.views[this.options.detailsViewType]) {
      var detailsView = Deckster.views[this.options.detailsViewType];
      this.options.detailsContentHtml = detailsView.getContentHtml || $.noop;
      this.options.onDetailsLoad = detailsView.onLoad || $.noop;
      this.options.resizeDetailsContent = detailsView.resize || $.noop;
    }

    this.$el.data('deckster-card', this);
  }

  /**
   * Returns the card defaults
   *
   * @method getDefaults
   * @return {Object} Card defaults
   */
  Card.getDefaults = function() {
    return defaults;
  };

  /**
   * Extend default options of card with options given
   *
   * @method extendDefaults
   * @param options
   * @returns {Object}
   */
  Card.extendDefaults = function(options) {
    var fields = options.fieldsToSerialize;

    var opts = $.extend(true, {}, defaults, options);

    if(fields) {
      opts.fieldsToSerialize = fields;
    }

    return opts;
  };

  /**
   * Generates the layout for a card with given options
   *
   * @method getCardHtml
   * @param opts {Object} locals used to generate layout for card
   * @return {HTMLElement|String} of card layout html
   */
  Card.getCardHtml = function (opts) {
    var template = window['Deckster']['Templates']['card/card'];
    return template({card: Card.extendDefaults(opts)});
  };

  /**
   * Returns a numerical hash for the value the card options passed in
   *
   * @method getCardHash
   * @param opts
   * @return {Number}
   */
  Card.getCardHash = function (opts) {
    return Hashcode.value(Card.extendDefaults(opts));
  };

  var fn = Card.prototype;

  /**
   * Returns the current options associated with this card
   *
   * @method getCardData
   * @return {Object}
   */
  fn.getCardData = function () {
    // Get current state of card
    var grid = this.$el.data('coords').grid;
    var currPosition = {
      col: grid.col,
      row: grid.row
    };

    if (this.isExpanded) {
      currPosition['expanded_x'] = grid.size_x;
      currPosition['expanded_y'] = grid.size_y;
      currPosition['size_x'] = this.options.position.size_x;
      currPosition['size_y'] = this.options.position.size_y;
    }
    else {
      currPosition['size_x'] = grid.size_x;
      currPosition['size_y'] = grid.size_y;
      currPosition['expanded_x'] = this.options.position.expanded_x;
      currPosition['expanded_y'] = this.options.position.expanded_y;
    }

    var optsToSerialize = {};

    $.each(this.options.fieldsToSerialize, $.proxy(function(idx, field) {
      optsToSerialize[field] = this.options[field];
    }, this));

    return $.extend(true, {}, optsToSerialize, {position: currPosition, isExpanded: this.isExpanded});
  };

  /**
   * Loads the content of the different sections of the card. If lazyLoad is enabled only the summary content will
   * be loaded when the card is initialized.
   *
   * @param reloading whether or not the card is being reloaded
   * @method loadCard
   * @return {Card}
   */
  fn.loadCard = function (reloading) {

    if (typeof Spinner !== 'undefined' && !this.spinner) {
      this.spinner = new Spinner(this.options.spinnerOpts);
    }

    if (!this.hidden && !this.options.hidden) {
      this.loadSummaryContent(reloading);

      this.hasDetails = !!(this.options.detailsContentHtml || this.options.detailsContentUrl);

      !this.options.expandable || this.options.isPopout ? this.$el.find('.deckster-card-toggle').hide() : this.$el.find('.deckster-card-toggle').show();
      !this.options.resizable || this.options.isPopout ? this.$el.find('.gs-resize-handle').hide() : this.$el.find('.gs-resize-handle').show();
      !this.options.reloadable ? this.$el.find('.deckster-card-reload').hide() : this.$el.find('.deckster-card-reload').show();
      !this.options.hasPopout || this.options.isPopout ? this.$el.find('.deckster-card-popout').hide() : this.$el.find('.deckster-card-popout').show();

      if (this.hasDetails && (!this.options.lazyLoad || this.currentSection === 'details')) {
        this.loadDetailsContent(reloading);
      }

      this.bindCardHandlers();

      if (this.$deckster.options.watchChanges) {
        this.setWatchers();
      }
    } else {
      this.hideCard();
    }
    return this;
  };

  /**
   * Loads the popout for a card. The card element won't have the layout injected yet so we need to
   * do that first before loading the card.
   *
   * @method loadPopout
   * @return {Card}
   */
  fn.loadPopout = function () {
    if(this.options.isPopout) {
      this.$el.html('
' + Card.getCardHtml(this.options) + '
');
    }

    return this.loadCard();
  };

  /**
   * Shows the loading spinner
   *
   * @method showSpinner
   * @returns {Card}
   */
  fn.showSpinner = function () {
    if (this.spinner) {
      this.$el.find('.deckster-card-overlay').show();
      this.spinner.spin(this.$el.find('.deckster-card-content')[0]);
    }
    return this;
  };

  /**
   * Hides the loading spinner
   *
   * @method hideSpinner
   * @returns {Card}
   */
  fn.hideSpinner = function () {
    if (this.spinner) {
      this.$el.find('.deckster-card-overlay').hide();
      this.spinner.stop();
    }
    return this;
  };

  /**
   * Loads the given HTML content into the specified section for this card
   *
   * @method setCardContent
   * @param section {String} 'summary'|'details'
   * @param html {HTMLElement|String} content for this section
   * @param reloading whether or not the card is being reloaded
   * @return {Card}
   */
  fn.setCardContent = function (section, html, reloading, callback) {
    // Only reload content if this is the current section
    if ((reloading && section === this.currentSection) || !reloading) {
      var $container = this.$el.find('.deckster-card-content .deckster-' + section);
      $container.empty();
      $container.html(html);

      this[section + 'Loaded'] = true;
      section === 'summary' ? this.options.onSummaryLoad(this, 'summary') : this.options.onDetailsLoad(this, 'details');
      this.options.onReload(this);
      this.loadLeftControls();
      this.loadRightControls();
      this.loadCenterControls();
    }

    callback && callback.call(this);
    return this;
  };

  var getCardHtml = function(url, cb) {
    $.get(url, cb);
  };

  /**
   * Loads the content for the left controls on the card header
   * @returns {Card}
   */
  fn.loadLeftControls = function() {
    if ($.isFunction(this.options.leftControlsHtml)) {
      this.options.leftControlsHtml(this, $.proxy(function (html) {
        this.$el.find('.deckster-card-controls.left').empty().html(html);
      }, this));
    } else if (this.options.leftControlsHtml) {
      this.$el.find('.deckster-card-controls.left').empty().html(this.options.leftControlsHtml);
    } else if (this.options.leftControlsContentUrl) {
      getCardHtml(this.options.leftControlsContentUrl, $.proxy(function(html) {
        this.$el.find('.deckster-card-controls.left').empty().html(html);
      }, this));
    }
    return this;
  };

  /**
   * Loads the content for the right controls on the card header
   * @returns {Card}
   */
  fn.loadRightControls = function() {
    if ($.isFunction(this.options.rightControlsHtml)) {
      this.options.rightControlsHtml(this, $.proxy(function (html) {
        this.$el.find('.deckster-card-controls.right').empty().html(html);
      }, this));
    } else if (this.options.rightControlsHtml) {
      this.$el.find('.deckster-card-controls.right').empty().html(this.options.rightControlsHtml);
    } else if (this.options.rightControlsContentUrl) {
      getCardHtml(this.options.rightControlsContentUrl, $.proxy(function(html) {
        this.$el.find('.deckster-card-controls.right').empty().html(html);
      }, this));
    }
    return this;
  };

  /**
   * Loads the content for the center controls on the card header
   * @returns {Card}
   */
  fn.loadCenterControls = function() {
    if ($.isFunction(this.options.centerControlsHtml)) {
      this.options.centerControlsHtml(this, $.proxy(function (html) {
        this.$el.find('.deckster-card-controls.center').empty().html(html);
      }, this));
    } else if (this.options.centerControlsHtml) {
      this.$el.find('.deckster-card-controls.center').empty().html(this.options.centerControlsHtml);
    } else if (this.options.centerControlsContentUrl) {
      getCardHtml(this.options.centerControlsContentUrl, $.proxy(function(html) {
        this.$el.find('.deckster-card-controls.center').empty().html(html);
      }, this));
    }
    return this;
  };

  /**
   * Loads the summary content for this card
   *
   * @param reloading whether or not the card is being reloaded
   * @method loadSummaryContent
   * @return {Card}
   */
  fn.loadSummaryContent = function (reloading, callback) {
    if ($.isFunction(this.options.summaryContentHtml)) {
      this.options.summaryContentHtml(this, $.proxy(function (html) {
        this.setCardContent('summary', html, reloading, callback);
      }, this));
    } else if (this.options.summaryContentHtml) {
      this.setCardContent('summary', this.options.summaryContentHtml, reloading, callback);
    } else if (this.options.summaryContentUrl) {
      getCardHtml(this.options.summaryContentUrl, $.proxy(function(html) {
        this.setCardContent('summary', html, reloading, callback);
      }, this));
    }
    return this;
  };

  /**
   * Loads the details content for this card
   *
   * @param reloading whether or not the card is being reloaded
   * @method loadDetailsContent
   * @return {Card}
   */
  fn.loadDetailsContent = function (reloading, callback) {
    if ($.isFunction(this.options.detailsContentHtml)) {
      this.options.detailsContentHtml(this, $.proxy(function (html) {
        this.setCardContent('details', html, reloading, callback);
      }, this));
    } else if (this.options.detailsContentHtml) {
      this.setCardContent('details', this.options.detailsContentHtml, reloading, callback);
    } else if (this.options.detailsContentUrl) {
      getCardHtml(this.options.detailsContentUrl, $.proxy(function(html) {
        this.setCardContent('details', html, reloading, callback);
      }, this));
    }
    return this;
  };

  /**
   * Loads the content for the specified section
   *
   * @method loadContent
   * @param section {String} 'summary'|'details'
   * @return {Card}
   */
  fn.loadContent = function (section, callback) {
    if (section === 'summary') {
      this.loadSummaryContent(false, callback);
    } else {
      this.loadDetailsContent(false, callback);
    }
    return this;
  };

  /**
   * Reloads the content of this card
   * @method reloadContent
   * @return {Card}
   */
  fn.reloadContent = function () {
    return this.loadCard(true);
  };

  /**
   * Scroll to the card in the deck
   *
   * @method scrollToCard
   * @returns {Card}
   */
  fn.scrollToCard = function () {
    this.$deckster.$el.parents(this.$deckster.options.scrollContainer).animate({
      scrollTop: this.$el.offset().top
    }, this.$deckster.options.scrollToSpeed);
    return this;
  };

  /**
   * Expand the card
   *
   * @method expandCard
   * @param cb Callback to call after function has been expanded
   */
  fn.expandCard = function (cb) {
    var self = this;

    var col = this.options.expandInPlace ? this.$el.data('coords').grid.col : 1;

    this.$deckster.$gridster.expand_widget(
      this.$el,
      this.options.position.expanded_x,
      this.options.position.expanded_y || 4,
      col,
    function () {
      self.isExpanded = true;
      self.$el.find('.deckster-card-toggle')
        .removeClass('glyphicon-resize-full')
        .addClass('glyphicon-resize-small');

        self.options.onExpand.call(self, self);
        if (cb) {
          cb.call(self);
        }
    });
  };

  /**
   * Collapse the card
   *
   * @method collapseCard
   * @param cb Callback to call after function has been collapsed
   */
  fn.collapseCard = function (cb) {
    var self = this;

    this.$deckster.$gridster.collapse_widget(this.$el, function () {
      self.isExpanded = false;
      self.$el.find('.deckster-card-toggle')
        .removeClass('glyphicon-resize-small')
        .addClass('glyphicon-resize-full');

      self.options.onCollapse.call(self, self);
      if (cb) {
        cb.call(self);
      }
    });
  };

  /**
   * Toggles a card between expanded and collapsed
   *
   * @method toggleCard
   * @param cb
   */
  fn.toggleCard = function (cb) {
    if (this.options.expandable) {
      this.isExpanded ? this.collapseCard(cb) : this.expandCard(cb);
    }
  };

  /**
   * Changes the section of the card from one section to another section
   *
   * @method changeSection
   * @param newSection Section the card is being changed to
   * @param oldSection Current section
   * @returns {Card}
   */
  fn.changeSection = function (newSection, oldSection) {
    this.$el.find('.deckster-' + oldSection).fadeOut(200, $.proxy(function () {
      this.$el.find('.deckster-' + this.currentSection).fadeIn(200, $.proxy(function() {
        if(this.currentSection === 'summary'){
          this.options.onSummaryDisplayed(this);
          this.options.resizeSummaryContent(this, 'summary');
        } else {
          this.options.onDetailsDisplayed(this);
          this.options.resizeDetailsContent(this, 'details');
        }
      }, this));
    }, this));
    return this;
  };

  /**
   * Loads and displays the specified section if its not current displayed
   *
   * @method toggleSection
   * @param section {String} 'summary'|'details'
   * @return {Card}
   */
  fn.toggleSection = function (section) {
    var prevSection = this.currentSection;

    this.currentSection = section ? section :
      (this.currentSection === 'summary') && this.hasDetails ? 'details' : 'summary';

    // If section has changed load new content
    if(this.currentSection !== prevSection) {
      this.loadContent(this.currentSection, $.proxy(function() {
        if (this.options.expandable && !this.options.isPopout) {
          this.toggleCard(function () {
            this.changeSection(this.currentSection, prevSection);
          });
        } else {
          this.changeSection(this.currentSection, prevSection);
        }
      }, this));
    } else {
      if (this.options.expandable && !this.options.isPopout) {
        this.toggleCard($.proxy(function() {
          if(this.currentSection === 'summary') {
            this.options.onSummaryDisplayed(this);
            this.options.resizeSummaryContent(this, 'summary');
          } else {
            this.options.onDetailsDisplayed(this);
            this.options.resizeDetailsContent(this, 'details');
          }
        }, this));
      }
    }
    return this;
  };

  /**
   * Trigger the resize functions for the different card views
   *
   * method resizeCardViews
   * @returns {Card}
   */
  fn.resizeCardViews = function () {
    this.options.resizeSummaryContent(this, 'summary');
    this.options.resizeDetailsContent(this, 'details');
    return this;
  };

  /**
   * Removes the card from the deck but saves the state so it can be recalled
   *
   * @method hideCard
   * @returns {Card}
   */
  fn.hideCard = function () {
    this.hiddenState = this.getCardData();
    this.$deckster.$gridster.remove_widget(this.$el, false);
    this.hidden = true;
    return this;
  };

  /**
   * Places the card back in the deck with the same state it had before it was hidden
   *
   * @method showCard
   * @returns {Card}
   */
  fn.showCard = function () {
    if (this.hidden && this.hiddenState) {
      this.currentSection = 'summary';
      this.$el = this.$deckster.$gridster.add_widget(
        Card.getCardHtml(this.options),
        this.hiddenState.position ? this.hiddenState.position.size_x : null,
        this.hiddenState.position ? this.hiddenState.position.size_y : null,
        this.hiddenState.position ? this.hiddenState.position.col : null,
        this.hiddenState.position ? this.hiddenState.position.row : null,
        null, null, $.proxy(function() {
          this.$el.data('deckster-card', this);
          this.hiddenState = null;
          this.hidden = false;
          this.loadCard();
          if (this.isExpanded) {
            this.isExpanded = false;
            this.toggleSection('details');
          }
        },this));
    }
    return this;
  };

  fn.showMessage = function (message) {
    this.$el.find('.deckster-card-message .message').html(message);
    this.$el.find('.deckster-card-message').fadeIn();
  };

  fn.hideMessage = function () {
    this.$el.find('.deckster-card-message').fadeOut();
  };

  /**
   * Popout the card
   *
   * @method popoutCard
   * @returns {Card}
   */
  fn.popoutCard = function () {
    var url;

    if (this.options.popoutCard && $.isFunction(this.options.popoutCard)) {
      this.options.popoutCard(this);
    } else {
      url = this.options.getPopoutUrl(this);
      if (url) {
        window.open(url,'_blank');
      }
    }
  };

  fn.setTitle = function (title) {
    this.$el.find('.deckster-card-title h2').html(title);
    return this;
  };

  fn.setExpandable = function (expandable) {
    if(expandable) {
      this.$el.find('.deckster-card-toggle').show();
    } else {
      this.$el.find('.deckster-card-toggle').hide();
    }
  };

  fn.setResizable = function (resizable) {
    if(resizable) {
      this.$el.find('.gs-resize-handle').show();
    } else {
      this.$el.find('.gs-resize-handle').hide();
    }
  };

  fn.setHasPopout = function (hasPopout) {
    if(hasPopout) {
      this.$el.find('.deckster-card-popout').show();
    } else {
      this.$el.find('.deckster-card-popout').hide();
    }
  };

  fn.setReloadable = function (reloadable) {
    if(reloadable) {
      this.$el.find('.deckster-card-reload').show();
    } else {
      this.$el.find('.deckster-card-reload').hide();
    }
  };

  /**
   * Sets the object watchers for this card
   *
   * @method setWatchers
   * @returns {Card}
   */
  fn.setWatchers = function () {
    this.options.watchit('title', $.proxy(function(prop, oldVal, newVal) {
      if(newVal) {
        this.setTitle(newVal);
      }
    }, this));

    this.options.watchit('expandable', $.proxy(function(prop, oldVal, newVal) {
      this.setExpandable(newVal);
    }, this));

    this.options.watchit('resizable', $.proxy(function(prop, oldVal, newVal) {
      this.setResizable(newVal);
    }, this));

    this.options.watchit('hasPopout', $.proxy(function(prop, oldVal, newVal) {
      this.setHasPopout(newVal);
    }, this));

    this.options.watchit('reloadable', $.proxy(function(prop, oldVal, newVal) {
      this.setReloadable(newVal);
    }, this));

    return this;
  };

  /**
   * Removes the object watchers on this card
   * @returns {Card}
   */
  fn.removeWatchers = function() {
    this.options.unwatchit('title');

    this.options.unwatchit('expandable');

    this.options.unwatchit('resizable');

    this.options.unwatchit('hasPopout');

    this.options.unwatchit('reloadable');

    return this;
  };

  /**
   * Binds handlers to card element
   *
   * @method bindCardHandlers
   * @return {Card}
   */
  fn.bindCardHandlers = function () {
    this.$el.off('click.deckster-card', '.deckster-card-toggle');
    this.$el.on('click.deckster-card', '.deckster-card-toggle', $.proxy(function() {this.toggleSection();}, this));

    this.$el.off('click.deckster-card', '.deckster-card-reload');
    this.$el.on('click.deckster-card', '.deckster-card-reload', $.proxy(function() {this.reloadContent();}, this));

    this.$el.off('click.deckster-card', '.deckster-card-remove');
    this.$el.on('click.deckster-card', '.deckster-card-remove', $.proxy(function() {this.destroy();}, this));

    this.$el.off('click.deckster-card', '.deckster-card-popout');
    this.$el.on('click.deckster-card', '.deckster-card-popout', $.proxy(function() {this.popoutCard();}, this));

    return this;
  };

  /**
   * Function used to destroy the card and remove it from the deck
   * @method destroy
   */
  fn.destroy = function () {
    this.$el.off('click.deckster-card', '.deckster-card-toggle');
    this.$el.off('click.deckster-card', '.deckster-card-reload');
    this.$el.off('click.deckster-card', '.deckster-card-remove');
    this.$el.off('click.decgrukster-card', '.deckster-card-popout');

    if (this.$deckster.options.watchChanges) {
      this.removeWatchers();
    }

    this.$deckster.removeCard(this);
  };

  return Card;

}));

;(function(root, factory) {

  if (typeof define === 'function' && define.amd) {
    define(['jquery', 'deckster-card', 'gridster'], factory);
  } else {
    root.Deckster = factory(root.$ || root.jQuery, root.DecksterCard, root.Gridster);
  }

}(this, function ($, Card, Gridster) {
  'use strict';

  var defaults = {
    rootUrl: '/deckster',
    autoInit: true,
    autoLoadCards: true,
    scrollToSpeed: 1000,
    scrollContainer: '.deckster-deck',
    watchChanges: true,
    gridsterOpts: {
      columns: 5,
      margins: [10, 10],
      rowHeight: 150,
      draggable: {
        handle: '.drag-handle'
      },
      resize: {
        enabled: true
      }
    },
    onRemoveCard: $.noop
  };

  /**
   * @class Deckster
   * @uses Card
   * @param {HTMLElement} element The HTMLElement that will hold the deck
   * @param {Object} [options] An Object will all the default options you wish to overwrite:
   *    @param {Boolean} [options.showDock] Choose to show the Deck dock or not.
   *    @param {Boolean} [options.showToolbar] Choose to show the Deck toolbar or not.
   *    @param {Boolean} [options.autoInit] Choose whether or not to init the Deck automatically after creation.
   *    @param {Object} [options.gridsterOpts] Define options for gridster.js. See available options here http://gridster.net/#documentation
   *
   * @constructor
   */
  function Deckster(element, options) {
    this.$wrapper = $(element);
    this.$el = this.$wrapper.addClass('deckster-deck').append(window['Deckster']['Templates']['deck/deck']()).find('.deck');

    this.$cardHash = {};
    this.$gridster = null;

    this.options = $.extend(true, {}, defaults, options);

    if (!this.options.gridsterOpts.resize.stop) {
      this.options.gridsterOpts.resize.stop = this.widget_resized;
    }

    if (this.options.autoInit) {
      this.init();
    }
  }

  Deckster.cards = Deckster.cards || {};
  Deckster.views = Deckster.views || {};

  /**
   * Generates routes used for DecksterJS
   *
   * @method getRoutes
   * @param basePath The root path for DecksterJS
   * @param optionalIdentifier Character used to denote a parameter is optional. Default: '?'
   * @return {Array} routes
   */
  Deckster.getRoutes = function (basePath, optionalIdentifier) {
    basePath = basePath ? basePath : 'deckster/';
    basePath = basePath && basePath.endsWith('/') ? basePath : basePath + '/';
    optionalIdentifier = optionalIdentifier ? optionalIdentifier : '?';
    return [
      {
        basePath: basePath + 'card',
        fullPath: basePath + 'card/:id/:section' + optionalIdentifier,
        queryParams: [{name: 'id', optional: false}, {name: 'section', optional: true}]
      }
    ];
  };

  /**
   * Generates route use for popouts
   *
   * @method getPopoutRoute
   * @param basePath The root path for DecksterJS
   * @param optionalIdentifier Character used to denote a parameter is optional. Default: '?'
   * @return {Object} route
   */
  Deckster.getPopoutRoute = function (basePath, optionalIdentifier)  {
    basePath = basePath ? basePath : 'deckster/';
    basePath = basePath && basePath.endsWith('/') ? basePath : basePath + '/';
    optionalIdentifier = optionalIdentifier ? optionalIdentifier : '?';

    return {
      basePath: basePath + 'card',
      fullPath: basePath + 'card/:id/:section' + optionalIdentifier,
      queryParams: [{name: 'id', optional: false}, {name: 'section', optional: true}]
    };
  };

  /**
   * Given a card configuration this function generates html for a card adds to the element and displays the
   * given section.
   *
   * @method generatePopout
   * @param el {HTMLElement} To bind card to
   * @param cardOpts {Object} Options used to configure card
   * @param section {String} 'summary'|'details'
   * @return {Card} instance of card
   */
  Deckster.generatePopout = function (el, cardOpts, section) {
    cardOpts.isPopout = true;
    section = section || 'details';

    return new Card(el, cardOpts).loadPopout().toggleSection(section);
  };

  var fn = Deckster.prototype;

  fn.serializeDeck = function () {
    var data = this.options;
    data.cards = [];

    for (var key in this.$cardHash) {
      if (this.$cardHash.hasOwnProperty(key)) {
        data.cards.push(this.$cardHash[key].getCardData());
      }
    }
    return data;
  };
  /**
   * Function fired when a widget is resized in gridster
   * @method widget_resized
   * @param e
   * @param ui
   * @param $widget
   * @returns {Deckster}
   */
  fn.widget_resized = function (e, ui, $widget) {
    var card = $widget.data('deckster-card');
    if (card.options.onResize) {
      card.options.onResize.call(card, card);
    }
    return this;
  };

  /**
   * Initializes Deckster and adds cards if any are given
   *
   * @method init
   * @param cards Cards to be added to the deck
   */
  fn.init = function (cards) {
    this.$gridster = new Gridster(this.$el, this.options.gridsterOpts);

    if (cards) {
      this.addCards(cards);
    }
  };

  /**
   * Checks if a card is in the deck
   *
   * @method hasCard
   * @param card configurations of card
   * @return {Boolean}
   */
  fn.hasCard = function(card) {
    var cardHashKey = Card.getCardHash(card);
    return this.$cardHash.hasOwnProperty(cardHashKey);
  };

  /**
   * Returns the cards in the deck
   *
   * @method getCards
   * @return {Array}
   */
  fn.getCards = function () {
    return $.map(this.$cardHash, function(card) { return card; });
  };

  /**
   * Add an {Array} of cards to the deck.
   *
   * @method addCards
   * @param cards {Array} of {Card} configurations
   * @return {Deckster}
   */
  fn.addCards = function (cards) {
    $.each(cards, $.proxy(function (idx, cardOpts) {
      this.addCard(cardOpts);
    }, this));

    return this;
  };

  /**
   * Add a {Card} to the deck and load the cards data
   *
   * @method addCard
   * @param card Card configuration
   * @param {Function} callback Callback function that gets called with card as param after
   *  card is added to the deck
   * @return {Deckster}
   */
  fn.addCard = function (card, callback) {
    card.rootUrl = card.rootUrl || this.options.rootUrl;

    // If this card has a type specified try and get predefined
    // configurations for this card
    if(card.cardType && Deckster.cards[card.cardType]) {
      card = $.extend(true, {}, Deckster.cards[card.cardType], card);
    }

    if (this.hasCard(card)) {
      return null;
    }

    this.$cardHash[Card.getCardHash(card)] = card;

    var $cardEl = this.$gridster.add_widget(
      Card.getCardHtml(card),
      card.position ? card.position.size_x : null,
      card.position ? card.position.size_y : null,
      card.position ? card.position.col : null,
      card.position ? card.position.row : null,
      null, null, $.proxy(function() {
        var newCard = new Card($cardEl, card);
        this.$cardHash[newCard.$cardHashKey] = newCard;

        if (this.options.autoLoadCards) {
          newCard.loadCard();
        }

        if (callback) {
          callback(newCard);
        }
      },this)
    );

    return this;
  };

  /**
   * Removes all cards from the deck
   *
   * @method clearDeck
   * @returns {Deckster}
   */
  fn.clearDeck = function () {
    $.each(this.$cardHash, $.proxy(function(hash, card) {
      this.removeCard(card);
    }, this));

    return this;
  };

  /**
   * Remove a card from the deck
   *
   * @method removeCard
   * @param card
   * @returns {Deckster}
   */
  fn.removeCard = function (card) {
    this.$gridster.remove_widget(card.$el);
    delete this.$cardHash[card.$cardHashKey];
    this.options.onRemoveCard.call(this, card);
    return this;
  };

  /**
   * Destroy Deckster
   *
   * @method destroy
   */
  fn.destroy = function () {
    this.$wrapper.removeData('deckster');
    this.$gridster.destroy();
  };

  $.fn.deckster = function (options) {
    return this.each(function () {
      if (!$.data(this, 'deckster')) {
        $.data(this, 'deckster', new Deckster(this, options));
      }
    });
  };

  return Deckster;

}));

(function() {
window["Deckster"] = window["Deckster"] || {};
window["Deckster"]["Templates"] = window["Deckster"]["Templates"] || {};

window["Deckster"]["Templates"]["card/card"] = function(obj) {
obj || (obj = {});
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
function print() { __p += __j.call(arguments, '') }
with (obj) {

 if (card.isPopout) { ;
__p += '\n
\n';
 } else { ;
__p += '\n
\n';
 } ;
__p += '\n
\n
\n

\n
\n
' +
((__t = ( card.title )) == null ? '' : __t) +
'
\n              \n
\n
\n              \n              \n              \n
\n

\n
\n
\n

\n
No Data.
\n

\n

\n
\n        ';
 if (card.showFooter) { ;
__p += '\n
\n

\n
\n            \n
\n
\n        ';
 } ;
__p += '\n
\n
\n';

}
return __p
}})();
(function() {
window["Deckster"] = window["Deckster"] || {};
window["Deckster"]["Templates"] = window["Deckster"]["Templates"] || {};

window["Deckster"]["Templates"]["deck/deck"] = function(obj) {
obj || (obj = {});
var __t, __p = '', __e = _.escape;
with (obj) {
__p += '

\n';

}
return __p
}})();
(function() {
window["Deckster"] = window["Deckster"] || {};
window["Deckster"]["Templates"] = window["Deckster"]["Templates"] || {};

window["Deckster"]["Templates"]["deck/dock"] = function(obj) {
obj || (obj = {});
var __t, __p = '', __e = _.escape;
with (obj) {
__p += '
\n
';

}
return __p
}})();
(function() {
window["Deckster"] = window["Deckster"] || {};
window["Deckster"]["Templates"] = window["Deckster"]["Templates"] || {};

window["Deckster"]["Templates"]["deck/toolbar"] = function(obj) {
obj || (obj = {});
var __t, __p = '', __e = _.escape;
with (obj) {
__p += '
\n    \n
\n        <input type="text" class="deck-toolbar-searchbox" placeholder="' +
((__t = ( deck.searchPlaceholder )) == null ? '' : __t) +
'">\n
\n
\n        \n        \n        \n
\n
';

}
return __p
}})();

redpajama_set_name: RedPajamaGithub


Logan Portable Infrared Quartz Heater is the perfect heating solution for living rooms, dining rooms, bedrooms, kitchen areas, basements, and craft rooms. Plug this electric heater into your wall outlet and immediately enjoy the warmth. Its heat exchanger combines with the humidity in the room to provide soft, moist, safe heat without reducing oxygen or humidity.
Supplemental heating up to 1000 sq. ft.
This giveaway is open to the Continental US only (because of shipping costs) and will end on November 12th, 2014. Good Luck!!
I live in the south so the winters are considerably mild compared to other parts of the country, but we are less acclimated to cold weather as well. We usually start to struggle when the temperature goes below 45 or 50 degrees.
Our winter can be cold, cold, cold! I'd love this to help heat our upstairs!
I live in the Pacific Northwest where it is damp and chilly all winter. I'd love this to take the chill off the upstairs and reduce the use of our oil furnace.
The apartment that I live in New York does not maintain temperature well and the heating system is old and not very energy efficient. The Logan Portable Infrared Heater would help to keep to us warm while saving us a ton on our electric bill.


text:
In Roman mythology, Sors, a lesser deity, was a god of luck. Supposedly a son of Fortuna.

Scarcely mentioned in mythology, a handful of quotes cite him in such expressions "By the luck of Sors", or "Lived by a hairs breadth of Sors".
Sors is also a popular name in poker, as are both sayings. Sors is also a common term in gambling. Opera singer Joe Volpe composed a piece that mentioned Sors. "Legend says Sors still exists somewhere beyond. Acolytes say he is among gods. Non-believers say he never existed. But I say he is eternally found."
Roman gods
Fortune gods

redpajama_set_name: RedPajamaWikipedia


text:
Marketplace/Legals
Best Of Hall
Roswell murder suspect arrested after standoff at Northeast Georgia Medical Center in Gainesville
This webinar on COVID-19 vaccine promises to tell you everything you need to know
Baggage car to get new home at events venue
Hall elections board certifies Jan. 5 runoff election results
A look inside Gainesville Civic Center as it undergoes $1.2 million renovation
When and where to get COVID-19 vaccines in Northeast Georgia
LIVE UPDATES: NGHS COVID-19 patient numbers continue declining but still above 300
UNG gets first doses of COVID-19 vaccine; appointments fill up in 15 minutes
Local health providers keep moving forward as vaccine stockpile questioned nationally
Tuesday is Election Day in the U.S. Senate runoffs in Georgia. Here's what you need to know
Early voting for Jan. 5 runoffs is underway in Hall
With voters concerned about election security, this is what Hall County legislators say they'll do
Georgia again certifies election results showing Biden won
What legislators heard from Secretary of State's Office over election integrity concerns
Gainesville's Alex Hall prepares to release "Six Strings" debut with Monument Records, featuring big names
Column: Look out for this Cerulean Warbler the next time you go birding
These new homeowners received Habitat's first dedication parade
Allison Mayfield, new Humane Society executive director, begins role as top dog
'Just keep moving and loving people' - Dimple Mae "Dee" Ridley celebrates 105th birthday
High school basketball: Kriews, Locke pace Flowery Branch girls in 48-33 win
High school basketball: Smothering defense sends Cherokee Bluff boys to big win against North Hall
High school basketball: Chestatee girls pull down clutch win against Cedar Shoals
High school basketball: Gainesville boys utilize late surge to take down Lambert
High school basketball: Gainesville High legend Humphrey cherishes trip back home to coach
Opinion: Community support made it possible to help many during COVID-19
Opinion: Democrats offer gaffe machine for president
Opinion: This is our country and our president whether we agree or not
Opinion: Freedom gone awry leads to individualism focused on keeping wealth, influence
Opinion: We must argue politics on shared set of facts
Column: Can we move past the division that led to Capitol attack?
Guest column, Douglas Young: The ugliness of the COVID lockdowns
Column: Prepare early for North Georgia's severe weather season
Column: How much do you know about local history?
Column: I'm looking forward to happy days
Student sections doing their best to help teams win
The Flowery Branch student section cheers on the Falcons on Tuesday against Gainesville. - photo by Tom Reed
They can be creative, loud and supportive. They can be expressive, humorous and sometimes borderline offensive. And while they are not actually allowed to step foot on it, student sections can often have a large impact on the basketball court.
They're job is simple: Cheer on their teams as loud as they can for as long as they can and help them get motivated and energized for the game whether it be against a region rival or a winless opponent who is clearly overmatched.
Like one high school coach said, "They're what high school sports are all about."
"I don't pay a lot of attention to it as a coach, but I know it means a lot to the players," said first-year Flowery Branch boys coach Duke Mullis. "I know they thrive off it."
It would be hard not to.
From the opening tip to the final buzzer, a good student section is into the game, chanting in the hopes of helping their team win.
"It gets you hyped," Gainesville senior Nick Johnson said of a loud student section. "The student section is worth a couple points alone."
Especially in close games, which was evident during Tuesday's game between Gainesville and Flowery Branch, a game that the Falcons won by two points and featured an amped up home crowd cheering on their beloved Falcons.
"We pumped our boys up all night and it helped them," Flowery Branch senior Jennica Ramey said. "They really want us to be here."
And why wouldn't they? According to one Gainesville player, competing in front of a good crowd provides a unique feeling to high schoolers.
"It feels like you're playing college basketball," Red Elephants senior George Manomano said.
Other players find it more difficult to put that feeling into words.
"It's really hard to describe," Flowery Branch's Josh Barrett said of playing in front of a loud section of his peers. "It's one of the greatest feelings ever. It's real intense."
Providing their team with positive energy is the main goal of any good student section, but that positivity isn't spread through the normal forms of "Go team, go." Student sections pride themselves on creativity, normally displayed through the form of a chant.
"He's a freshman! He's a freshman!" They may chant after one of their team's ninth-graders scores a basket.
"You can't do that! You can't do that!" They repeat after a traveling or offensive foul is called on an opposing player.
Most of those chants are so loud that they overshadow a group of people whose job it is to cheer on the basketball teams, the cheerleaders.
"They influence the game a lot more than we do," said North Hall senior cheerleader Kate Williams.
Yet while some people may get upset about not being heard, the cheerleaders are fine with the noise the student sections provide.
"If we do a cheer they'll join in," said North Hall senior cheerleader Erin Brady. "We both do our parts, it's sort of a group effort."
But unlike their cheerleading counterparts, what makes a student section so unique is their freedom of speech.
"We try to yell G-rated throughout the game, even though sometimes it gets intense," North Hall senior Nolan Clark said. It's in those intense times that the creativity can become offensive.
The chants become directed at the opposing team and their student section, which was a cause for concern during the Dec. 16 boys game between North Hall and Gainesville.
In a game that featured bitter rivals, the two student sections were as entertaining and supportive as possible. Both sections were dressed from head to toe in school colors. Both chanted nonstop from the get-go. But as the Red Elephants began to pull away from the Trojans, the student sections lost focus on the game and put all their energy in the opposing team and their fans.
The chants went from creative to personal, and the game ended with Gainesville's student section tossing bouncy balls on the court with less than five seconds left to play.
"I felt it was ridiculous," Clark said of the atmosphere in Gainesville's gym that night. "The girls kind of got control in that game. You don't call each other mean names, it's about the game.
"You don't address the other team's lifestyle," he added. "That Gainesville game got out of control and it was a fitting end with the bouncy balls."
Not only did the ending of the game diminish the great contest between both teams, but it put a dark cloud on the student sections across the county, causing most school administrators to limit what can and can't be done during a basketball game.
No school felt the effects more than Gainesville, which has seen a decline in the number of students in the section since the incident a month ago. Gainesville's head coach Todd Cottrell knows the fans acted inappropriately during that game, but he stands by the support his team receives from the student section.
"Our student section is fantastic and we love the way they support our team, but that particular night they went overboard and it could have caused an injury to a player, and that's not what you want," he said.
While he wouldn't say what disciplinary action was taken, Gainesville athletic director Wayne Vickery did say that it was handled within the school and he felt that it was handled the right way.
"We don't condone stuff like that, and hopefully it won't happen again," Vickery said. "You don't ever know what's going to happen when you're dealing with 15- and 16-year-old kids. It's toned down a lot since that game."
That was evident Tuesday as Gainesville's student section was clearly outnumbered during the game at Flowery Branch, and both coaches believed the loud students of Flowery Branch had an impact on the final outcome.
"Anytime you have a positive student section, that's worth a lot to your team, especially on your home court," Cottrell said.
Added Mullis, "I felt like we had a sixth man tonight. Whether we like it or not, as coaches, it's definitely a factor in energy levels and adrenaline and playing hard."
But when the student sections take it too far, consequences must be rendered.
According to Flowery Branch athletic director Shannon Benton, the punishment for students crossing the line at basketball games or any other sporting event is the same as if those kids were to do something inappropriate during school hours.
With that in the back of their minds, student sections seemingly have toned it down during recent weeks.
The chants are not as omnipresent as they once were. The ribbing of the opposition or the opposing student section is nonexistent.
"Most of the things you want to do you can't do," said Flowery Branch senior Natalie Pilcher. "But our student section does a great job, they're respectful."
According to Pilcher, being respectful is the best thing you can do to support your team.
"If you can cheer on your team it can help them outshine the other team," she said. "You don't have to talk trash to the other team."
It's the trash talking toward the other team and opposing student sections that has Vickery concerned about the direction the fans are headed.
"A lot of the times it seems like the kids aren't even paying attention to the game," he said. "I think student sections are good for the game as long as they keep it clean and not make it racial or personal."
That sentiment is echoed by North Hall's Clark, who like most students still enjoy a good old-fashioned heckling of an opposing players, as long as it doesn't cross the line.
"You can say they're terrible at basketball, but don't say anything about their mom," he said. "We're a student section, a student body and we're supposed to cheer for our team."
When that's done the right way it can do nothing but have a positive impact on the team.
"I think there's a feeling of we're letting more people down and I think they want everyone to be pleased after the game," Mullis said. "You feel like you're carrying the weight of the school, the weight of the community, so it makes you want to hang in there and do your best 'til the end."
While the players are hanging in their hoping to provide victory, a loud student section can all but ensure that a win is obtained.
"Whoever makes the most noise wins the game," Manomano said. "That's how it goes."
As it should.


text:
/* This is just a header template for what traditional fbp requires */
/*  scheduling would be a buffering system of passing messages or IPs */
/*  between nodes */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* constants */

/* structures */
typedef struct {
	int var1;
	int var2;
	int var3;
} schd_info;

/* non-functional inline function prototype templates */
int startup(int);
int shutdown(void);

/* function prototypes */
void schd_prim(void);


text:
18 Abbotswood, Yate, Bristol, BS37 4NG
info@abbotswoodvets.co.uk
Dr Hannah Scott, MRCVS
Hannah qualified from Liverpool University with honours in 2011 and worked in both first opinion and emergency and critical care before starting locum work in the South West. Hannah has previously enjoyed a long standing locum relationship with the practice. In late 2019 the opportunity to purchase the practice arose with Dr Murphy looking to take a step back from the day-to-day of the business. As practice owner, Hannah is focused on continuing to provide the personal touch our clients are accustomed to whilst modernising the practice to provide the best standard of care possible.
Hannah's other interests include going to the gym and an African Grey parrot called Lola who sometimes been seen around the practice entertaing clients!
Dr Patrick Murphy, MRCVS
Patrick qualified with honours in Canada and completed a scholarship at Cambridge before going into practice.
Patrick practiced around the world in Canada, the UK, the USA and Australia before settling in the UK and setting up Abbotswood Veterinary Centre in 1991.
Patrick recently took a step back from the day-today running of the practice and sold the practice. However, Patrick still remains an important part of the team in a locum capacity and can typically been seen most Wednesday and occasional Saturdays.
Patrick would like to thank all his clients for their support over the years.
Jenny Smith, RVN
Jenny originally studied and worked in administration before starting as an assistant nurse at Abbotswood in 2001, qualifying in 2014.
In 2017 Jenny obtained the Level 3 Award in Education and Training which led to a lecture/tutor position at a veterinary nursing college and an OSCE examiner role.
Jenny combines her passion for education and clinical work in practice ensuring the high standards required of a veterinary nurse training practice are met. Abbotswood Veterinary Centre are a proud supporter of Jenny and share her commitment to training the student veterinary nurses of the future.
Outside of work Jenny enjoys walking her whippet, Star. She also has a particular interest in rabbits and small furries, having kept a number of these over the years, along with two tortoises that ensure she is always kept on her toes!!
Kate O'Neill, RVN
Kate joined Abbotswood Veterinary Centre as a veterinary assistant back in 1997 while keeping several horses at a local yard.
After taking a short break from nursing in 2001 to have her daughter, she returned in 2007 to continue nursing here at Abbotswood. Kate is now a fully qualified veterinary nurse having completed her training at Norton Radstock College in 2013.
Having lost her beloved dog Patch in 2017, Kate now has Otis who is an English Pointer who she and her daughter enjoy training together. Otis is a top student qualifying for Crufts last year!
Liz Bacon, RVN
After leaving school Liz studied Animal Science at Lackham Agricultural College while working part time at Abbotswood Veterinary Centre. She then joined the team full time. A year later she started studying for a Veterinary Nursing diploma, passing her nursing exams in 2003. Since then she has been involved in training other team members.
Outside of the surgery Liz likes to keep busy eventing her horses and teaching. She also has two Hungarian Vislas called Iris and Boudica. They love to join her on a hack around Badminton, but also can be found 'hanging out' at the surgery with the team.
Olivia Higgins
Olivia is originally from South Africa and obtained a BSc (Honours) in Environmental Science there before coming to the UK in 2018 to pursue her other passion of animal care and welfare.
After joining the team, Olivia began her training as a Student Veterinary Nurse at Central College of Animal Studies. Olivia's other interests include animal protection, environmental sustainability and community engagement.
Although Olivia has always been passionate about wildlife growing up surrounded by animals, it was her Labrador Retriever, Custard, who has always been a great guide in steering her on the path to a career working with animals.
Lola is Hannah's African Grey parrot who as you can see enjoys posing for the camera! She also enjoys singing, dancing and scrounging food which has led to her being known as the 'winged Labrador!'
Star is Jenny's whippet and she enjoys typical whippet activities such as lazing around taking up a whole four seater sofa in between chasing squirrels!
Tipps & Ally
Tipps and Ally are Jenny's tortoises and they are around 15 years old now. They have an unhealthy obsession with Croc shoes and also enjoy eating cucumber!
Otis is Kate's English pointer and although he is now 2 years old he likes to act like a puppy around the practice and can often be found raiding our bins!
Custard was Olivia's childhood Labrador back in South Africa and even though she is not over here with us we have included her as she inspired Olivia's nursing career.
Rain is Gill's working cocker spaniel and has enjoyed great success in working tests under Gill's watchful eye.
Cloud is Gill's elderly springer spaniel who has now retired from working life and handed over to Rain.
Mila, aka Squeals, is Tracy's French bulldog. Her favourite thing in the world is food but squeaky toys come in a close second!
Mushu, Cogsworth & Piggy
These are Jenny's trio of Guinea pigs and they enjoy being noisy, mischievous and greedy!
Tracy Stainthorpe
Tracy joined the team in 1995 in a nursing role but since having children has moved to become the accounts manager. She deals with insurance claims and surgery accounts but also has a hands on role with puppies as a the puppy party organiser and one-to-one advise sessions with new owners.
Tracy has a French bulldog called Mila who she enjoys walking in her spare time.
Gill Chapman
After moving from London in 1981, Gill joined Abbotswood and is our longest standing employee. Gill is our pharmacy/accounts manager.
Gill has owned many animals including cats, rats, birds, guinea pigs and rabbits and has a keen interest in dog behavior, training and working. This was largely due to her first Springer 'Abby', a rescue dog that was named after Abbotswood Veterinary Centre. She was an incredible dog who taught Gill as much as Gill taught her.
Currently Gill has a mature retired Springer Spaniel, having been very successful competing in working tests. She also has a working Cocker Spaniel who is currently always in training appearing in the Silver level Good Citizen dog display team at Crufts 2019.
Gill taught for 13 years at a local Kennel Club registered dog training club and she is a 'Good Citizen Award Scheme' bronze, silver and gold level examiner.
Abbotswood Veterinary Centre has a long estabilished team with a wealth of experience in animal care. We pride ourself on our professional service and aim to treat your pets as we would our own. Many of our team members have been with the practice for over 20 years, ensuring you and your pets receive continuity of care. We are open six days a week and use a local out of hours provider to ensure your pets have 24/7 care, even in the event of an emergency.
We always welcome you to pop in and have a chat but read on for more information about our team, their passions and how they can help you.
As well as out human colleagues, we also have some furry, feathered and scaled members of the team. They can often be spotted around the practice.
Abbotswood Veterinary Centre,
18 Abbotswood,
Yate,
BS37 4NG
T: 01454 322449 | E: info@abbotswoodvets.co.uk
© 2020 by Abbotswood Veterinary Practice.


text:
The Wolf Experiment (A Maximum Ride Fanfic)
Chapter One: Escaping the Mutts
I leaned heavily on a tree, panting deeply with all my senses on full alert. If they caught me again, who knows what they'd do to me this time? After all this was my fourth escape, the last time they had starved me for a week and then made me run for several hours on a treadmill, shocking me if I slowed down though this was the farthest I have gotten yet. This was the forest nearest to the School which lied at the top of this mountain and I was only halfway through it with Erasers right behind me.
Genetically I was stronger than the Erasers, my cousins, but after a week of no food and constant experiments I was tired and barely able to keep ahead of them, so here I was panting heavily relying on this tree for support even though I had taken a break ten minutes ago in the clearing with the stream. On the breeze I could smell the coppery scent of the Erasers almost like blood and sweat over the tang of forest dew.
'Time to go,' my wolf side urged making me push myself to my feet and begin to run again. 'Why don't you just fly away?' It asked, not for the first time.
I told you, I scolded mentally if I go wolf now and fly they'll just call a chopper to come after me.
I continued running dodging the trees that sprung up in my path and jumping fallen logs as not to lose my lead on the Erasers who had gotten closer since my break.
"Got to...go quicker...or... they will...catch you again." I pant forcing my legs to go fast and suddenly a deer crosses my path forcing me to swerve and run head on into a tree.
"Ow...," I moan getting off the ground pressing my hands against my head "That's going to hurt later."
"Not as much as its going to hurt when we're through with you!" growled a voice to my left threateningly as three more stalked out of the woods "Yeah," chimed another voice. "we were told to bring you back alive but they said nothing about riling you up a bit."
Erasers, more than one by the looks and sounds of it. Half-man half-wolf always blood thirsty and always wanting a fight, my cousins by DNA.
'Cousins?,' the wolf growled inside me. 'They'd be lucky to be even considered dogs!'
"Go away! I'm not going back this time!" I yelled angrily swiping at one that wandered too near hitting him on the back of his head, growling he ducked back showing his canines.
"You know you're coming back, just like every other time," laughed a Eraser to my side darting forward to nudge me harshly in the side. I fell to the ground biting my cheeks in rage. I knew they were taunting me and I also knew my Alpha Rage was causing the red spots in my vision but that didn't stop me from snapping my jaws threateningly back at him as another came and swiped at my side drawing blood. Seeing my own blood only made me angrier and I growled warningly at all of them showing my own sharp canines.
One laughed, "Look at the little puppy!" he teased daring to come forward and grab my cheek in mock...
Find Another Essay On The Wolf Experiment (A Maximum Ride Fanfic)
A Critique Of the Stanford Experiment
561 words - 2 pages A Critique Of the Stanford Experiment'The Education of a Torturer' is an account of experiments that has similar resultsto that of Milgram's obedience experimentsthat were performed in 1963. Though bothexperiments vary drastically, both have one grim outcome, that is that, 'it is ordinarypeople, not psychopaths, who become the Eichmanns of history.'The Stanford experiment was performed by psychologists Craig Haney, W. CurtisBanks, and Philip
Experiment on the Decomposition of a Carbonate
628 words - 3 pages AIM: To carry out a lab experiment to decompose a carbonate using heat, also to carry out appropriate tests for the formation of products as a result of this decomposition.DISSCUSION: Carbonates are decomposed by heat into the corresponding oxides and carbon dioxide. The temperature of decomposition depends upon the activity of the metal; that is to say, the more active the metal, the more stable is the carbonate. Thus, the carbonates of sodium
Midnight Ride of Paul Revere, a ride which warned the colonists of an approaching revolution that would shape the future of America
2072 words - 8 pages Colonel Conant. The Colonel was to hang one lantern in the steeple of the church if the British showed signs of an invasion on land, or display two lanterns in the spire if evidence existed a sea invasion by the British. Once Paul Revere saw the two signal lanterns hanging in the steeple, signaling the imminent approach by sea of the British forces, he began his ride from Charlestown to Lexington to Concord (Lancaster 94), warning the citizens of
The True Story of the 3 Little Pigs by A. Wolf
706 words - 3 pages The True Story of the 3 Little Pigs by A. Wolf Have you ever wondered what the wolf's side of The Three Little Pigs story was? Well, Jon Scieszka gives his readers the opportunity to see a different perspective dealing with this very circumstance. In many of his books, including The True Story of the 3 Little Pigs by A. Wolf, Scieszka has used this style of writing that varies from the norm. Every turn of the page gives rise to new wonder
"A cold Day in Paradise" and "WInter on the Wolf Moon" by Alex McKnight
1970 words - 8 pages Life is a journey not a destination. On the road of life adversity teaches the most valuable lessons. The emotional outcome of one's choices always carries a heavy burden; guilt exists a common feeling. "How unhappy is he who cannot forgive himself" (Syrus 48). Guilt causes a multitude of different reactions. In Steve Hamilton's novel and its sequel, A Cold Day in Paradise and Winter of the Wolf Moon, unresolved guilt burdens the protagonist
The Stanford Prison Experiment: Taking a Deeper Look
1023 words - 5 pages heard about the Stanford Prison Experiment, but may not have been aware of the scars that it left upon the participants. Taking a deeper look into the study and the impacted outcomes on individuals will be elaborated on (Stanford Prison Experiment). On August 14, 1971, the Stanford Prison Experiment had begun. The volunteers who had replied to the ad in the newspaper just weeks before were arrested for the claims of Armed Robbery and Burglary
Experiment to investigate the heat released during a displacement reaction
1671 words - 7 pages PlanningIn this investigation I am going to investigate the various heat released during a displacement reaction when one factor, the variable, is changed. There are a number of variables which could be used in this experiment. You can change the metal used, the concentration of the metal salt, the amount of the metal, the type of metal salt, or the volume of the solution. In the experiment, the independent variable will be the concentration of
The "Noble Experiment" of Prohibition:Creating a Positive Future for America
984 words - 4 pages history that would later be described as the "noble experiment" of prohibition and set historians, policy makers, and citizens alike on the great debate as to whether this experiment had created more harm than good. The standard view of national alcohol prohibition was that it was a failed social experiment. Support for this argument is generally backed by knowledge that by prohibiting alcoholic beverages in such a way created a black market
The Stanford Prison Experiment - Choosing to Remain A Prisoner
1015 words - 5 pages Allowing & Choosing to be a Prisoner The Stanford Prison Experiment was a great example of how people can become imprisoned by accepting the roles others assigned to them. Also, some of them remained prisoners because they did not want to be scrutinized by the other participants for trying to be different. Furthermore, the experiment demonstrated how people will go along with something even if they don't want to. As children most of us are
This is a wonderful research paper about a train ride into the wonderful mountains of West Virginia
2230 words - 9 pages StateRailroad & Logging Historical Association. To go round trip from Cass to WhittakerStation it takes approximately one and a half hours. The pricing for the year 2000 are asfollows:WeekdaysWeekendsAdults$12.00$14.00(5 - 12) Child$7.00$9.00Train ride discount$4.00*$6.00**This applies to a second train ride within seven days.Cass also provides a $1.00 discount on tickets for groups of people of 25 persons andmore. The fall color rates are little
Revisiting the Stanford Prison Experiment: a Lesson in the Power of Situation Critique
893 words - 4 pages PAGE \* MERGEFORMAT 1 Running head: ARTICLE CRITIQUEArticle Critique Revisiting the Stanford Prison Experiment: a Lesson in the Power of Situation January 17, 2012This is a critique of an article published in Chronicle of Higher Education, (v53 n30 pB6 Mar. 30, 2007) on "Revisiting the Stanford Prison Experiment: a Lesson in the Power of Situation" by Philip G. Zimbardo. This article discusses issues related to how good people can turn
The Ride Of My Life A Childhood Story
637 words - 3 pages take me here?" My mom started apologizing but I could not hear her because her voice was drowned out by gunshots and screams from pirate ships. The row boat started swaying and I clenched my stuffed animal tight to my chest. I closed my eyes and my mother held my hand.Before I knew it the boat ride was over and we had reached land. My mother took my hand and walked me quickly through the gift shop. I looked around and said I wanted a toy and my
The Case Against Allowing Children To Ride A Bike Solo
1177 words - 5 pages THE CASE AGAINST ALLOWING CHILDREN UNDER AGE 12 TO RIDE A BIKE SOLO At the age of ten while riding home from school in Columbus Ohio; a stranger attempted to lure me into his car. I attempted to ignore him, however rather than leaving his behavior became more aggressive. I remembered that one of my classmates lived near, so I began to ride with a mission. When I reached Pam's home, I threw the bike down and began screaming. I ran to their
Why It Is Critical For The United States To Enforce A Maximum Wage Ratio
1435 words - 6 pages For Every Minimum, There Should Be A Maximum: Why It Is Critical For the United States to Enforce a Maximum Wage Ratio Across the ages, socioeconomic inequality has been an issue that has plagued civilizations. From the age of the Pharaohs in Egypt, to the Feudal Lords of Medieval Europe, all the way to present day caste-like groupings of lower, middle and upper-class income brackets, segregation has beset itself upon societies, dividing them
The Wolf Of Wall Street A Film By Martin Scorsese
1606 words - 6 pages The only person the narcissist will ever pity or feel sorry for is him/herself. If the narcissist believes he/she can get away with doing something (even if it's illegal, immoral, or will hurt someone), he/she will do it. At different times, many high profile individuals are classified as a narcissist in the media. The movie "The Wolf Of Wall Street" demonstrates how a rapid success leads to the narcissistic behavior. "Feel good" holiday movies
Freedom of Speech in the School System: Rights for Dean and Students
My Brother, Killed in Battle: Personal Journal
Managing Time as an Adult Learner in College
What is a Huricane? Essay
East Asian Reaction to European Presence
The Difficulties of Moving to A Different Country and Experiencing Another Culture
All About Anxiety Essay
Standarizing a Physician Assistant´s Scope of Practice


Please click here to visit the 128 Business Council website for traffic updates.
Exit ramp exits onto bridge.
Cross back over Rt. 128 and take a right at the lights/intersection on to Third Avenue. Once on Third Avenue you will see the Westin Hotel on your left and a retail mall on your right known as Prospect Hill Village. The Nelson Companies is in the three story tower of Prospect Hill Village on the Third Floor.
From the off ramp you will bear right and turn on to Third Avenue (the exit ramp turns on to Third Avenue). Once on Third Avenue you will see the Westin Hotel on your left and a retail mall on your right known as Prospect Hill Village. The Nelson Companies is in the three story tower of Prospect Hill Village on the Third Floor.
Take Rt. 95/128 North to Exit 27A (Third Avenue) From the off ramp you will bear right and turn on to Third Avenue (the exit ramp turns onto Third Avenue). Once on Third Avenue you will see the Westin Hotel on your left and a retail mall on your right known as Prospect Hill Village. The Nelson Companies in the three story tower of Prospect Hill Village on the Third Floor.