├── LICENSE ├── README.md ├── assets ├── background.jpg └── sephuz's-secret.jpg ├── css └── killpoints.css ├── favicon.ico ├── index.html ├── js ├── dungeons.js ├── killpoints.js ├── moment.min.js ├── realms.js └── typeahead.js └── tags ├── advanced-form.tag ├── character-selection.tag ├── error.tag ├── killpoints.tag ├── loading.tag └── simple-form.tag /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Killpoints 2 | 3 | This site calculates killpoints for characters based on [this spreadsheet](https://docs.google.com/spreadsheets/d/1uRPy-cc98TLHscgqMyjAz7yD3ON_dhaPDIr_Nand07U) and the information in [this thread](http://www.mmo-champion.com/threads/2091126-Real-Legendary-drop-rates-and-other-statistics-for-9785-chars-Spreadsheet). 4 | 5 | Built with [riotjs](http://riotjs.com/). 6 | 7 | ## Frequently asked questions 8 | 9 | > It tells me i should have received X legendaries but i actually have Y! 10 | 11 | Even though we try to correlate legendary drops to content done, it's still all based on **RNG**. Some people are lucky, and some are not. 12 | 13 | > My alt has way to much killpoints. 14 | 15 | A part of the killpoints calculation is based on the time that character has been level 110. Please set character specific achievements ingame under `Interface > Social`, or else a part of the killpoints will be based on how long *your main* has been 110. 16 | 17 | > My killpoints aren't showing, i keep seeing the spinner. 18 | 19 | Please do not use Internet Explorer. 20 | -------------------------------------------------------------------------------- /assets/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rsuurd/killpoints/b1b010a91cd18e7f625eebbc653802c67b640a7b/assets/background.jpg -------------------------------------------------------------------------------- /assets/sephuz's-secret.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rsuurd/killpoints/b1b010a91cd18e7f625eebbc653802c67b640a7b/assets/sephuz's-secret.jpg -------------------------------------------------------------------------------- /css/killpoints.css: -------------------------------------------------------------------------------- 1 | html { 2 | position: relative; 3 | min-height: 100%; 4 | } 5 | 6 | body { 7 | background: url('../assets/background.jpg'); 8 | background-size: cover; 9 | background-repeat: no-repeat; 10 | margin-bottom: 8rem; 11 | } 12 | 13 | #character-selection { 14 | margin-top: 6rem; 15 | } 16 | 17 | .killpoints { 18 | font-size: x-large; 19 | } 20 | 21 | .card { 22 | margin-top: 1rem; 23 | } 24 | 25 | input { 26 | text-transform: capitalize;; 27 | } 28 | 29 | .alert { 30 | margin-top: 1rem; 31 | } 32 | 33 | .footer { 34 | padding-top: 1rem; 35 | color: white; 36 | background-color:#222; 37 | position: absolute; 38 | bottom: 0; 39 | width: 100%; 40 | min-height: 6rem; 41 | } 42 | 43 | .footer a, .footer em, .footer i { 44 | color: #fcab0e; 45 | } 46 | 47 | .progress-legendary { 48 | width: calc(100% - 4rem); 49 | margin-top: .5rem; 50 | margin-right: .5rem; 51 | } 52 | 53 | .legendary { 54 | color: #ff8000; 55 | } 56 | 57 | .bg-legendary { 58 | background-color: #ff8000; 59 | } 60 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rsuurd/killpoints/b1b010a91cd18e7f625eebbc653802c67b640a7b/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | What are my killpoints? 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |

NOTICE: The information presented here is severely outdated. Blizzard has made numerous changes to the drop rates, introduced per spec Bad Luck Protection™ and added craftable legendaries meaning this calculator is no longer relevant.

I'm leaving this up for entertainment purposes only.

15 |

