You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by ch...@apache.org on 2014/12/19 17:37:25 UTC

svn commit: r1646790 - in /ctakes/site/new: index.html js/ctakes.rss.js js/jquery.rss.js js/moment.min.js

Author: chenpei
Date: Fri Dec 19 16:37:24 2014
New Revision: 1646790

URL: http://svn.apache.org/r1646790
Log:
CTAKES-342 - Add RSS feed box to read directly from our new blog page

Added:
    ctakes/site/new/js/ctakes.rss.js
    ctakes/site/new/js/jquery.rss.js
    ctakes/site/new/js/moment.min.js
Modified:
    ctakes/site/new/index.html

Modified: ctakes/site/new/index.html
URL: http://svn.apache.org/viewvc/ctakes/site/new/index.html?rev=1646790&r1=1646789&r2=1646790&view=diff
==============================================================================
--- ctakes/site/new/index.html (original)
+++ ctakes/site/new/index.html Fri Dec 19 16:37:24 2014
@@ -33,6 +33,10 @@
 <script src="js/lang-tabs.js"></script>
 <script src="js/downloads.js"></script>
 
+<script src="js/moment.min.js"></script>
+<script src="js/jquery.rss.js"></script>
+<script src="js/ctakes.rss.js"></script>
+
 <div class="container" style="max-width: 1200px;">
 
 <div class="masthead">
@@ -96,11 +100,8 @@
    <div class="col-md-3 col-md-push-9">
       <div class="news" style="margin-bottom: 20px;">
          <h5>Latest News </h5>
-         <ul class="list-unstyled">
-            <li><a href="news.html">cTAKES 3.2.1 released</a>
-               <span class="small">(Dec 10, 2014)</span></li>
-         </ul>
-         <p class="small" style="text-align: right;"><a href="/news/index.html">Archive</a></p>
+			<div id="rss-styled" class="well" style="display:none;"></div>
+         <p class="small" style="text-align: right;"><a href="https://blogs.apache.org/ctakes/">Archive</a></p>
       </div>
       <div class="hidden-xs hidden-sm">
          <!-- Button to page with interactive example of cTakes extraction capabilities -->

Added: ctakes/site/new/js/ctakes.rss.js
URL: http://svn.apache.org/viewvc/ctakes/site/new/js/ctakes.rss.js?rev=1646790&view=auto
==============================================================================
--- ctakes/site/new/js/ctakes.rss.js (added)
+++ ctakes/site/new/js/ctakes.rss.js Fri Dec 19 16:37:24 2014
@@ -0,0 +1,12 @@
+jQuery(function($) {
+$("#rss-styled").rss("https://blogs.apache.org/ctakes/feed/entries/atom?cat=%2FNews", {
+    limit: 5,
+    layoutTemplate: '<dl class="dl-horizontal">{entries}</dl>',
+    entryTemplate: '{title} <br/> {shortBodyPlain} <a href="{url}">{prettyDate}</a>',
+	tokens: {
+            prettyDate: function(entry, tokens) {
+              return moment(tokens.date).format("MMM DD YYYY")
+            }
+			}
+}).show();
+})
\ No newline at end of file

Added: ctakes/site/new/js/jquery.rss.js
URL: http://svn.apache.org/viewvc/ctakes/site/new/js/jquery.rss.js?rev=1646790&view=auto
==============================================================================
--- ctakes/site/new/js/jquery.rss.js (added)
+++ ctakes/site/new/js/jquery.rss.js Fri Dec 19 16:37:24 2014
@@ -0,0 +1,264 @@
+(function($) {
+  "use strict";
+
+  var RSS = function(target, url, options, callback) {
+    this.target       = target
+    this.url          = url
+    this.html         = []
+    this.effectQueue  = []
+
+    this.options = $.extend({
+      ssl: false,
+      limit: null,
+      key: null,
+      layoutTemplate: '<ul>{entries}</ul>',
+      entryTemplate: '<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>',
+      tokens: {},
+      outputMode: 'json',
+      effect: 'show',
+      offsetStart: false,
+      offsetEnd: false,
+      error: function() {
+        console.log("jQuery RSS: url doesn't link to RSS-Feed");
+      },
+      success: function(){}
+    }, options || {})
+
+    this.callback = callback || this.options.success
+  }
+
+  RSS.htmlTags = ["doctype", "html", "head", "title", "base", "link", "meta", "style", "script", "noscript", "body", "article", "nav", "aside", "section", "header", "footer", "h1-h6", "hgroup", "address", "p", "hr", "pre", "blockquote", "ol", "ul", "li", "dl", "dt", "dd", "figure", "figcaption", "div", "table", "caption", "thead", "tbody", "tfoot", "tr", "th", "td", "col", "colgroup", "form", "fieldset", "legend", "label", "input", "button", "select", "datalist", "optgroup", "option", "textarea", "keygen", "output", "progress", "meter", "details", "summary", "command", "menu", "del", "ins", "img", "iframe", "embed", "object", "param", "video", "audio", "source", "canvas", "track", "map", "area", "a", "em", "strong", "i", "b", "u", "s", "small", "abbr", "q", "cite", "dfn", "sub", "sup", "time", "code", "kbd", "samp", "var", "mark", "bdi", "bdo", "ruby", "rt", "rp", "span", "br", "wbr"]
+
+  RSS.prototype.load = function(callback) {
+    var apiProtocol = "http" + (this.options.ssl ? "s" : "")
+      , apiHost     = apiProtocol + "://ajax.googleapis.com/ajax/services/feed/load"
+      , apiUrl      = apiHost + "?v=1.0&output=" + this.options.outputMode + "&callback=?&q=" + encodeURIComponent(this.url)
+
+    // set limit to offsetEnd if offset has been set
+    if(this.options.offsetStart && this.options.offsetEnd) this.options.limit = this.options.offsetEnd;
+    if (this.options.limit != null) apiUrl += "&num=" + this.options.limit;
+    if (this.options.key != null)   apiUrl += "&key=" + this.options.key;
+
+    $.getJSON(apiUrl, callback)
+  }
+
+  RSS.prototype.render = function() {
+    var self = this
+
+    this.load(function(data) {
+      try {
+        self.feed    = data.responseData.feed
+        self.entries = data.responseData.feed.entries
+      } catch(e) {
+        self.entries = []
+        self.feed    = null
+        return self.options.error.call(self)
+      }
+
+      var html = self.generateHTMLForEntries()
+
+      self.target.append(html.layout)
+
+      if (html.entries.length !== 0) {
+        self.appendEntriesAndApplyEffects($("entries", html.layout), html.entries)
+      }
+
+      if (self.effectQueue.length > 0) {
+        self.executeEffectQueue(self.callback)
+      } else {
+        $.isFunction(self.callback) && self.callback.call(self);
+      }
+    })
+  }
+
+  RSS.prototype.appendEntriesAndApplyEffects = function(target, entries) {
+    var self = this
+
+    $.each(entries, function(idx, entry) {
+      var $html = self.wrapContent(entry)
+
+      if(self.options.effect === 'show') {
+        target.before($html)
+      } else {
+        $html.css({ display: 'none' })
+        target.before($html)
+        self.applyEffect($html, self.options.effect)
+      }
+    })
+
+    target.remove()
+  }
+
+  RSS.prototype.generateHTMLForEntries = function() {
+    var self   = this
+      , result = {
+          entries: [],
+          layout:  null
+        }
+
+    $(this.entries).each(function() {
+      var entry = this,
+          offsetStart = self.options.offsetStart,
+          offsetEnd = self.options.offsetEnd;
+      // offset required
+      if(offsetStart && offsetEnd) {
+        if(index >= offsetStart && index <= offsetEnd) {
+            if(self.isRelevant(entry, result.entries)) {
+                var evaluatedString = self.evaluateStringForEntry(self.options.entryTemplate, entry)
+                result.entries.push(evaluatedString)
+            }           
+        }
+      }else{
+      // no offset
+        if(self.isRelevant(entry, result.entries)) {
+            var evaluatedString = self.evaluateStringForEntry(self.options.entryTemplate, entry)
+            result.entries.push(evaluatedString)
+        }
+      }
+    })
+
+    if(!!this.options.entryTemplate) {
+      // we have an entryTemplate
+      result.layout = this.wrapContent(this.options.layoutTemplate.replace("{entries}", "<entries></entries>"))
+    } else {
+      // no entryTemplate available
+      result.layout = this.wrapContent("<div><entries></entries></div>")
+    }
+
+    return result
+  }
+
+  RSS.prototype.wrapContent = function(content) {
+    if($.trim(content).indexOf('<') !== 0) {
+      // the content has no html => create a surrounding div
+      return $("<div>" + content + "</div>")
+    } else {
+      // the content has html => don't touch it
+      return $(content)
+    }
+  }
+
+  RSS.prototype.applyEffect = function($element, effect, callback) {
+    var self = this
+
+    switch(effect) {
+      case 'slide':
+        $element.slideDown('slow', callback)
+        break
+      case 'slideFast':
+        $element.slideDown(callback)
+        break
+      case 'slideSynced':
+        self.effectQueue.push({ element: $element, effect: 'slide' })
+        break
+      case 'slideFastSynced':
+        self.effectQueue.push({ element: $element, effect: 'slideFast' })
+        break
+    }
+  }
+
+  RSS.prototype.executeEffectQueue = function(callback) {
+    var self = this
+
+    this.effectQueue.reverse()
+
+    var executeEffectQueueItem = function() {
+      var item = self.effectQueue.pop()
+
+      if(item) {
+        self.applyEffect(item.element, item.effect, executeEffectQueueItem)
+      } else {
+        callback && callback()
+      }
+    }
+
+    executeEffectQueueItem()
+  }
+
+  RSS.prototype.evaluateStringForEntry = function(string, entry) {
+    var result = string
+      , self   = this
+
+    $(string.match(/(\{.*?\})/g)).each(function() {
+      var token = this.toString()
+      result = result.replace(token, self.getValueForToken(token, entry))
+    })
+
+    return result
+  }
+
+  RSS.prototype.isRelevant = function(entry, entries) {
+    var tokenMap = this.getTokenMap(entry)
+
+    if(this.options.filter) {
+      if(this.options.filterLimit && (this.options.filterLimit == entries.length)) {
+        return false
+      } else {
+        return this.options.filter(entry, tokenMap)
+      }
+    } else {
+      return true
+    }
+  }
+
+  RSS.prototype.getTokenMap = function(entry) {
+    if (!this.feedTokens) {
+      var feed = JSON.parse(JSON.stringify(this.feed))
+      delete feed.entries
+      this.feedTokens = feed
+    }
+
+    return $.extend({
+      feed:      this.feedTokens,
+      url:       entry.link,
+      author:    entry.author,
+      date:      entry.publishedDate,
+      title:     entry.title,
+      body:      entry.content,
+      shortBody: entry.contentSnippet,
+
+      bodyPlain: (function(entry) {
+        var result = entry.content
+          .replace(/<script[\\r\\\s\S]*<\/script>/mgi, '')
+          .replace(/<\/?[^>]+>/gi, '')
+
+        for(var i = 0; i < RSS.htmlTags.length; i++) {
+          result = result.replace(new RegExp('<' + RSS.htmlTags[i], 'gi'), '')
+        }
+
+        return result
+      })(entry),
+
+      shortBodyPlain: entry.contentSnippet.replace(/<\/?[^>]+>/gi, ''),
+      index:          $.inArray(entry, this.entries),
+      totalEntries:   this.entries.length,
+
+      teaserImage:    (function(entry){
+        try { return entry.content.match(/(<img.*?>)/gi)[0] }
+        catch(e) { return "" }
+      })(entry),
+
+      teaserImageUrl: (function(entry) {
+        try { return entry.content.match(/(<img.*?>)/gi)[0].match(/src="(.*?)"/)[1] }
+        catch(e) { return "" }
+      })(entry)
+    }, this.options.tokens)
+  }
+
+  RSS.prototype.getValueForToken = function(_token, entry) {
+    var tokenMap = this.getTokenMap(entry)
+      , token    = _token.replace(/[\{\}]/g, '')
+      , result   = tokenMap[token]
+
+    if(typeof result != 'undefined')
+      return ((typeof result == 'function') ? result(entry, tokenMap) : result)
+    else
+      throw new Error('Unknown token: ' + _token)
+  }
+
+  $.fn.rss = function(url, options, callback) {
+    new RSS(this, url, options, callback).render()
+    return this; //implement chaining
+  }
+
+})(jQuery)