16 | 17 |
18 |
19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 |
27 |
28 | 29 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /js/dungeons.js: -------------------------------------------------------------------------------- 1 | const NORMAL_DUNGEONS = [ 2 | 10878, // Eye of Azshara 3 | 10881, // Darkheart Thicket 4 | 10884, // Neltharion's Lair 5 | 10887, // Halls of Valor 6 | 10890, // Assault on Violet Hold 7 | 10893, // Assault on Violet Hold 8 | 10896, // Vault of the Wardens, 9 | 10899, // Blackrook Hold 10 | 10902 // Maw of Souls 11 | ]; 12 | 13 | const HEROIC_DUNGEONS = [ 14 | 10879, // Eye of Azshara 15 | 10882, // Darkheear Thicket 16 | 10885, // Neltharion's Lair 17 | 10888, // Halls of Valor 18 | 10891, // Assault on Violet Hold 19 | 10894, // Assault on Violet Hold 20 | 10897, // Vault of the Wardens, 21 | 10900, // Blackrook Hold 22 | 10903 // Maw of Souls 23 | ] 24 | 25 | const MYTHIC_DUNGEONS = [ 26 | 10880, // Eye of Azshara 27 | 10883, // Darkheart Thicket 28 | 10886, // Neltharion's Lair 29 | 10889, // Halls of Valor 30 | 10892, // Assault on Violet Hold 31 | 10895, // Assault on Violet Hold 32 | 10898, // Vault of the Wardens, 33 | 10901, // Blackrook Hold 34 | 10904, // Maw of Souls 35 | 10907, // Arcway 36 | 10910, // Court of Stars 37 | 11406 // Karazhan 38 | ] 39 | -------------------------------------------------------------------------------- /js/killpoints.js: -------------------------------------------------------------------------------- 1 | route.start(true); 2 | 3 | route('/', function() { 4 | riot.mount('#character-selection', 'character-selection'); 5 | }); 6 | route(function(region, realm, character) { 7 | var characterInfo = { 8 | region: region, 9 | realm: decodeURIComponent(realm).replace(/\+/g, ' '), 10 | character: decodeURIComponent(character) 11 | }; 12 | 13 | var query = route.query(); 14 | 15 | if (query.emissaries) { 16 | characterInfo.emissaries = parseInt(query.emissaries) 17 | } 18 | 19 | if (query.weeklies) { 20 | characterInfo.weeklies = parseInt(query.weeklies) 21 | } 22 | 23 | riot.mount('#character-selection', 'character-selection', characterInfo); 24 | 25 | calculate(characterInfo, function(data) { 26 | riot.mount('#killpoints', 'killpoints', data); 27 | }) 28 | }); 29 | 30 | function calculate(characterInfo, callback) { 31 | riot.mount('#killpoints', 'loading'); 32 | 33 | var url = 'https://' + encodeURIComponent(characterInfo.region) + '.api.battle.net/wow/character/' + encodeURIComponent(characterInfo.realm) + '/' + encodeURIComponent(characterInfo.character) + '?fields=progression,achievements,statistics&apikey=' + API_KEY; 34 | 35 | fetch(url, { 36 | headers: { 37 | 'Access-Control-Allow-Origin': '*' 38 | } 39 | }).then(function(response) { 40 | if (response.ok) { 41 | return response.json(); 42 | } else { 43 | throw Error(response.statusText); 44 | } 45 | }).then(function(json) { 46 | if (json.level < 110) { 47 | throw Error('Level to 110 first.'); 48 | } else { 49 | callback({ 50 | 'region': characterInfo.region, 51 | 'name': json.name, 52 | 'avatar': json.thumbnail, 53 | 'killpoints': getKillpoints(characterInfo, json) 54 | }); 55 | } 56 | }).catch(function(error) { 57 | riot.mount('#killpoints', 'error', { message: error }); 58 | }); 59 | } 60 | 61 | function getKillpoints(characterInfo, json) { 62 | return Math.round(getDailyKillpoints(characterInfo, json.achievements) + 63 | getWeeklyChestKillpoints(characterInfo, json.achievements) + getDungeonKillpoints(json) + getRaidKillpoints(json.progression.raids)); 64 | } 65 | 66 | function getDailyKillpoints(characterInfo, achievements) { 67 | var emissaries = 0; 68 | 69 | if (characterInfo.hasOwnProperty('emissaries')) { 70 | emissaries = characterInfo.emissaries; 71 | } else { 72 | var index = achievements.achievementsCompleted.indexOf(10671); 73 | 74 | if (index >= 0) { 75 | emissaries = moment(new Date()).diff(achievements.achievementsCompletedTimestamp[index], 'days') + 2; 76 | } 77 | } 78 | 79 | return emissaries * 4; 80 | } 81 | 82 | function getWeeklyChestKillpoints(characterInfo, achievements) { 83 | var weeklies = 0; 84 | 85 | if (characterInfo.hasOwnProperty('weeklies')) { 86 | weeklies = characterInfo.weeklies; 87 | } else { 88 | var index = achievements.achievementsCompleted.indexOf(10671); 89 | 90 | if (index >= 0) { 91 | weeklies = moment().diff(moment.max(CHEST_AVAILABLE, moment(achievements.achievementsCompletedTimestamp[index])), 'weeks'); 92 | } 93 | } 94 | 95 | return weeklies * 15; 96 | } 97 | 98 | function getDungeonKillpoints(json) { 99 | var normalDungeons = 0; 100 | var heroicDungeons = 0; 101 | var mythicDungeons = 0; 102 | 103 | json.statistics.subCategories.find(subCategory => 104 | subCategory.id == 14807).subCategories.find(subCategory => subCategory.id == 15264).statistics.forEach(dungeon => { 105 | normalDungeons += (NORMAL_DUNGEONS.indexOf(dungeon.id) < 0) ? 0 : dungeon.quantity; 106 | heroicDungeons += (HEROIC_DUNGEONS.indexOf(dungeon.id) < 0) ? 0 : dungeon.quantity; 107 | mythicDungeons += (MYTHIC_DUNGEONS.indexOf(dungeon.id) < 0) ? 0 : dungeon.quantity; 108 | }); 109 | 110 | var index = json.achievements.criteria.indexOf(33096); 111 | var mythicPlusDungeons = (index < 0) ? 0 : json.achievements.criteriaQuantity[index]; 112 | var mythicZeroDungeons = mythicDungeons - mythicPlusDungeons; 113 | 114 | return ((normalDungeons + heroicDungeons) * 2) + (mythicZeroDungeons * 3) + (mythicPlusDungeons * 4); 115 | } 116 | 117 | function getRaidKillpoints(raids) { 118 | var killpoints = 0; 119 | 120 | raids.forEach(function(raid) { 121 | if (RAIDS.hasOwnProperty(raid.id)) { 122 | raid.bosses.forEach(function(boss) { 123 | killpoints += boss.lfrKills * 2; 124 | killpoints += boss.normalKills * 3; 125 | killpoints += boss.heroicKills * 4; 126 | killpoints += boss.mythicKills * 6; 127 | }); 128 | } 129 | }); 130 | 131 | return killpoints; 132 | } 133 | 134 | const API_KEY = 'kr2bfgpv5wtx5entzwkvvq6kqpwfwg7e'; 135 | 136 | const CHEST_AVAILABLE = moment('2016-09-21'); 137 | 138 | const RAIDS = { 139 | 8440: 'Trial of Valor', 140 | 8025: 'Nighthold', 141 | 8026: 'Emerald Nightmare' 142 | }; 143 | -------------------------------------------------------------------------------- /js/moment.min.js: -------------------------------------------------------------------------------- 1 | //! moment.js 2 | //! version : 2.17.1 3 | //! authors : Tim Wood, Iskren Chernev, Moment.js contributors 4 | //! license : MIT 5 | //! momentjs.com 6 | !function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return od.apply(null,arguments)} 7 | // This is done to register the method called with moment() 8 | // without creating circular dependencies. 9 | function b(a){od=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){ 10 | // IE8 will treat undefined and null as object if it wasn't for 11 | // input != null 12 | return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a) 13 | // even if its not own property I'd still call it non-empty 14 | return!1;return!0}function f(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function g(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function h(a,b){var c,d=[];for(c=0;c0)for(c in rd)d=rd[c],e=b[d],p(e)||(a[d]=e);return a} 17 | // Moment prototype object 18 | function r(b){q(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)), 19 | // Prevent infinite loop in case updateOffset creates new moment 20 | // objects. 21 | sd===!1&&(sd=!0,a.updateOffset(this),sd=!1)}function s(a){return a instanceof r||null!=a&&null!=a._isAMomentObject}function t(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function u(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=t(b)),c} 22 | // compare two arrays, return the number of differences 23 | function v(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;d0?"future":"past"];return z(c)?c(b):c.replace(/%s/i,b)}function J(a,b){var c=a.toLowerCase();Dd[c]=Dd[c+"s"]=Dd[b]=a}function K(a){return"string"==typeof a?Dd[a]||Dd[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)i(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(a,b){Ed[a]=b}function N(a){var b=[];for(var c in a)b.push({unit:c,priority:Ed[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function O(b,c){return function(d){return null!=d?(Q(this,b,d),a.updateOffset(this,c),this):P(this,b)}}function P(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function Q(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)} 29 | // MOMENTS 30 | function R(a){return a=K(a),z(this[a])?this[a]():this}function S(a,b){if("object"==typeof a){a=L(a);for(var c=N(a),d=0;d=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d} 31 | // token: 'M' 32 | // padded: ['MM', 2] 33 | // ordinal: 'Mo' 34 | // callback: function () { this.month() + 1 } 35 | function U(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Id[a]=e),b&&(Id[b[0]]=function(){return T(e.apply(this,arguments),b[1],b[2])}),c&&(Id[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function V(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function W(a){var b,c,d=a.match(Fd);for(b=0,c=d.length;b=0&&Gd.test(a);)a=a.replace(Gd,c),Gd.lastIndex=0,d-=1;return a}function Z(a,b,c){$d[a]=z(b)?b:function(a,d){return a&&c?c:b}}function $(a,b){return i($d,a)?$d[a](b._strict,b._locale):new RegExp(_(a))} 38 | // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript 39 | function _(a){return aa(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function aa(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ba(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),f(b)&&(d=function(a,c){c[b]=u(a)}),c=0;c=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ta(a){var b=new Date(Date.UTC.apply(null,arguments)); 68 | //the Date.UTC function remaps years 0-99 to 1900-1999 69 | return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b} 70 | // start-of-first-week - start-of-year 71 | function ua(a,b,c){var// first-week day -- which january is always in the first week (4 for iso, 1 for other) 72 | d=7+b-c, 73 | // first-week day local weekday -- which local weekday is fwd 74 | e=(7+ta(a,0,d).getUTCDay()-b)%7;return-e+d-1} 75 | //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday 76 | function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=pa(f)+j):j>pa(a)?(f=a+1,g=j-pa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(pa(a)-d+e)/7} 77 | // HELPERS 78 | // LOCALES 79 | function ya(a){return wa(a,this._week.dow,this._week.doy).week}function za(){return this._week.dow}function Aa(){return this._week.doy} 80 | // MOMENTS 81 | function Ba(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ca(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")} 82 | // HELPERS 83 | function Da(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ea(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Fa(a,b){return a?c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:this._weekdays}function Ga(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ha(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ia(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=k([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=je.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=je.call(this._minWeekdaysParse,g),e!==-1?e:(e=je.call(this._weekdaysParse,g),e!==-1?e:(e=je.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function Ja(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ia.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){ 84 | // test the regex 85 | if( 86 | // make the regex if we don't have it already 87 | e=k([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}} 88 | // MOMENTS 89 | function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Da(a,this.localeData()),this.add(a-b,"d")):b}function La(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Ma(a){if(!this.isValid())return null!=a?this:NaN; 90 | // behaves the same as moment#day except 91 | // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) 92 | // as a setter, sunday should belong to the previous week. 93 | if(null!=a){var b=Ea(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Na(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(i(this,"_weekdaysRegex")||(this._weekdaysRegex=ue),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Oa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(i(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ve),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Pa(a){return this._weekdaysParseExact?(i(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(i(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=we),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++) 94 | // make the regex if we don't have it already 95 | c=k([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for( 96 | // Sorting makes sure if one weekday (or abbr) is a prefix of another it 97 | // will match the longer piece. 98 | g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=aa(h[b]),i[b]=aa(i[b]),j[b]=aa(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")} 99 | // FORMATTING 100 | function Ra(){return this.hours()%12||12}function Sa(){return this.hours()||24}function Ta(a,b){U(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})} 101 | // PARSING 102 | function Ua(a,b){return b._meridiemParse} 103 | // LOCALES 104 | function Va(a){ 105 | // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays 106 | // Using charAt should be more compatible. 107 | return"p"===(a+"").toLowerCase().charAt(0)}function Wa(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Xa(a){return a?a.toLowerCase().replace("_","-"):a} 108 | // pick the locale from the array 109 | // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each 110 | // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root 111 | function Ya(a){for(var b,c,d,e,f=0;f0;){if(d=Za(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&v(e,c,!0)>=b-1) 112 | //the next array item is better than a shallower substring of this one 113 | break;b--}f++}return null}function Za(a){var b=null; 114 | // TODO: Find a better way to register and load all the locales in Node 115 | if(!Be[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=xe._abbr,require("./locale/"+a), 116 | // because defineLocale currently also sets the global locale, we 117 | // want to undo that for lazy loaded locales 118 | $a(b)}catch(a){}return Be[a]} 119 | // This function will load locale and then set the global locale. If 120 | // no arguments are passed in, it will simply return the current global 121 | // locale key. 122 | function $a(a,b){var c; 123 | // moment.duration._locale = moment._locale = data; 124 | return a&&(c=p(b)?bb(a):_a(a,b),c&&(xe=c)),xe._abbr}function _a(a,b){if(null!==b){var c=Ae;if(b.abbr=a,null!=Be[a])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=Be[a]._config;else if(null!=b.parentLocale){if(null==Be[b.parentLocale])return Ce[b.parentLocale]||(Ce[b.parentLocale]=[]),Ce[b.parentLocale].push({name:a,config:b}),null;c=Be[b.parentLocale]._config} 125 | // backwards compat for now: also set the locale 126 | // make sure we set the locale AFTER all child locales have been 127 | // created, so we won't end up with the child locale set. 128 | return Be[a]=new C(B(c,b)),Ce[a]&&Ce[a].forEach(function(a){_a(a.name,a.config)}),$a(a),Be[a]} 129 | // useful for testing 130 | return delete Be[a],null}function ab(a,b){if(null!=b){var c,d=Ae; 131 | // MERGE 132 | null!=Be[a]&&(d=Be[a]._config),b=B(d,b),c=new C(b),c.parentLocale=Be[a],Be[a]=c, 133 | // backwards compat for now: also set the locale 134 | $a(a)}else 135 | // pass null for config to unupdate, useful for tests 136 | null!=Be[a]&&(null!=Be[a].parentLocale?Be[a]=Be[a].parentLocale:null!=Be[a]&&delete Be[a]);return Be[a]} 137 | // returns locale data 138 | function bb(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return xe;if(!c(a)){if( 139 | //short-circuit everything else 140 | b=Za(a))return b;a=[a]}return Ya(a)}function cb(){return wd(Be)}function db(a){var b,c=a._a;return c&&m(a).overflow===-2&&(b=c[be]<0||c[be]>11?be:c[ce]<1||c[ce]>ea(c[ae],c[be])?ce:c[de]<0||c[de]>24||24===c[de]&&(0!==c[ee]||0!==c[fe]||0!==c[ge])?de:c[ee]<0||c[ee]>59?ee:c[fe]<0||c[fe]>59?fe:c[ge]<0||c[ge]>999?ge:-1,m(a)._overflowDayOfYear&&(bce)&&(b=ce),m(a)._overflowWeeks&&b===-1&&(b=he),m(a)._overflowWeekday&&b===-1&&(b=ie),m(a).overflow=b),a} 141 | // date from iso format 142 | function eb(a){var b,c,d,e,f,g,h=a._i,i=De.exec(h)||Ee.exec(h);if(i){for(m(a).iso=!0,b=0,c=Ge.length;bpa(e)&&(m(a)._overflowDayOfYear=!0),c=ta(e,0,a._dayOfYear),a._a[be]=c.getUTCMonth(),a._a[ce]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b]; 166 | // Zero out whatever was not defaulted, including time 167 | for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b]; 168 | // Check for 24:00:00.000 169 | 24===a._a[de]&&0===a._a[ee]&&0===a._a[fe]&&0===a._a[ge]&&(a._nextDay=!0,a._a[de]=0),a._d=(a._useUTC?ta:sa).apply(null,f), 170 | // Apply timezone offset from input. The actual utcOffset can be changed 171 | // with parseZone. 172 | null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[de]=24)}}function jb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4, 173 | // TODO: We need to take the current isoWeekYear, but that depends on 174 | // how we interpret now (local, utc, fixed offset). So create 175 | // a now version of current config (take local/utc/offset flags, and 176 | // create now). 177 | c=gb(b.GG,a._a[ae],wa(sb(),1,4).year),d=gb(b.W,1),e=gb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=wa(sb(),f,g);c=gb(b.gg,a._a[ae],j.year), 178 | // Default to current week. 179 | d=gb(b.w,j.week),null!=b.d?( 180 | // weekday -- low day numbers are considered next week 181 | e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?( 182 | // local weekday -- counting starts from begining of week 183 | e=b.e+f,(b.e<0||b.e>6)&&(i=!0)): 184 | // default to begining of week 185 | e=f}d<1||d>xa(c,f,g)?m(a)._overflowWeeks=!0:null!=i?m(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[ae]=h.year,a._dayOfYear=h.dayOfYear)} 186 | // date from string and format string 187 | function kb(b){ 188 | // TODO: Move this to another part of the creation flow to prevent circular deps 189 | if(b._f===a.ISO_8601)return void eb(b);b._a=[],m(b).empty=!0; 190 | // This array is used to make a Date, either with `new Date` or `Date.UTC` 191 | var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Y(b._f,b._locale).match(Fd)||[],c=0;c0&&m(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length), 195 | // don't parse if it's not a known token 196 | Id[f]?(d?m(b).empty=!1:m(b).unusedTokens.push(f),da(f,d,b)):b._strict&&!d&&m(b).unusedTokens.push(f); 197 | // add remaining unparsed input length to the string 198 | m(b).charsLeftOver=i-j,h.length>0&&m(b).unusedInput.push(h), 199 | // clear _12h flag if hour is <= 12 200 | b._a[de]<=12&&m(b).bigHour===!0&&b._a[de]>0&&(m(b).bigHour=void 0),m(b).parsedDateParts=b._a.slice(0),m(b).meridiem=b._meridiem, 201 | // handle meridiem 202 | b._a[de]=lb(b._locale,b._a[de],b._meridiem),ib(b),db(b)}function lb(a,b,c){var d; 203 | // Fallback 204 | return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b} 205 | // date from string and array of format strings 206 | function mb(a){var b,c,d,e,f;if(0===a._f.length)return m(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e 249 | // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset 250 | // +0200, so we adjust the time as needed, to be valid. 251 | // 252 | // Keeping the time actually adds/subtracts (one hour) 253 | // from the actual represented time. That is why we call updateOffset 254 | // a second time. In case it wants us to change the offset again 255 | // _changeInProgress == true case, then we have to adjust, because 256 | // there is no such time in the given timezone. 257 | function Db(b,c){var d,e=this._offset||0;if(!this.isValid())return null!=b?this:NaN;if(null!=b){if("string"==typeof b){if(b=Ab(Xd,b),null===b)return this}else Math.abs(b)<16&&(b=60*b);return!this._isUTC&&c&&(d=Cb(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Tb(this,Ob(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?e:Cb(this)}function Eb(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Fb(a){return this.utcOffset(0,a)}function Gb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Cb(this),"m")),this}function Hb(){if(null!=this._tzm)this.utcOffset(this._tzm);else if("string"==typeof this._i){var a=Ab(Wd,this._i);null!=a?this.utcOffset(a):this.utcOffset(0,!0)}return this}function Ib(a){return!!this.isValid()&&(a=a?sb(a).utcOffset():0,(this.utcOffset()-a)%60===0)}function Jb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Kb(){if(!p(this._isDSTShifted))return this._isDSTShifted;var a={};if(q(a,this),a=pb(a),a._a){var b=a._isUTC?k(a._a):sb(a._a);this._isDSTShifted=this.isValid()&&v(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Lb(){return!!this.isValid()&&!this._isUTC}function Mb(){return!!this.isValid()&&this._isUTC}function Nb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ob(a,b){var c,d,e,g=a, 258 | // matching against regexp is expensive, do it on demand 259 | h=null;// checks for null or undefined 260 | return xb(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:f(a)?(g={},b?g[b]=a:g.milliseconds=a):(h=Ne.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:u(h[ce])*c,h:u(h[de])*c,m:u(h[ee])*c,s:u(h[fe])*c,ms:u(yb(1e3*h[ge]))*c}):(h=Oe.exec(a))?(c="-"===h[1]?-1:1,g={y:Pb(h[2],c),M:Pb(h[3],c),w:Pb(h[4],c),d:Pb(h[5],c),h:Pb(h[6],c),m:Pb(h[7],c),s:Pb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=Rb(sb(g.from),sb(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new wb(g),xb(a)&&i(a,"_locale")&&(d._locale=a._locale),d}function Pb(a,b){ 261 | // We'd normally use ~~inp for this, but unfortunately it also 262 | // converts floats to ints. 263 | // inp may be undefined, so careful calling replace on it. 264 | var c=a&&parseFloat(a.replace(",",".")); 265 | // apply sign while we're at it 266 | return(isNaN(c)?0:c)*b}function Qb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Rb(a,b){var c;return a.isValid()&&b.isValid()?(b=Bb(b,a),a.isBefore(b)?c=Qb(a,b):(c=Qb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}} 267 | // TODO: remove 'name' arg after deprecation is removed 268 | function Sb(a,b){return function(c,d){var e,f; 269 | //invert the arguments, but complain about it 270 | return null===d||isNaN(+d)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ob(c,d),Tb(this,e,a),this}}function Tb(b,c,d,e){var f=c._milliseconds,g=yb(c._days),h=yb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&Q(b,"Date",P(b,"Date")+g*d),h&&ja(b,P(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Ub(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Vb(b,c){ 271 | // We want to compare the start of today, vs this. 272 | // Getting start-of-today depends on whether we're local/utc/offset or not. 273 | var d=b||sb(),e=Bb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(z(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,sb(d)))}function Wb(){return new r(this)}function Xb(a,b){var c=s(a)?a:sb(a);return!(!this.isValid()||!c.isValid())&&(b=K(p(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()f&&(b=f),Fc.call(this,a,b,c,d,e))}function Fc(a,b,c,d,e){var f=va(a,b,c,d,e),g=ta(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this} 314 | // MOMENTS 315 | function Gc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)} 316 | // HELPERS 317 | // MOMENTS 318 | function Hc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Ic(a,b){b[ge]=u(1e3*("0."+a))} 319 | // MOMENTS 320 | function Jc(){return this._isUTC?"UTC":""}function Kc(){return this._isUTC?"Coordinated Universal Time":""}function Lc(a){return sb(1e3*a)}function Mc(){return sb.apply(null,arguments).parseZone()}function Nc(a){return a}function Oc(a,b,c,d){var e=bb(),f=k().set(d,b);return e[c](f,a)}function Pc(a,b,c){if(f(a)&&(b=a,a=void 0),a=a||"",null!=b)return Oc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Oc(a,d,c,"month");return e} 321 | // () 322 | // (5) 323 | // (fmt, 5) 324 | // (fmt) 325 | // (true) 326 | // (true, 5) 327 | // (true, fmt, 5) 328 | // (true, fmt) 329 | function Qc(a,b,c,d){"boolean"==typeof a?(f(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,f(b)&&(c=b,b=void 0),b=b||"");var e=bb(),g=a?e._week.dow:0;if(null!=c)return Oc(b,(c+g)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Oc(b,(h+g)%7,d,"day");return i}function Rc(a,b){return Pc(a,b,"months")}function Sc(a,b){return Pc(a,b,"monthsShort")}function Tc(a,b,c){return Qc(a,b,c,"weekdays")}function Uc(a,b,c){return Qc(a,b,c,"weekdaysShort")}function Vc(a,b,c){return Qc(a,b,c,"weekdaysMin")}function Wc(){var a=this._data;return this._milliseconds=Ze(this._milliseconds),this._days=Ze(this._days),this._months=Ze(this._months),a.milliseconds=Ze(a.milliseconds),a.seconds=Ze(a.seconds),a.minutes=Ze(a.minutes),a.hours=Ze(a.hours),a.months=Ze(a.months),a.years=Ze(a.years),this}function Xc(a,b,c,d){var e=Ob(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()} 330 | // supports only 2.0-style add(1, 's') or add(duration) 331 | function Yc(a,b){return Xc(this,a,b,1)} 332 | // supports only 2.0-style subtract(1, 's') or subtract(duration) 333 | function Zc(a,b){return Xc(this,a,b,-1)}function $c(a){return a<0?Math.floor(a):Math.ceil(a)}function _c(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data; 334 | // if we have a mix of positive and negative values, bubble down first 335 | // check: https://github.com/moment/moment/issues/2166 336 | // The following code bubbles up values, see the tests for 337 | // examples of what that means. 338 | // convert days to months 339 | // 12 months -> 1 year 340 | return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*$c(bd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=t(f/1e3),i.seconds=a%60,b=t(a/60),i.minutes=b%60,c=t(b/60),i.hours=c%24,g+=t(c/24),e=t(ad(g)),h+=e,g-=$c(bd(e)),d=t(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function ad(a){ 341 | // 400 years have 146097 days (taking into account leap year rules) 342 | // 400 years have 12 months === 4800 343 | return 4800*a/146097}function bd(a){ 344 | // the reverse of daysToMonths 345 | return 146097*a/4800}function cd(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+ad(b),"month"===a?c:c/12;switch( 346 | // handle milliseconds separately because of floating point math errors (issue #1867) 347 | b=this._days+Math.round(bd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3; 348 | // Math.floor prevents floating point math errors here 349 | case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}} 350 | // TODO: Use this.as('ms')? 351 | function dd(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12)}function ed(a){return function(){return this.as(a)}}function fd(a){return a=K(a),this[a+"s"]()}function gd(a){return function(){return this._data[a]}}function hd(){return t(this.days()/7)} 352 | // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize 353 | function id(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function jd(a,b,c){var d=Ob(a).abs(),e=of(d.as("s")),f=of(d.as("m")),g=of(d.as("h")),h=of(d.as("d")),i=of(d.as("M")),j=of(d.as("y")),k=e0,k[4]=c,id.apply(null,k)} 354 | // This function allows you to set the rounding function for relative time strings 355 | function kd(a){return void 0===a?of:"function"==typeof a&&(of=a,!0)} 356 | // This function allows you to set a threshold for relative time strings 357 | function ld(a,b){return void 0!==pf[a]&&(void 0===b?pf[a]:(pf[a]=b,!0))}function md(a){var b=this.localeData(),c=jd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function nd(){ 358 | // for ISO strings we do not use the normal bubbling rules: 359 | // * milliseconds bubble up until they become hours 360 | // * days do not bubble at all 361 | // * months bubble up until they become years 362 | // This is because there is no context-free conversion between hours and days 363 | // (think of clock changes) 364 | // and also not between days and months (28-31 days per month) 365 | var a,b,c,d=qf(this._milliseconds)/1e3,e=qf(this._days),f=qf(this._months); 366 | // 3600 seconds -> 60 minutes -> 1 hour 367 | a=t(d/60),b=t(a/60),d%=60,a%=60, 368 | // 12 months -> 1 year 369 | c=t(f/12),f%=12; 370 | // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js 371 | var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var od,pd;pd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d68?1900:2e3)}; 396 | // MOMENTS 397 | var pe=O("FullYear",!0); 398 | // FORMATTING 399 | U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"), 400 | // ALIASES 401 | J("week","w"),J("isoWeek","W"), 402 | // PRIORITIES 403 | M("week",5),M("isoWeek",5), 404 | // PARSING 405 | Z("w",Od),Z("ww",Od,Kd),Z("W",Od),Z("WW",Od,Kd),ca(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=u(a)});var qe={dow:0,// Sunday is the first day of the week. 406 | doy:6}; 407 | // FORMATTING 408 | U("d",0,"do","day"),U("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),U("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),U("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"), 409 | // ALIASES 410 | J("day","d"),J("weekday","e"),J("isoWeekday","E"), 411 | // PRIORITY 412 | M("day",11),M("weekday",11),M("isoWeekday",11), 413 | // PARSING 414 | Z("d",Od),Z("e",Od),Z("E",Od),Z("dd",function(a,b){return b.weekdaysMinRegex(a)}),Z("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Z("dddd",function(a,b){return b.weekdaysRegex(a)}),ca(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict); 415 | // if we didn't get a weekday name, mark the date as invalid 416 | null!=e?b.d=e:m(c).invalidWeekday=a}),ca(["d","e","E"],function(a,b,c,d){b[d]=u(a)}); 417 | // LOCALES 418 | var re="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),se="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),te="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ue=Zd,ve=Zd,we=Zd;U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ra),U("k",["kk",2],0,Sa),U("hmm",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ta("a",!0),Ta("A",!1), 419 | // ALIASES 420 | J("hour","h"), 421 | // PRIORITY 422 | M("hour",13),Z("a",Ua),Z("A",Ua),Z("H",Od),Z("h",Od),Z("HH",Od,Kd),Z("hh",Od,Kd),Z("hmm",Pd),Z("hmmss",Qd),Z("Hmm",Pd),Z("Hmmss",Qd),ba(["H","HH"],de),ba(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),ba(["h","hh"],function(a,b,c){b[de]=u(a),m(c).bigHour=!0}),ba("hmm",function(a,b,c){var d=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d)),m(c).bigHour=!0}),ba("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d,2)),b[fe]=u(a.substr(e)),m(c).bigHour=!0}),ba("Hmm",function(a,b,c){var d=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d))}),ba("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[de]=u(a.substr(0,d)),b[ee]=u(a.substr(d,2)),b[fe]=u(a.substr(e))});var xe,ye=/[ap]\.?m?\.?/i,ze=O("Hours",!0),Ae={calendar:xd,longDateFormat:yd,invalidDate:zd,ordinal:Ad,ordinalParse:Bd,relativeTime:Cd,months:le,monthsShort:me,week:qe,weekdays:re,weekdaysMin:te,weekdaysShort:se,meridiemParse:ye},Be={},Ce={},De=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ee=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Fe=/Z|[+-]\d\d(?::?\d\d)?/,Ge=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/], 423 | // YYYYMM is NOT allowed by the standard 424 | ["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],He=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ie=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=x("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}), 425 | // constant that refers to the ISO standard 426 | a.ISO_8601=function(){};var Je=x("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=sb.apply(null,arguments);return this.isValid()&&a.isValid()?athis?this:a:o()}),Le=function(){return Date.now?Date.now():+new Date};zb("Z",":"),zb("ZZ",""), 427 | // PARSING 428 | Z("Z",Xd),Z("ZZ",Xd),ba(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ab(Xd,a)}); 429 | // HELPERS 430 | // timezone chunker 431 | // '+10:00' > ['10', '00'] 432 | // '-1530' > ['-15', '30'] 433 | var Me=/([\+\-]|\d\d)/gi; 434 | // HOOKS 435 | // This function will be called whenever a moment is mutated. 436 | // It is intended to keep the offset in sync with the timezone. 437 | a.updateOffset=function(){}; 438 | // ASP.NET json date format regex 439 | var Ne=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Oe=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Ob.fn=wb.prototype;var Pe=Sb(1,"add"),Qe=Sb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Re=x("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)}); 440 | // FORMATTING 441 | U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),zc("gggg","weekYear"),zc("ggggg","weekYear"),zc("GGGG","isoWeekYear"),zc("GGGGG","isoWeekYear"), 442 | // ALIASES 443 | J("weekYear","gg"),J("isoWeekYear","GG"), 444 | // PRIORITY 445 | M("weekYear",1),M("isoWeekYear",1), 446 | // PARSING 447 | Z("G",Vd),Z("g",Vd),Z("GG",Od,Kd),Z("gg",Od,Kd),Z("GGGG",Sd,Md),Z("gggg",Sd,Md),Z("GGGGG",Td,Nd),Z("ggggg",Td,Nd),ca(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=u(a)}),ca(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}), 448 | // FORMATTING 449 | U("Q",0,"Qo","quarter"), 450 | // ALIASES 451 | J("quarter","Q"), 452 | // PRIORITY 453 | M("quarter",7), 454 | // PARSING 455 | Z("Q",Jd),ba("Q",function(a,b){b[be]=3*(u(a)-1)}), 456 | // FORMATTING 457 | U("D",["DD",2],"Do","date"), 458 | // ALIASES 459 | J("date","D"), 460 | // PRIOROITY 461 | M("date",9), 462 | // PARSING 463 | Z("D",Od),Z("DD",Od,Kd),Z("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),ba(["D","DD"],ce),ba("Do",function(a,b){b[ce]=u(a.match(Od)[0],10)}); 464 | // MOMENTS 465 | var Se=O("Date",!0); 466 | // FORMATTING 467 | U("DDD",["DDDD",3],"DDDo","dayOfYear"), 468 | // ALIASES 469 | J("dayOfYear","DDD"), 470 | // PRIORITY 471 | M("dayOfYear",4), 472 | // PARSING 473 | Z("DDD",Rd),Z("DDDD",Ld),ba(["DDD","DDDD"],function(a,b,c){c._dayOfYear=u(a)}), 474 | // FORMATTING 475 | U("m",["mm",2],0,"minute"), 476 | // ALIASES 477 | J("minute","m"), 478 | // PRIORITY 479 | M("minute",14), 480 | // PARSING 481 | Z("m",Od),Z("mm",Od,Kd),ba(["m","mm"],ee); 482 | // MOMENTS 483 | var Te=O("Minutes",!1); 484 | // FORMATTING 485 | U("s",["ss",2],0,"second"), 486 | // ALIASES 487 | J("second","s"), 488 | // PRIORITY 489 | M("second",15), 490 | // PARSING 491 | Z("s",Od),Z("ss",Od,Kd),ba(["s","ss"],fe); 492 | // MOMENTS 493 | var Ue=O("Seconds",!1); 494 | // FORMATTING 495 | U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}), 496 | // ALIASES 497 | J("millisecond","ms"), 498 | // PRIORITY 499 | M("millisecond",16), 500 | // PARSING 501 | Z("S",Rd,Jd),Z("SS",Rd,Kd),Z("SSS",Rd,Ld);var Ve;for(Ve="SSSS";Ve.length<=9;Ve+="S")Z(Ve,Ud);for(Ve="S";Ve.length<=9;Ve+="S")ba(Ve,Ic); 502 | // MOMENTS 503 | var We=O("Milliseconds",!1); 504 | // FORMATTING 505 | U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var Xe=r.prototype;Xe.add=Pe,Xe.calendar=Vb,Xe.clone=Wb,Xe.diff=bc,Xe.endOf=oc,Xe.format=gc,Xe.from=hc,Xe.fromNow=ic,Xe.to=jc,Xe.toNow=kc,Xe.get=R,Xe.invalidAt=xc,Xe.isAfter=Xb,Xe.isBefore=Yb,Xe.isBetween=Zb,Xe.isSame=$b,Xe.isSameOrAfter=_b,Xe.isSameOrBefore=ac,Xe.isValid=vc,Xe.lang=Re,Xe.locale=lc,Xe.localeData=mc,Xe.max=Ke,Xe.min=Je,Xe.parsingFlags=wc,Xe.set=S,Xe.startOf=nc,Xe.subtract=Qe,Xe.toArray=sc,Xe.toObject=tc,Xe.toDate=rc,Xe.toISOString=ec,Xe.inspect=fc,Xe.toJSON=uc,Xe.toString=dc,Xe.unix=qc,Xe.valueOf=pc,Xe.creationData=yc, 506 | // Year 507 | Xe.year=pe,Xe.isLeapYear=ra, 508 | // Week Year 509 | Xe.weekYear=Ac,Xe.isoWeekYear=Bc, 510 | // Quarter 511 | Xe.quarter=Xe.quarters=Gc, 512 | // Month 513 | Xe.month=ka,Xe.daysInMonth=la, 514 | // Week 515 | Xe.week=Xe.weeks=Ba,Xe.isoWeek=Xe.isoWeeks=Ca,Xe.weeksInYear=Dc,Xe.isoWeeksInYear=Cc, 516 | // Day 517 | Xe.date=Se,Xe.day=Xe.days=Ka,Xe.weekday=La,Xe.isoWeekday=Ma,Xe.dayOfYear=Hc, 518 | // Hour 519 | Xe.hour=Xe.hours=ze, 520 | // Minute 521 | Xe.minute=Xe.minutes=Te, 522 | // Second 523 | Xe.second=Xe.seconds=Ue, 524 | // Millisecond 525 | Xe.millisecond=Xe.milliseconds=We, 526 | // Offset 527 | Xe.utcOffset=Db,Xe.utc=Fb,Xe.local=Gb,Xe.parseZone=Hb,Xe.hasAlignedHourOffset=Ib,Xe.isDST=Jb,Xe.isLocal=Lb,Xe.isUtcOffset=Mb,Xe.isUtc=Nb,Xe.isUTC=Nb, 528 | // Timezone 529 | Xe.zoneAbbr=Jc,Xe.zoneName=Kc, 530 | // Deprecations 531 | Xe.dates=x("dates accessor is deprecated. Use date instead.",Se),Xe.months=x("months accessor is deprecated. Use month instead",ka),Xe.years=x("years accessor is deprecated. Use year instead",pe),Xe.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Eb),Xe.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Kb);var Ye=C.prototype;Ye.calendar=D,Ye.longDateFormat=E,Ye.invalidDate=F,Ye.ordinal=G,Ye.preparse=Nc,Ye.postformat=Nc,Ye.relativeTime=H,Ye.pastFuture=I,Ye.set=A, 532 | // Month 533 | Ye.months=fa,Ye.monthsShort=ga,Ye.monthsParse=ia,Ye.monthsRegex=na,Ye.monthsShortRegex=ma, 534 | // Week 535 | Ye.week=ya,Ye.firstDayOfYear=Aa,Ye.firstDayOfWeek=za, 536 | // Day of Week 537 | Ye.weekdays=Fa,Ye.weekdaysMin=Ha,Ye.weekdaysShort=Ga,Ye.weekdaysParse=Ja,Ye.weekdaysRegex=Na,Ye.weekdaysShortRegex=Oa,Ye.weekdaysMinRegex=Pa, 538 | // Hours 539 | Ye.isPM=Va,Ye.meridiem=Wa,$a("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===u(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}), 540 | // Side effect imports 541 | a.lang=x("moment.lang is deprecated. Use moment.locale instead.",$a),a.langData=x("moment.langData is deprecated. Use moment.localeData instead.",bb);var Ze=Math.abs,$e=ed("ms"),_e=ed("s"),af=ed("m"),bf=ed("h"),cf=ed("d"),df=ed("w"),ef=ed("M"),ff=ed("y"),gf=gd("milliseconds"),hf=gd("seconds"),jf=gd("minutes"),kf=gd("hours"),lf=gd("days"),mf=gd("months"),nf=gd("years"),of=Math.round,pf={s:45,// seconds to minute 542 | m:45,// minutes to hour 543 | h:22,// hours to day 544 | d:26,// days to month 545 | M:11},qf=Math.abs,rf=wb.prototype; 546 | // Deprecations 547 | // Side effect imports 548 | // FORMATTING 549 | // PARSING 550 | // Side effect imports 551 | return rf.abs=Wc,rf.add=Yc,rf.subtract=Zc,rf.as=cd,rf.asMilliseconds=$e,rf.asSeconds=_e,rf.asMinutes=af,rf.asHours=bf,rf.asDays=cf,rf.asWeeks=df,rf.asMonths=ef,rf.asYears=ff,rf.valueOf=dd,rf._bubble=_c,rf.get=fd,rf.milliseconds=gf,rf.seconds=hf,rf.minutes=jf,rf.hours=kf,rf.days=lf,rf.weeks=hd,rf.months=mf,rf.years=nf,rf.humanize=md,rf.toISOString=nd,rf.toString=nd,rf.toJSON=nd,rf.locale=lc,rf.localeData=mc,rf.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",nd),rf.lang=Re,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",Vd),Z("X",Yd),ba("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),ba("x",function(a,b,c){c._d=new Date(u(a))}),a.version="2.17.1",b(sb),a.fn=Xe,a.min=ub,a.max=vb,a.now=Le,a.utc=k,a.unix=Lc,a.months=Rc,a.isDate=g,a.locale=$a,a.invalid=o,a.duration=Ob,a.isMoment=s,a.weekdays=Tc,a.parseZone=Mc,a.localeData=bb,a.isDuration=xb,a.monthsShort=Sc,a.weekdaysMin=Vc,a.defineLocale=_a,a.updateLocale=ab,a.locales=cb,a.weekdaysShort=Uc,a.normalizeUnits=K,a.relativeTimeRounding=kd,a.relativeTimeThreshold=ld,a.calendarFormat=Ub,a.prototype=Xe,a}); -------------------------------------------------------------------------------- /js/realms.js: -------------------------------------------------------------------------------- 1 | const REALMS = { 2 | "eu": ["Aegwynn", "Aerie Peak", "Agamaggan", "Aggra (Português)", "Aggramar", "Ahn'Qiraj", "Al'Akir", "Alexstrasza", "Alleria", 3 | "Alonsus", "Aman'Thul", "Ambossar", "Anachronos", "Anetheron", "Antonidas", "Anub'arak", "Arak-arahm", "Arathi", 4 | "Arathor", "Archimonde", "Area 52", "Argent Dawn", "Arthas", "Arygos", "Ashenvale", "Aszune", "Auchindoun", 5 | "Azjol-Nerub", "Azshara", "Azuregos", "Azuremyst", "Baelgun", "Balnazzar", "Benedictus", "Beta Leveling Realm 01", 6 | "Beta Leveling Realm 03", "Beta Max Level PvP", "Blackhand", "Blackmoore", "Blackrock", "Blackscar", "Bladefist", 7 | "Blade's Edge", "Bloodfeather", "Bloodhoof", "Bloodscalp", "Blutkessel", "Booty Bay", "Borean Tundra", 8 | "Boulderfist", "Brill", "Bronze Dragonflight", "Bronzebeard", "Burning Blade", "Burning Legion", "Burning Steppes", 9 | "Chamber of Aspects", "Chants éternels", "Cho'gall", "Chromaggus", "Colinas Pardas", "Confréri du Thorium", 10 | "Conseil des Ombres", "Crushridge", "C'Thun", "Culte de la Rive noire", "Daggerspine", "Dalaran", "Dalvengyr", 11 | "Darkmoon Faire", "Darksorrow", "Darkspear", "Das Konsortium", "Das Syndikat", "Deathguard", "Deathweaver", 12 | "Deathwing", "Deepholm", "Defias Brotherhood", "Dentarg", "Der abyssische Rat", "Der Mithrilorden", 13 | "Der Rat von Dalaran", "Destromath", "Dethecus", "Die Aldor", "Die Arguswacht", "Die ewige Wacht", "Die Nachtwache", 14 | "Die Silberne Hand", "Die Todeskrallen", "Doomhammer", "Draenor", "Dragonblight", "Dragonmaw", "Drak'thul", 15 | "Drek'Thar", "Dun Modr", "Dun Morogh", "Dunemaul", "Durotan", "Earthen Ring", "Echsenkessel", "Eitrigg", 16 | "Eldre'Thalas", "Elune", "Emerald Dream", "Emeriss", "Eonar", "Eredar", "Eversong", "Executus", "Exodar", 17 | "Festung der Stürme", "Fordragon", "Forscherliga", "Frostmane", "Frostmourne", "Frostwhisper", "Frostwolf", 18 | "Galakrond", "Garona", "Garrosh", "Genjuros", "Ghostlands", "Gilneas", "Goldrinn", "Gordunni", "Gorgonnash", 19 | "Greymane", "Grim Batol", "Grom", "Gul'dan", "Hakkar", "Haomarush", "Hellfire", "Hellscream", "Howling Fjord", 20 | "Hyjal", "Illidan", "Jaedenar", "Kael'thas", "Kalaran", "Karazhan", "Kargath", "Kazzak", "Kel'Thuzad", 21 | "Khadgar", "Khaz Modan", "Khaz'goroth", "Kil'jaeden", "Kilrogg", "Kirin Tor", "Kor'gall", "Krag'jin", 22 | "Krasus", "Kul Tiras", "Kult der Verdammten", "La Croisade écarlate", "Laughing Skull", "Les Clairvoyants", 23 | "Les Sentinelles", "Lich King", "Lightbringer", "Lightning's Blade", "Lordaeron", "Los Errantes", "Lothar", 24 | "Lycanthoth", "Madmortem", "Magtheridon", "Malfurion", "Mal'Ganis", "Malorne", "Malygos", "Mannoroth", 25 | "Marécage de Zangar", "Mazrigos", "Medivh", "Minahonda", "Moonglade", "Mug'thol", "Nagrand", "Naralex", 26 | "Nathrezim", "Naxxramas", "Nazjatar", "Nefarian", "Nemesis", "Neptulon", "Nera'thor", "Ner'zhul", "Nethersturm", 27 | "Nordrassil", "Norgannon", "Nozdormu", "Onyxia", "Outland", "Perenolde", "Pozzo dell'Eternità", "Proudmoore", 28 | "Quel'Thalas", "Ragnaros", "Rajaxx", "Rashgarroth", "Ravencrest", "Ravenholdt", "Razuvious", "Rexxar", 29 | "Runetotem", "Sanguino", "Sargeras", "Saurfang", "Scarshield Legion", "Sen'jin", "Shadowsong", "Shattered Halls", 30 | "Shattered Hand", "Shattrath", "Shen'dralar", "Silvermoon", "Sinstralis", "Skullcrusher", "Soulflayer", 31 | "Spinebreaker", "Sporeggar", "Steamwheedle Cartel", "Stormrage", "Stormreaver", "Stormscale", "Sunstrider", 32 | "Suramar", "Sylvanas", "Taerar", "Talnivarr", "Tarren Mill", "Teldrassil", "Temple noir", "Terenas", "Terokkar", 33 | "Terrordar", "The Maelstrom", "The Sha'tar", "The Venture Co", "Theradras", "Thermaplugg", "Thrall", 34 | "Throk'Feroth", "Thunderhorn", "Tichondrius", "Tirion", "Todeswache", "Trollbane", "Turalyon", "Twilight's Hammer", 35 | "Twisting Nether", "Tyrande", "Uldaman", "Ulduar", "Uldum", "Un'Goro", "Varimathras", "Vashj", "Vek'lor", 36 | "Vek'nilash", "Vol'jin", "Wildhammer", "Wrathbringer", "Xavius", "Ysera", "Ysondre", "Zenedar", 37 | "Zirkel des Cenarius", "Zul'jin", "Zuluhed"], 38 | "us": ["Aegwynn", "Aerie Peak", "Agamaggan", "Aggramar", "Akama", "Alexstrasza", "Alleria", "Altar of Storms", "Alterac Mountains", 39 | "Aman'Thul", "Anasterian", "Andorhal", "Anetheron", "Antonidas", "Anub'arak", "Anvilmar", "Arathor", "Archimonde", "Area 52", 40 | "Argent Dawn", "Arthas", "Arygos", "Auchindoun", "Azgalor", "Azjol-Nerub", "Azralon", "Azshara", "Azuremyst", "Baelgun", 41 | "Balnazzar", "Barthilas", "Benedictus", "Beta Leveling Realm 01", "Beta Leveling Realm 03", "Beta Max Level PvP", 42 | "Black Dragonflight", "Blackhand", "Blackrock", "Blackwater Raiders", "Blackwing Lair", "Bladefist", "Blade's Edge", 43 | "Bleeding Hollow", "Blood Furnace", "Bloodhoof", "Bloodscalp", "Bonechewer", "Borean Tundra", "Boulderfist", 44 | "Bronzebeard", "Broxigar", "Burning Blade", "Burning Legion", "Caelestrasz", "Cairne", "Cenarion Circle", "Cenarius", 45 | "Cho'gall", "Chromaggus", "Coilfang", "Crushridge", "Daggerspine", "Dalaran", "Dalvengyr", "Dark Iron", "Darkspear", 46 | "Darrowmere", "Dath'Remar", "Dawnbringer", "Deathwing", "Demon Soul", "Dentarg", "Destromath", "Dethecus", "Detheroc", 47 | "Doomhammer", "Draenor", "Dragonblight", "Dragonmaw", "Draka", "Drakkari", "Drak'Tharon", "Drak'thul", "Dreadmaul", 48 | "Drenden", "Dunemaul", "Durotan", "Duskwood", "Earthen Ring", "Echo Isles", "Eitrigg", "Eldre'Thalas", "Elune", 49 | "Emerald Dream", "Eonar", "Eredar", "Executus", "Exodar", "Farstriders", "Feathermoon", "Fenris", "Firetree", 50 | "Fizzcrank", "Frostmane", "Frostmourne", "Frostwolf", "Galakrond", "Gallywix", "Garithos", "Garona", "Garrosh", 51 | "Ghostlands", "Gilneas", "Gnomeregan", "Goldrinn", "Gorefiend", "Gorgonnash", "Greymane", "Grizzly Hills", "Gul'dan", 52 | "Gundrak", "Gurubashi", "Hakkar", "Haomarush", "Hellscream", "Hydraxis", "Hyjal", "Icecrown", "Illidan", "Jaedenar", 53 | "Jubei'Thos", "Kael'thas", "Kalaran", "Kalecgos", "Kargath", "Kel'Thuzad", "Khadgar", "Khaz Modan", "Khaz'goroth", 54 | "Kil'jaeden", "Kilrogg", "Kirin Tor", "Korgath", "Korialstrasz", "Kul Tiras", "Laughing Skull", "Lethon", "Lightbringer", 55 | "Lightninghoof", "Lightning's Blade", "Llane", "Lothar", "Lycanthoth", "Madoran", "Maelstrom", "Magtheridon", "Maiev", 56 | "Malfurion", "Mal'Ganis", "Malorne", "Malygos", "Mannoroth", "Medivh", "Misha", "Mok'Nathal", "Moon Guard", "Moonrunner", 57 | "Mug'thol", "Muradin", "Nagrand", "Nathrezim", "Nazgrel", "Nazjatar", "Nemesis", "Ner'zhul", "Nesingwary", 58 | "Nordrassil", "Norgannon", "Onyxia", "Perenolde", "Proudmoore", "Quel'dorei", "Quel'Thalas", "Ragnaros", "Ravencrest", 59 | "Ravenholdt", "Rexxar", "Rivendare", "Runetotem", "Sargeras", "Saurfang", "Scarlet Crusade", "Scilla", "Sen'jin", "Sentinels", 60 | "Shadow Council", "Shadowmoon", "Shadowsong", "Shandris", "Shattered Halls", "Shattered Hand", "Shu'halo", "Silver Hand", 61 | "Silvermoon", "Sisters of Elune", "Skullcrusher", "Skywall", "Smolderthorn", "Spinebreaker", "Spirestone", "Staghelm", 62 | "Steamwheedle Cartel", "Stonemaul", "Stormrage", "Stormreaver", "Stormscale", "Suramar", "Tanaris", "Terenas", "Terokkar", 63 | "Thaurissan", "The Forgotten Coast", "The Scryers", "The Underbog", "The Venture Co", "Thorium Brotherhood", "Thrall", 64 | "Thunderhorn", "Thunderlord", "Tichondrius", "Tol Barad", "Tortheldrin", "Trollbane", "Turalyon", "Twisting Nether", 65 | "Uldaman", "Uldum", "Undermine", "Ursin", "Uther", "Vashj", "Vek'nilash", "Velen", "Warsong", "Whisperwind", 66 | "Wildhammer", "Windrunner", "Winterhoof", "Wyrmrest Accord", "Ysera", "Ysondre", "Zangarmarsh", "Zul'jin", "Zuluhed"], 67 | "kr": ["렉사르", "불타는 군단", "와일드해머", "가로나", "달라란", "데스윙", "라그나로스", "말퓨리온", "세나리우스", "알렉스트라자", "카르가스", 68 | "하이잘", "헬스크림", "스톰레이지", "윈드러너", "굴단", "노르간논", "듀로탄", "아즈샤라", "에이그윈", "엘룬", "이오나", "줄진"], 69 | "tw": ["狼狂索斯", "世界之樹", "暗影之月", "天空之牆", "巴納札爾", "巨龍之喉", "狂熱之刃", "冬握湖", "雷鱗", "凜風峽灣", "米奈希爾", 70 | "死亡之翼", "水晶之刺", "艾奧那斯", "遠祖灘頭", "日落沼澤", "戰歌", "提克迪奧斯", "地獄吼", "尖石", "風暴群山", "火焰之樹", 71 | "冰霜之刺", "冰風崗哨", "聖光之願", "亞雷戈斯", "語風", "奧妮克希亞", "暴風祭壇", "眾星之子", "科爾蘇加德", "狂心", "鬼霧峰", 72 | "奎爾達納斯", "奈辛瓦里", "屠魔山谷", "諾姆瑞根", "憤怒使者", "撒爾薩里安", "阿薩斯", "夜空之歌", "惡魔之魂", "銀翼要塞", 73 | "寒冰皇冠", "血之谷", "黑龍軍團"] 74 | }; 75 | -------------------------------------------------------------------------------- /js/typeahead.js: -------------------------------------------------------------------------------- 1 | (function(root,factory){"use strict";if(typeof module!=="undefined"&&module.exports){module.exports=factory(require("jquery"))}else if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else{factory(root.jQuery)}})(this,function($){"use strict";var Typeahead=function(element,options){this.$element=$(element);this.options=$.extend({},$.fn.typeahead.defaults,options);this.matcher=this.options.matcher||this.matcher;this.sorter=this.options.sorter||this.sorter;this.select=this.options.select||this.select;this.autoSelect=typeof this.options.autoSelect=="boolean"?this.options.autoSelect:true;this.highlighter=this.options.highlighter||this.highlighter;this.render=this.options.render||this.render;this.updater=this.options.updater||this.updater;this.displayText=this.options.displayText||this.displayText;this.source=this.options.source;this.delay=this.options.delay;this.$menu=$(this.options.menu);this.$appendTo=this.options.appendTo?$(this.options.appendTo):null;this.fitToElement=typeof this.options.fitToElement=="boolean"?this.options.fitToElement:false;this.shown=false;this.listen();this.showHintOnFocus=typeof this.options.showHintOnFocus=="boolean"||this.options.showHintOnFocus==="all"?this.options.showHintOnFocus:false;this.afterSelect=this.options.afterSelect;this.addItem=false;this.value=this.$element.val()||this.$element.text()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").data("value");this.$element.data("active",val);if(this.autoSelect||val){var newVal=this.updater(val);if(!newVal){newVal=""}this.$element.val(this.displayText(newVal)||newVal).text(this.displayText(newVal)||newVal).change();this.afterSelect(newVal)}return this.hide()},updater:function(item){return item},setSource:function(source){this.source=source},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});var scrollHeight=typeof this.options.scrollHeight=="function"?this.options.scrollHeight.call():this.options.scrollHeight;var element;if(this.shown){element=this.$menu}else if(this.$appendTo){element=this.$menu.appendTo(this.$appendTo);this.hasSameParent=this.$appendTo.is(this.$element.parent())}else{element=this.$menu.insertAfter(this.$element);this.hasSameParent=true}if(!this.hasSameParent){element.css("position","fixed");var offset=this.$element.offset();pos.top=offset.top;pos.left=offset.left}var dropup=$(element).parent().hasClass("dropup");var newTop=dropup?"auto":pos.top+pos.height+scrollHeight;var right=$(element).hasClass("dropdown-menu-right");var newLeft=right?"auto":pos.left;element.css({top:newTop,left:newLeft}).show();if(this.options.fitToElement===true){element.css("width",this.$element.outerWidth()+"px")}this.shown=true;return this},hide:function(){this.$menu.hide();this.shown=false;return this},lookup:function(query){var items;if(typeof query!="undefined"&&query!==null){this.query=query}else{this.query=this.$element.val()||this.$element.text()||""}if(this.query.length0){this.$element.data("active",items[0])}else{this.$element.data("active",null)}if(this.options.addItem){items.push(this.options.addItem)}if(this.options.items=="all"){return this.render(items).show()}else{return this.render(items.slice(0,this.options.items)).show()}},matcher:function(item){var it=this.displayText(item);return~it.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){var beginswith=[];var caseSensitive=[];var caseInsensitive=[];var item;while(item=items.shift()){var it=this.displayText(item);if(!it.toLowerCase().indexOf(this.query.toLowerCase()))beginswith.push(item);else if(~it.indexOf(this.query))caseSensitive.push(item);else caseInsensitive.push(item)}return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var html=$("
");var query=this.query;var i=item.toLowerCase().indexOf(query.toLowerCase());var len=query.length;var leftPart;var middlePart;var rightPart;var strong;if(len===0){return html.text(item).html()}while(i>-1){leftPart=item.substr(0,i);middlePart=item.substr(i,len);rightPart=item.substr(i+len);strong=$("").text(middlePart);html.append(document.createTextNode(leftPart)).append(strong);item=rightPart;i=item.toLowerCase().indexOf(query.toLowerCase())}return html.append(document.createTextNode(item)).html()},render:function(items){var that=this;var self=this;var activeFound=false;var data=[];var _category=that.options.separator;$.each(items,function(key,value){if(key>0&&value[_category]!==items[key-1][_category]){data.push({__type:"divider"})}if(value[_category]&&(key===0||value[_category]!==items[key-1][_category])){data.push({__type:"category",name:value[_category]})}data.push(value)});items=$(data).map(function(i,item){if((item.__type||false)=="category"){return $(that.options.headerHtml).text(item.name)[0]}if((item.__type||false)=="divider"){return $(that.options.headerDivider)[0]}var text=self.displayText(item);i=$(that.options.item).data("value",item);i.find("a").html(that.highlighter(text,item));if(text==self.$element.val()){i.addClass("active");self.$element.data("active",item);activeFound=true}return i[0]});if(this.autoSelect&&!activeFound){items.filter(":not(.dropdown-header)").first().addClass("active");this.$element.data("active",items.first().data("value"))}this.$menu.html(items);return this},displayText:function(item){return typeof item!=="undefined"&&typeof item.name!="undefined"&&item.name||item},next:function(event){var active=this.$menu.find(".active").removeClass("active");var next=active.next();if(!next.length){next=$(this.$menu.find("li")[0])}next.addClass("active")},prev:function(event){var active=this.$menu.find(".active").removeClass("active");var prev=active.prev();if(!prev.length){prev=this.$menu.find("li").last()}prev.addClass("active")},listen:function(){this.$element.on("focus",$.proxy(this.focus,this)).on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("input",$.proxy(this.input,this)).on("keyup",$.proxy(this.keyup,this));if(this.eventSupported("keydown")){this.$element.on("keydown",$.proxy(this.keydown,this))}this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this)).on("mouseleave","li",$.proxy(this.mouseleave,this)).on("mousedown",$.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null);this.$element.data("active",null);this.$element.off("focus").off("blur").off("keypress").off("input").off("keyup");if(this.eventSupported("keydown")){this.$element.off("keydown")}this.$menu.remove();this.destroyed=true},eventSupported:function(eventName){var isSupported=eventName in this.$element;if(!isSupported){this.$element.setAttribute(eventName,"return;");isSupported=typeof this.$element[eventName]==="function"}return isSupported},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:if(e.shiftKey)return;e.preventDefault();this.prev();break;case 40:if(e.shiftKey)return;e.preventDefault();this.next();break}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]);if(!this.shown&&e.keyCode==40){this.lookup()}else{this.move(e)}},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},input:function(e){var currentValue=this.$element.val()||this.$element.text();if(this.value!==currentValue){this.value=currentValue;this.lookup()}},keyup:function(e){if(this.destroyed){return}switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break}},focus:function(e){if(!this.focused){this.focused=true;if(this.options.showHintOnFocus&&this.skipShowHintOnFocus!==true){if(this.options.showHintOnFocus==="all"){this.lookup("")}else{this.lookup()}}}if(this.skipShowHintOnFocus){this.skipShowHintOnFocus=false}},blur:function(e){if(!this.mousedover&&!this.mouseddown&&this.shown){this.hide();this.focused=false}else if(this.mouseddown){this.skipShowHintOnFocus=true;this.$element.focus();this.mouseddown=false}},click:function(e){e.preventDefault();this.skipShowHintOnFocus=true;this.select();this.$element.focus();this.hide()},mouseenter:function(e){this.mousedover=true;this.$menu.find(".active").removeClass("active");$(e.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=false;if(!this.focused&&this.shown)this.hide()},mousedown:function(e){this.mouseddown=true;this.$menu.one("mouseup",function(e){this.mouseddown=false}.bind(this))}};var old=$.fn.typeahead;$.fn.typeahead=function(option){var arg=arguments;if(typeof option=="string"&&option=="getActive"){return this.data("active")}return this.each(function(){var $this=$(this);var data=$this.data("typeahead");var options=typeof option=="object"&&option;if(!data)$this.data("typeahead",data=new Typeahead(this,options));if(typeof option=="string"&&data[option]){if(arg.length>1){data[option].apply(data,Array.prototype.slice.call(arg,1))}else{data[option]()}}})};$.fn.typeahead.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1,scrollHeight:0,autoSelect:true,afterSelect:$.noop,addItem:false,delay:0,separator:"category",headerHtml:'',headerDivider:''};$.fn.typeahead.Constructor=Typeahead;$.fn.typeahead.noConflict=function(){$.fn.typeahead=old;return this};$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);if($this.data("typeahead"))return;$this.typeahead($this.data())})}); 2 | -------------------------------------------------------------------------------- /tags/advanced-form.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 | 9 | 10 | 11 |
    12 |
    13 |
    14 | 15 |
    16 |
    17 | 18 |
    19 |
    20 |
    21 | Simple 22 | 23 | 24 |
    25 |
    26 | 27 | 82 |
    83 | -------------------------------------------------------------------------------- /tags/character-selection.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 |

    Killpoints

    5 |

    Want to know when you are due for your next legendary? How does this work?

    6 | 7 |
    8 | 9 | 10 |
    11 |
    12 |
    13 | 14 | 52 |
    53 | -------------------------------------------------------------------------------- /tags/error.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 | Oh snap! { opts.message } 4 |
    5 |
    6 | -------------------------------------------------------------------------------- /tags/killpoints.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 | 5 | 6 |

    { opts.name } has { opts.killpoints} killpoints.

    7 | 8 |

    { estimate(opts.killpoints) }

    9 | 10 |
    11 |
    12 |
    13 | Progress towards the next legendary: { Math.round(progress(killpoints)) }% 14 |
    15 |
    16 | 17 | 18 | 19 | 20 |
    21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
    Number of legendariesKillpoints
    1 legendary 0} class={ table-success: (breakpoint <= killpoints) }> { legendary + 1} legendaries{ breakpoint }
    37 |
    38 |
    39 | 77 |
    78 | -------------------------------------------------------------------------------- /tags/loading.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 |
    4 |

    5 |

    6 |

      7 |
    • Not loading? Don't use Internet Explorer!
    • 8 |
    • Disable blocking addons like Privacy Badger.
    • 9 |
    10 |

    11 |
    12 |
    13 |
    14 | -------------------------------------------------------------------------------- /tags/simple-form.tag: -------------------------------------------------------------------------------- 1 | 2 |
    3 | 8 | 9 | 10 | 11 | 12 |
    13 | 14 | Advanced 15 | 16 | 51 |
    52 | --------------------------------------------------------------------------------