Added: ctakes/site/new/js/moment.min.js
URL: http://svn.apache.org/viewvc/ctakes/site/new/js/moment.min.js?rev=1646790&view=auto
==============================================================================
--- ctakes/site/new/js/moment.min.js (added)
+++ ctakes/site/new/js/moment.min.js Fri Dec 19 16:37:24 2014
@@ -0,0 +1,6 @@
+// moment.js
+// version : 1.7.2
+// author : Tim Wood
+// license : MIT
+// momentjs.com
+(function(a){function E(a,b,c,d){var e=c.lang();return e[a].call?e[a](c,d):e[a][b]}function F(a,b){return function(c){return K(a.call(this,c),b)}}function G(a){return function(b){var c=a.call(this,b);return c+this.lang().ordinal(c)}}function H(a,b,c){this._d=a,this._isUTC=!!b,this._a=a._a||null,this._lang=c||!1}function I(a){var b=this._data={},c=a.years||a.y||0,d=a.months||a.M||0,e=a.weeks||a.w||0,f=a.days||a.d||0,g=a.hours||a.h||0,h=a.minutes||a.m||0,i=a.seconds||a.s||0,j=a.milliseconds||a.ms||0;this._milliseconds=j+i*1e3+h*6e4+g*36e5,this._days=f+e*7,this._months=d+c*12,b.milliseconds=j%1e3,i+=J(j/1e3),b.seconds=i%60,h+=J(i/60),b.minutes=h%60,g+=J(h/60),b.hours=g%24,f+=J(g/24),f+=e*7,b.days=f%30,d+=J(f/30),b.months=d%12,c+=J(d/12),b.years=c,this._lang=!1}function J(a){return a<0?Math.ceil(a):Math.floor(a)}function K(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}function L(a,b,c){var d=b._milliseconds,e=b._days,f=b._months,g;d&&a._d.setTime(+a+d*c),e&&a.date(a.date()+e*c),f&&(
 g=a.date(),a.date(1).month(a.month()+f*c).date(Math.min(g,a.daysInMonth())))}function M(a){return Object.prototype.toString.call(a)==="[object Array]"}function N(a,b){var c=Math.min(a.length,b.length),d=Math.abs(a.length-b.length),e=0,f;for(f=0;f<c;f++)~~a[f]!==~~b[f]&&e++;return e+d}function O(a,b,c,d){var e,f,g=[];for(e=0;e<7;e++)g[e]=a[e]=a[e]==null?e===2?1:0:a[e];return a[7]=g[7]=b,a[8]!=null&&(g[8]=a[8]),a[3]+=c||0,a[4]+=d||0,f=new Date(0),b?(f.setUTCFullYear(a[0],a[1],a[2]),f.setUTCHours(a[3],a[4],a[5],a[6])):(f.setFullYear(a[0],a[1],a[2]),f.setHours(a[3],a[4],a[5],a[6])),f._a=g,f}function P(a,c){var d,e,g=[];!c&&h&&(c=require("./lang/"+a));for(d=0;d<i.length;d++)c[i[d]]=c[i[d]]||f.en[i[d]];for(d=0;d<12;d++)e=b([2e3,d]),g[d]=new RegExp("^"+(c.months[d]||c.months(e,""))+"|^"+(c.monthsShort[d]||c.monthsShort(e,"")).replace(".",""),"i");return c.monthsParse=c.monthsParse||g,f[a]=c,c}function Q(a){var c=typeof a=="string"&&a||a&&a._lang||null;return c?f[c]||P(c):b}function R(a){re
 turn a.match(/\[.*\]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function S(a){var b=a.match(k),c,d;for(c=0,d=b.length;c<d;c++)D[b[c]]?b[c]=D[b[c]]:b[c]=R(b[c]);return function(e){var f="";for(c=0;c<d;c++)f+=typeof b[c].call=="function"?b[c].call(e,a):b[c];return f}}function T(a,b){function d(b){return a.lang().longDateFormat[b]||b}var c=5;while(c--&&l.test(b))b=b.replace(l,d);return A[b]||(A[b]=S(b)),A[b](a)}function U(a){switch(a){case"DDDD":return p;case"YYYY":return q;case"S":case"SS":case"SSS":case"DDD":return o;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":case"a":case"A":return r;case"Z":case"ZZ":return s;case"T":return t;case"MM":case"DD":case"YY":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":return n;default:return new RegExp(a.replace("\\",""))}}function V(a,b,c,d){var e,f;switch(a){case"M":case"MM":c[1]=b==null?0:~~b-1;break;case"MMM":case"MMMM":for(e=0;e<12;e++)if(Q().monthsParse[e].test(b)){c[1]=e,f=!0;break}f||(c[8]
 =!1);break;case"D":case"DD":case"DDD":case"DDDD":b!=null&&(c[2]=~~b);break;case"YY":c[0]=~~b+(~~b>70?1900:2e3);break;case"YYYY":c[0]=~~Math.abs(b);break;case"a":case"A":d.isPm=(b+"").toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":c[3]=~~b;break;case"m":case"mm":c[4]=~~b;break;case"s":case"ss":c[5]=~~b;break;case"S":case"SS":case"SSS":c[6]=~~(("0."+b)*1e3);break;case"Z":case"ZZ":d.isUTC=!0,e=(b+"").match(x),e&&e[1]&&(d.tzh=~~e[1]),e&&e[2]&&(d.tzm=~~e[2]),e&&e[0]==="+"&&(d.tzh=-d.tzh,d.tzm=-d.tzm)}b==null&&(c[8]=!1)}function W(a,b){var c=[0,0,1,0,0,0,0],d={tzh:0,tzm:0},e=b.match(k),f,g;for(f=0;f<e.length;f++)g=(U(e[f]).exec(a)||[])[0],g&&(a=a.slice(a.indexOf(g)+g.length)),D[e[f]]&&V(e[f],g,c,d);return d.isPm&&c[3]<12&&(c[3]+=12),d.isPm===!1&&c[3]===12&&(c[3]=0),O(c,d.isUTC,d.tzh,d.tzm)}function X(a,b){var c,d=a.match(m)||[],e,f=99,g,h,i;for(g=0;g<b.length;g++)h=W(a,b[g]),e=T(new H(h),b[g]).match(m)||[],i=N(d,e),i<f&&(f=i,c=h);return c}function Y(a){var b="YYYY-MM-DDT",c;
 if(u.exec(a)){for(c=0;c<4;c++)if(w[c][1].exec(a)){b+=w[c][0];break}return s.exec(a)?W(a,b+" Z"):W(a,b)}return new Date(a)}function Z(a,b,c,d,e){var f=e.relativeTime[a];return typeof f=="function"?f(b||1,!!c,a,d):f.replace(/%d/i,b||1)}function $(a,b,c){var e=d(Math.abs(a)/1e3),f=d(e/60),g=d(f/60),h=d(g/24),i=d(h/365),j=e<45&&["s",e]||f===1&&["m"]||f<45&&["mm",f]||g===1&&["h"]||g<22&&["hh",g]||h===1&&["d"]||h<=25&&["dd",h]||h<=45&&["M"]||h<345&&["MM",d(h/30)]||i===1&&["y"]||["yy",i];return j[2]=b,j[3]=a>0,j[4]=c,Z.apply({},j)}function _(a,c){b.fn[a]=function(a){var b=this._isUTC?"UTC":"";return a!=null?(this._d["set"+b+c](a),this):this._d["get"+b+c]()}}function ab(a){b.duration.fn[a]=function(){return this._data[a]}}function bb(a,c){b.duration.fn["as"+a]=function(){return+this/c}}var b,c="1.7.2",d=Math.round,e,f={},g="en",h=typeof module!="undefined"&&module.exports,i="months|monthsShort|weekdays|weekdaysShort|weekdaysMin|longDateFormat|calendar|relativeTime|ordinal|meridiem".split("|
 "),j=/^\/?Date\((\-?\d+)/i,k=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|SS?S?|zz?|ZZ?|.)/g,l=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?)/g,m=/([0-9a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)/gi,n=/\d\d?/,o=/\d{1,3}/,p=/\d{3}/,q=/\d{1,4}/,r=/[0-9a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+/i,s=/Z|[\+\-]\d\d:?\d\d/i,t=/T/i,u=/^\s*\d{4}-\d\d-\d\d(T(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/,v="YYYY-MM-DDTHH:mm:ssZ",w=[["HH:mm:ss.S",/T\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/T\d\d:\d\d:\d\d/],["HH:mm",/T\d\d:\d\d/],["HH",/T\d\d/]],x=/([\+\-]|\d\d)/gi,y="Month|Date|Hours|Minutes|Seconds|Milliseconds".split("|"),z={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},A={},B="DDD w M D d".split(" "),C="M D H h m s w".split(" "),D={M:function(){return this.month()+1},MMM:function(a){return E("monthsShort",this.month(),this,a)},MMMM:function(a){return E("months",this.month(),this,a)},D:function(){re
 turn this.date()},DDD:function(){var a=new Date(this.year(),this.month(),this.date()),b=new Date(this.year(),0,1);return~~((a-b)/864e5+1.5)},d:function(){return this.day()},dd:function(a){return E("weekdaysMin",this.day(),this,a)},ddd:function(a){return E("weekdaysShort",this.day(),this,a)},dddd:function(a){return E("weekdays",this.day(),this,a)},w:function(){var a=new Date(this.year(),this.month(),this.date()-this.day()+5),b=new Date(a.getFullYear(),0,4);return~~((a-b)/864e5/7+1.5)},YY:function(){return K(this.year()%100,2)},YYYY:function(){return K(this.year(),4)},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return~~(this.milliseconds()/100)},SS:function(){return K(~~(this.milliseconds()/10),2)},SSS:function(){return K(thi
 s.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return a<0&&(a=-a,b="-"),b+K(~~(a/60),2)+":"+K(~~a%60,2)},ZZ:function(){var a=-this.zone(),b="+";return a<0&&(a=-a,b="-"),b+K(~~(10*a/6),4)}};while(B.length)e=B.pop(),D[e+"o"]=G(D[e]);while(C.length)e=C.pop(),D[e+e]=F(D[e],2);D.DDDD=F(D.DDD,3),b=function(c,d){if(c===null||c==="")return null;var e,f;return b.isMoment(c)?new H(new Date(+c._d),c._isUTC,c._lang):(d?M(d)?e=X(c,d):e=W(c,d):(f=j.exec(c),e=c===a?new Date:f?new Date(+f[1]):c instanceof Date?c:M(c)?O(c):typeof c=="string"?Y(c):new Date(c)),new H(e))},b.utc=function(a,c){return M(a)?new H(O(a,!0),!0):(typeof a=="string"&&!s.exec(a)&&(a+=" +0000",c&&(c+=" Z")),b(a,c).utc())},b.unix=function(a){return b(a*1e3)},b.duration=function(a,c){var d=b.isDuration(a),e=typeof a=="number",f=d?a._data:e?{}:a,g;return e&&(c?f[c]=a:f.milliseconds=a),g=new I(f),d&&(g._lang=a._lang),g},b.humanizeDuration=function(a,c,d){return b.duration(a,c===!0?null:c).humanize(c===!0?!0:d)},b.version
 =c,b.defaultFormat=v,b.lang=function(a,c){var d;if(!a)return g;(c||!f[a])&&P(a,c);if(f[a]){for(d=0;d<i.length;d++)b[i[d]]=f[a][i[d]];b.monthsParse=f[a].monthsParse,g=a}},b.langData=Q,b.isMoment=function(a){return a instanceof H},b.isDuration=function(a){return a instanceof I},b.lang("en",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[last] dddd [at] LT",sameElse:"L"},relativeTime:{futu
 re:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"}}),b.fn=H.prototype={clone:function(){return b(this)},valueOf:function(){return+this._d},unix:function(){return Math.floor(+this._d/1e3)},toString:function(){return this._d.toString()},toDate:function(){return this._d},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds(),!!this._isUTC]},isValid:function(){return this._a?this._a[8]!=null?!!this._a[8]:!N(this._a,(this._a[7]?b.utc(this._a):b(this._a)).toArray()):!isNaN(this._d.getTime())},utc:function(){return this._isUTC=!0,this},local:function(){return this._isUTC=!1,this},format:function(a){return T(this,a?a:b.defaultFormat)},add:function(a,c){var d=c?b.duration(+c,a):b.duration(a);return L(this,d,1),this
 },subtract:function(a,c){var d=c?b.duration(+c,a):b.duration(a);return L(this,d,-1),this},diff:function(a,c,e){var f=this._isUTC?b(a).utc():b(a).local(),g=(this.zone()-f.zone())*6e4,h=this._d-f._d-g,i=this.year()-f.year(),j=this.month()-f.month(),k=this.date()-f.date(),l;return c==="months"?l=i*12+j+k/30:c==="years"?l=i+(j+k/30)/12:l=c==="seconds"?h/1e3:c==="minutes"?h/6e4:c==="hours"?h/36e5:c==="days"?h/864e5:c==="weeks"?h/6048e5:h,e?l:d(l)},from:function(a,c){return b.duration(this.diff(a)).lang(this._lang).humanize(!c)},fromNow:function(a){return this.from(b(),a)},calendar:function(){var a=this.diff(b().sod(),"days",!0),c=this.lang().calendar,d=c.sameElse,e=a<-6?d:a<-1?c.lastWeek:a<0?c.lastDay:a<1?c.sameDay:a<2?c.nextDay:a<7?c.nextWeek:d;return this.format(typeof e=="function"?e.apply(this):e)},isLeapYear:function(){var a=this.year();return a%4===0&&a%100!==0||a%400===0},isDST:function(){return this.zone()<b([this.year()]).zone()||this.zone()<b([this.year(),5]).zone()},day:functi
 on(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return a==null?b:this.add({d:a-b})},startOf:function(a){switch(a.replace(/s$/,"")){case"year":this.month(0);case"month":this.date(1);case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return this},endOf:function(a){return this.startOf(a).add(a.replace(/s?$/,"s"),1).subtract("ms",1)},sod:function(){return this.clone().startOf("day")},eod:function(){return this.clone().endOf("day")},zone:function(){return this._isUTC?0:this._d.getTimezoneOffset()},daysInMonth:function(){return b.utc([this.year(),this.month()+1,0]).date()},lang:function(b){return b===a?Q(this):(this._lang=b,this)}};for(e=0;e<y.length;e++)_(y[e].toLowerCase(),y[e]);_("year","FullYear"),b.duration.fn=I.prototype={weeks:function(){return J(this.days()/7)},valueOf:function(){return this._milliseconds+this._days*864e5+this._months*2592e6},humanize:function(a){var b=+this,c=this.lang().relativeTime,d=$(
 b,!a,this.lang()),e=b<=0?c.past:c.future;return a&&(typeof e=="function"?d=e(d):d=e.replace(/%s/i,d)),d},lang:b.fn.lang};for(e in z)z.hasOwnProperty(e)&&(bb(e,z[e]),ab(e.toLowerCase()));bb("Weeks",6048e5),h&&(module.exports=b),typeof ender=="undefined"&&(this.moment=b),typeof define=="function"&&define.amd&&define("moment",[],function(){return b})}).call(this);
\ No newline at end of file