mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-06-28 15:27:43 +00:00
6 lines
No EOL
170 KiB
JavaScript
6 lines
No EOL
170 KiB
JavaScript
!function(e){!function t(e,s,o){function n(a,r){if(!s[a]){if(!e[a]){var d="function"==typeof require&&require;if(!r&&d)return d(a,!0);if(i)return i(a,!0);throw new Error("Cannot find module '"+a+"'")}var u=s[a]={exports:{}};e[a][0].call(u.exports,function(t){var s=e[a][1][t];return n(s?s:t)},u,u.exports,t,e,s,o)}return s[a].exports}for(var i="function"==typeof require&&require,a=0;a<o.length;a++)n(o[a]);return n}({1:[function(t){var s=e.FrankerFaceZ,o=t("./constants"),n=t("./utils");s.settings_info.show_badges={type:"boolean",value:!0,category:"Chat",name:"Additional Badges",help:"Show additional badges for bots, FrankerFaceZ donors, and other special users."},s.settings_info.transparent_badges={type:"boolean",value:!1,category:"Chat",no_bttv:!0,name:"Transparent Badges",help:"Make chat badges transparent for a nice, clean look. On light chat, non-subscriber badges are inverted to remain visible.",on_update:function(e){this.has_bttv||document.body.classList.toggle("ffz-transparent-badges",e)}},s.prototype.setup_badges=function(){this.has_bttv||document.body.classList.toggle("ffz-transparent-badges",this.settings.transparent_badges),this.log("Preparing badge system."),this.badges={},this.log("Creating badge style element.");var e=this._badge_style=document.createElement("style");e.id="ffz-badge-css",document.head.appendChild(e),this.log("Adding legacy donor badges."),this._legacy_add_donors()},s.ws_commands.reload_badges=function(){this._legacy_load_bots(),this._legacy_load_donors()},s.ws_commands.set_badge=function(e){var t=e[0],s=e[1],o=e[2],n=this.users[t]=this.users[t]||{},i=n.badges=n.badges||{};void 0===o||null===o?delete i[s]:i[s]=o};var i=function(e){var t=".badges .ffz-badge-"+e.id+" { background-color: "+e.color+'; background-image: url("'+e.image+'"); '+(e.extra_css||"")+"}";return e.transparent_image&&(t+=".ffz-transparent-badges .badges .ffz-badge-"+e.id+' { background-image: url("'+e.transparent_image+'"); }'),t};s.prototype.bttv_badges=function(e){if(this.settings.show_badges){var t=e.sender,s=this.users[t],o=[],n=-1,i=BetterTTV.settings.get("alphaTags");if(s&&s.badges){e.badges||(e.badges=[]);for(var a=0;a<e.badges.length;a++){var r=e.badges[a];if("subscriber"==r.type||"turbo"==r.type){n=a;break}}for(var d in s.badges)if(s.badges.hasOwnProperty(d)){var r=s.badges[d],u=this.badges[r.id]||{},c=r.title||u.title,l="";if(void 0!==u.visible){var h=u.visible;if("function"==typeof h&&(h=h.bind(this)(null,t)),!h)continue}if(u.replaces){for(var f=!1,a=0;a<e.badges.length;a++){var _=e.badges[a];if(_.type==u.replaces){_.type="ffz-badge-replacement "+_.type,_.description+=", "+(r.title||u.title)+'" style="background-image: url("'+(r.image||u.image)+"")",f=!0;break}}if(f)continue}r.image&&(l+="background-image: url(""+r.image+""); "),r.color&&!i&&(l+="background-color: "+r.color+"; "),r.extra_css&&(l+=r.extra_css),l&&(c+='" style="'+l),o.push([(-1==n?1:-1)*d,{type:"ffz-badge-"+r.id+(i?" alpha":""),name:"",description:c}])}if(o.sort(function(e,t){return e[0]-t[0]}),-1==n)for(;o.length;)e.badges.push(o.shift()[1]);else for(;o.length;)e.badges.insertAt(n,o.shift()[1])}}},s.prototype.render_badge=function(e){if(this.settings.show_badges){var t=e.get("msgObject.from"),s=App.__container__.lookup("controller:chat").get("currentRoom.id"),o=e.$(".badges"),n=this.users[t];if(n&&n.badges){if(!o.length){var i=document.createElement("span"),a=e.$(".from");if(i.className="badges float-left",!a)return;a.before(i),o=$(i)}var r=o.find(".badge").filter(function(){var e=this.title.toLowerCase();return"subscriber"==e||"turbo"==e}).first(),d=[],u=!!r.length;for(var c in n.badges)if(n.badges.hasOwnProperty(c)){var l=n.badges[c],h=this.badges[l.id]||{};if(void 0!==h.visible){var f=h.visible;if("function"==typeof f&&(f=f.bind(this)(s,t)),!f)continue}if(h.replaces){var _=o[0].querySelector(".badge."+h.replaces);if(_){_.style.backgroundImage='url("'+(l.image||h.image)+'")',_.classList.add("ffz-badge-replacement"),_.title+=", "+(l.title||h.title);continue}}var _=document.createElement("div");_.className="badge float-left tooltip ffz-badge-"+l.id,_.setAttribute("title",l.title||h.title),l.image&&(_.style.backgroundImage='url("'+l.image+'")'),l.color&&(_.style.backgroundColor=l.color),l.extra_css&&(_.style.cssText+=l.extra_css),d.push([(u?1:-1)*c,_])}if(d.sort(function(e,t){return e[0]-t[0]}),u)for(;d.length;)r.before(d.shift()[1]);else for(;d.length;)o.append(d.shift()[1])}}},s.bttv_known_bots=["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"],s.prototype._legacy_add_donors=function(){this.badges[0]={id:0,title:"FFZ Developer",color:"#FAAF19",image:"//cdn.frankerfacez.com/script/devicon.png",transparent_image:"//cdn.frankerfacez.com/script/devtransicon.png"},n.update_css(this._badge_style,0,i(this.badges[0])),this.badges[1]={id:1,title:"FFZ Donor",color:"#755000",image:"//cdn.frankerfacez.com/script/devicon.png"},n.update_css(this._badge_style,1,i(this.badges[1])),this.badges[2]={id:2,title:"Bot",color:"#595959",image:"//cdn.frankerfacez.com/script/boticon.png",replaces:"moderator",visible:function(e,t){return!(this.has_bttv&&-1!==s.bttv_known_bots.indexOf(t))}},n.update_css(this._badge_style,2,i(this.badges[2]));for(var e=0;e<s.bttv_known_bots.length;e++){var t=s.bttv_known_bots[e],o=this.users[t]=this.users[t]||{},a=o.badges=o.badges||{};a[0]||(a[0]={id:2})}this.users.sirstendec={badges:{1:{id:0}},sets:[4330]},this.users.zenwan={badges:{0:{id:2,image:"//cdn.frankerfacez.com/script/momiglee_badge.png",title:"WAN"}}},this._legacy_load_bots(),this._legacy_load_donors()},s.prototype._legacy_load_bots=function(e){jQuery.ajax(o.SERVER+"script/bots.txt",{cache:!1,context:this}).done(function(e){this._legacy_parse_badges(e,0,2)}).fail(function(t){404!=t.status&&(e=(e||0)+1,10>e&&this._legacy_load_bots(e))})},s.prototype._legacy_load_donors=function(e){jQuery.ajax(o.SERVER+"script/donors.txt",{cache:!1,context:this}).done(function(e){this._legacy_parse_badges(e,1,1)}).fail(function(t){return 404!=t.status?(e=(e||0)+1,10>e?this._legacy_load_donors(e):void 0):void 0})},s.prototype._legacy_parse_badges=function(e,t,s){var o=this.badges[s].title,i=0;if(ds=null,null!=e)for(var a=e.trim().split(/\W+/),r=0;r<a.length;r++){var d=a[r],u=this.users[d]=this.users[d]||{},c=u.badges=u.badges||{},l=u.sets=u.sets||[];null!==ds&&-1===l.indexOf(ds)&&l.push(ds),c[t]||(c[t]={id:s},i+=1)}this.log('Added "'+o+'" badge to '+n.number_commas(i)+" users.")}},{"./constants":3,"./utils":31}],2:[function(){var t=e.FrankerFaceZ;t.ffz_commands.log=function(e){this._pastebin(this._log_data.join("\n"),function(t){return t?void this.room_message(e,"Your FrankerFaceZ log has been pasted to: "+t):this.room_message(e,"There was an error uploading the FrankerFaceZ log.")})},t.ffz_commands.massunmod=function(e,t){if(t=t.join(" ").trim(),!t.length)return"You must provide a list of users to unmod.";t=t.split(/\W*,\W*/);var s=this.get_user();if(!s||!s.login==e.id)return"You must be the broadcaster to use massunmod.";if(t.length>50)return"Each user you unmod counts as a single message. To avoid being globally banned, please limit yourself to 50 at a time and wait between uses.";for(var o=t.length;t.length;){var n=t.shift();e.room.tmiRoom.sendMessage("/unmod "+n)}return"Sent unmod command for "+o+" users."},t.ffz_commands.massunmod.help="Usage: /ffz massunmod <list, of, users>\nBroadcaster only. Unmod all the users in the provided list.",t.ffz_commands.massmod=function(e,t){if(t=t.join(" ").trim(),!t.length)return"You must provide a list of users to mod.";t=t.split(/\W*,\W*/);var s=this.get_user();if(!s||!s.login==e.id)return"You must be the broadcaster to use massmod.";if(t.length>50)return"Each user you mod counts as a single message. To avoid being globally banned, please limit yourself to 50 at a time and wait between uses.";for(var o=t.length;t.length;){var n=t.shift();e.room.tmiRoom.sendMessage("/mod "+n)}return"Sent mod command for "+o+" users."},t.ffz_commands.massmod.help="Usage: /ffz massmod <list, of, users>\nBroadcaster only. Mod all the users in the provided list."},{}],3:[function(e,t){var s='<path d="m120.95 1.74c4.08-0.09 8.33-0.84 12.21 0.82 3.61 1.8 7 4.16 11.01 5.05 2.08 3.61 6.12 5.46 8.19 9.07 3.6 5.67 7.09 11.66 8.28 18.36 1.61 9.51 7.07 17.72 12.69 25.35 3.43 7.74 1.97 16.49 3.6 24.62 2.23 5.11 4.09 10.39 6.76 15.31 1.16 2 4.38 0.63 4.77-1.32 1.2-7.1-2.39-13.94-1.97-21.03 0.38-3.64-0.91-7.48 0.25-10.99 2.74-3.74 4.57-8.05 7.47-11.67 3.55-5.47 10.31-8.34 16.73-7.64 2.26 2.89 5.13 5.21 7.58 7.92 2.88 4.3 6.52 8.01 9.83 11.97 1.89 2.61 3.06 5.64 4.48 8.52 2.81 4.9 4 10.5 6.63 15.49 2.16 6.04 5.56 11.92 5.37 18.5 0.65 1.95 0.78 4 0.98 6.03 1.01 3.95 2.84 8.55 0.63 12.42-2.4 5.23-7.03 8.97-11.55 12.33-6.06 4.66-11.62 10.05-18.37 13.75-4.06 2.65-8.24 5.17-12.71 7.08-3.59 1.57-6.06 4.94-9.85 6.09-2.29 1.71-3.98 4.51-6.97 5.02-4.56 1.35-8.98-3.72-13.5-1.25-2.99 1.83-6.19 3.21-9.39 4.6-8.5 5.61-18.13 9.48-28.06 11.62-8.36-0.2-16.69 0.62-25.05 0.47-3.5-1.87-7.67-1.08-11.22-2.83-6.19-1.52-10.93-6.01-16.62-8.61-2.87-1.39-5.53-3.16-8.11-4.99-2.58-1.88-4.17-4.85-6.98-6.44-3.83-0.11-6.54 3.42-10.24 3.92-2.31 0.28-4.64 0.32-6.96 0.31-3.5-3.65-5.69-8.74-10.59-10.77-5.01-3.68-10.57-6.67-14.84-11.25-2.52-2.55-5.22-4.87-8.24-6.8-4.73-4.07-7.93-9.51-11.41-14.62-3.08-4.41-5.22-9.73-4.6-15.19 0.65-8.01 0.62-16.18 2.55-24.02 4.06-10.46 11.15-19.34 18.05-28.06 3.71-5.31 9.91-10.21 16.8-8.39 3.25 1.61 5.74 4.56 7.14 7.89 1.19 2.7 3.49 4.93 3.87 7.96 0.97 5.85 1.6 11.86 0.74 17.77-1.7 6.12-2.98 12.53-2.32 18.9 0.01 2.92 2.9 5.36 5.78 4.57 3.06-0.68 3.99-4.07 5.32-6.48 1.67-4.06 4.18-7.66 6.69-11.23 3.61-5.28 5.09-11.57 7.63-17.37 2.07-4.56 1.7-9.64 2.56-14.46 0.78-7.65-0.62-15.44 0.7-23.04 1.32-3.78 1.79-7.89 3.8-11.4 3.01-3.66 6.78-6.63 9.85-10.26 1.72-2.12 4.21-3.32 6.55-4.6 7.89-2.71 15.56-6.75 24.06-7z"/>',o="true"==localStorage.ffzDebugMode&&document.body.classList.contains("ffz-dev"),n=o?"//localhost:8000/":"//cdn.frankerfacez.com/";t.exports={DEBUG:o,SERVER:n,API_SERVER:"//api.frankerfacez.com/",KNOWN_CODES:{"#-?[\\\\/]":"#-/",":-?(?:7|L)":":-7","\\<\\;\\]":"<]","\\:-?(S|s)":":-S","\\:-?\\\\":":-\\","\\:\\>\\;":":>","B-?\\)":"B-)","\\:-?[z|Z|\\|]":":-Z","\\:-?\\)":":-)","\\:-?\\(":":-(","\\:-?(p|P)":":-P","\\;-?(p|P)":";-P","\\<\\;3":"<3","\\:-?[\\\\/]":":-/","\\;-?\\)":";-)","R-?\\)":"R-)","[o|O](_|\\.)[o|O]":"O.o","\\:-?D":":-D","\\:-?(o|O)":":-O","\\>\\;\\(":">(","Gr(a|e)yFace":"GrayFace"},EMOTE_REPLACEMENT_BASE:n+"script/replacements/",EMOTE_REPLACEMENTS:{15:"15-JKanStyle.png",16:"16-OptimizePrime.png",17:"17-StoneLightning.png",18:"18-TheRinger.png",19:"19-PazPazowitz.png",20:"20-EagleEye.png",21:"21-CougarHunt.png",22:"22-RedCoat.png",26:"26-JonCarnage.png",27:"27-PicoMause.png",30:"30-BCWarrior.png",33:"33-DansGame.png",36:"36-PJSalt.png"},EMOJI_REGEX:/((?:\ud83c\udde8\ud83c\uddf3|\ud83c\uddfa\ud83c\uddf8|\ud83c\uddf7\ud83c\uddfa|\ud83c\uddf0\ud83c\uddf7|\ud83c\uddef\ud83c\uddf5|\ud83c\uddee\ud83c\uddf9|\ud83c\uddec\ud83c\udde7|\ud83c\uddeb\ud83c\uddf7|\ud83c\uddea\ud83c\uddf8|\ud83c\udde9\ud83c\uddea|\u0039\ufe0f?\u20e3|\u0038\ufe0f?\u20e3|\u0037\ufe0f?\u20e3|\u0036\ufe0f?\u20e3|\u0035\ufe0f?\u20e3|\u0034\ufe0f?\u20e3|\u0033\ufe0f?\u20e3|\u0032\ufe0f?\u20e3|\u0031\ufe0f?\u20e3|\u0030\ufe0f?\u20e3|\u0023\ufe0f?\u20e3|\ud83d\udeb3|\ud83d\udeb1|\ud83d\udeb0|\ud83d\udeaf|\ud83d\udeae|\ud83d\udea6|\ud83d\udea3|\ud83d\udea1|\ud83d\udea0|\ud83d\ude9f|\ud83d\ude9e|\ud83d\ude9d|\ud83d\ude9c|\ud83d\ude9b|\ud83d\ude98|\ud83d\ude96|\ud83d\ude94|\ud83d\ude90|\ud83d\ude8e|\ud83d\ude8d|\ud83d\ude8b|\ud83d\ude8a|\ud83d\ude88|\ud83d\ude86|\ud83d\ude82|\ud83d\ude81|\ud83d\ude36|\ud83d\ude34|\ud83d\ude2f|\ud83d\ude2e|\ud83d\ude2c|\ud83d\ude27|\ud83d\ude26|\ud83d\ude1f|\ud83d\ude1b|\ud83d\ude19|\ud83d\ude17|\ud83d\ude15|\ud83d\ude11|\ud83d\ude10|\ud83d\ude0e|\ud83d\ude08|\ud83d\ude07|\ud83d\ude00|\ud83d\udd67|\ud83d\udd66|\ud83d\udd65|\ud83d\udd64|\ud83d\udd63|\ud83d\udd62|\ud83d\udd61|\ud83d\udd60|\ud83d\udd5f|\ud83d\udd5e|\ud83d\udd5d|\ud83d\udd5c|\ud83d\udd2d|\ud83d\udd2c|\ud83d\udd15|\ud83d\udd09|\ud83d\udd08|\ud83d\udd07|\ud83d\udd06|\ud83d\udd05|\ud83d\udd04|\ud83d\udd02|\ud83d\udd01|\ud83d\udd00|\ud83d\udcf5|\ud83d\udcef|\ud83d\udced|\ud83d\udcec|\ud83d\udcb7|\ud83d\udcb6|\ud83d\udcad|\ud83d\udc6d|\ud83d\udc6c|\ud83d\udc65|\ud83d\udc2a|\ud83d\udc16|\ud83d\udc15|\ud83d\udc13|\ud83d\udc10|\ud83d\udc0f|\ud83d\udc0b|\ud83d\udc0a|\ud83d\udc09|\ud83d\udc08|\ud83d\udc07|\ud83d\udc06|\ud83d\udc05|\ud83d\udc04|\ud83d\udc03|\ud83d\udc02|\ud83d\udc01|\ud83d\udc00|\ud83c\udfe4|\ud83c\udfc9|\ud83c\udfc7|\ud83c\udf7c|\ud83c\udf50|\ud83c\udf4b|\ud83c\udf33|\ud83c\udf32|\ud83c\udf1e|\ud83c\udf1d|\ud83c\udf1c|\ud83c\udf1a|\ud83c\udf18|\ud83c\udccf|\ud83c\udd70|\ud83c\udd71|\ud83c\udd7e|\ud83c\udd8e|\ud83c\udd91|\ud83c\udd92|\ud83c\udd93|\ud83c\udd94|\ud83c\udd95|\ud83c\udd96|\ud83c\udd97|\ud83c\udd98|\ud83c\udd99|\ud83c\udd9a|\ud83d\udc77|\ud83d\udec5|\ud83d\udec4|\ud83d\udec3|\ud83d\udec2|\ud83d\udec1|\ud83d\udebf|\ud83d\udeb8|\ud83d\udeb7|\ud83d\udeb5|\ud83c\ude01|\ud83c\ude02|\ud83c\ude32|\ud83c\ude33|\ud83c\ude34|\ud83c\ude35|\ud83c\ude36|\ud83c\ude37|\ud83c\ude38|\ud83c\ude39|\ud83c\ude3a|\ud83c\ude50|\ud83c\ude51|\ud83c\udf00|\ud83c\udf01|\ud83c\udf02|\ud83c\udf03|\ud83c\udf04|\ud83c\udf05|\ud83c\udf06|\ud83c\udf07|\ud83c\udf08|\ud83c\udf09|\ud83c\udf0a|\ud83c\udf0b|\ud83c\udf0c|\ud83c\udf0f|\ud83c\udf11|\ud83c\udf13|\ud83c\udf14|\ud83c\udf15|\ud83c\udf19|\ud83c\udf1b|\ud83c\udf1f|\ud83c\udf20|\ud83c\udf30|\ud83c\udf31|\ud83c\udf34|\ud83c\udf35|\ud83c\udf37|\ud83c\udf38|\ud83c\udf39|\ud83c\udf3a|\ud83c\udf3b|\ud83c\udf3c|\ud83c\udf3d|\ud83c\udf3e|\ud83c\udf3f|\ud83c\udf40|\ud83c\udf41|\ud83c\udf42|\ud83c\udf43|\ud83c\udf44|\ud83c\udf45|\ud83c\udf46|\ud83c\udf47|\ud83c\udf48|\ud83c\udf49|\ud83c\udf4a|\ud83c\udf4c|\ud83c\udf4d|\ud83c\udf4e|\ud83c\udf4f|\ud83c\udf51|\ud83c\udf52|\ud83c\udf53|\ud83c\udf54|\ud83c\udf55|\ud83c\udf56|\ud83c\udf57|\ud83c\udf58|\ud83c\udf59|\ud83c\udf5a|\ud83c\udf5b|\ud83c\udf5c|\ud83c\udf5d|\ud83c\udf5e|\ud83c\udf5f|\ud83c\udf60|\ud83c\udf61|\ud83c\udf62|\ud83c\udf63|\ud83c\udf64|\ud83c\udf65|\ud83c\udf66|\ud83c\udf67|\ud83c\udf68|\ud83c\udf69|\ud83c\udf6a|\ud83c\udf6b|\ud83c\udf6c|\ud83c\udf6d|\ud83c\udf6e|\ud83c\udf6f|\ud83c\udf70|\ud83c\udf71|\ud83c\udf72|\ud83c\udf73|\ud83c\udf74|\ud83c\udf75|\ud83c\udf76|\ud83c\udf77|\ud83c\udf78|\ud83c\udf79|\ud83c\udf7a|\ud83c\udf7b|\ud83c\udf80|\ud83c\udf81|\ud83c\udf82|\ud83c\udf83|\ud83c\udf84|\ud83c\udf85|\ud83c\udf86|\ud83c\udf87|\ud83c\udf88|\ud83c\udf89|\ud83c\udf8a|\ud83c\udf8b|\ud83c\udf8c|\ud83c\udf8d|\ud83c\udf8e|\ud83c\udf8f|\ud83c\udf90|\ud83c\udf91|\ud83c\udf92|\ud83c\udf93|\ud83c\udfa0|\ud83c\udfa1|\ud83c\udfa2|\ud83c\udfa3|\ud83c\udfa4|\ud83c\udfa5|\ud83c\udfa6|\ud83c\udfa7|\ud83c\udfa8|\ud83c\udfa9|\ud83c\udfaa|\ud83c\udfab|\ud83c\udfac|\ud83c\udfad|\ud83c\udfae|\ud83c\udfaf|\ud83c\udfb0|\ud83c\udfb1|\ud83c\udfb2|\ud83c\udfb3|\ud83c\udfb4|\ud83c\udfb5|\ud83c\udfb6|\ud83c\udfb7|\ud83c\udfb8|\ud83c\udfb9|\ud83c\udfba|\ud83c\udfbb|\ud83c\udfbc|\ud83c\udfbd|\ud83c\udfbe|\ud83c\udfbf|\ud83c\udfc0|\ud83c\udfc1|\ud83c\udfc2|\ud83c\udfc3|\ud83c\udfc4|\ud83c\udfc6|\ud83c\udfc8|\ud83c\udfca|\ud83c\udfe0|\ud83c\udfe1|\ud83c\udfe2|\ud83c\udfe3|\ud83c\udfe5|\ud83c\udfe6|\ud83c\udfe7|\ud83c\udfe8|\ud83c\udfe9|\ud83c\udfea|\ud83c\udfeb|\ud83c\udfec|\ud83c\udfed|\ud83c\udfee|\ud83c\udfef|\ud83c\udff0|\ud83d\udc0c|\ud83d\udc0d|\ud83d\udc0e|\ud83d\udc11|\ud83d\udc12|\ud83d\udc14|\ud83d\udc17|\ud83d\udc18|\ud83d\udc19|\ud83d\udc1a|\ud83d\udc1b|\ud83d\udc1c|\ud83d\udc1d|\ud83d\udc1e|\ud83d\udc1f|\ud83d\udc20|\ud83d\udc21|\ud83d\udc22|\ud83d\udc23|\ud83d\udc24|\ud83d\udc25|\ud83d\udc26|\ud83d\udc27|\ud83d\udc28|\ud83d\udc29|\ud83d\udc2b|\ud83d\udc2c|\ud83d\udc2d|\ud83d\udc2e|\ud83d\udc2f|\ud83d\udc30|\ud83d\udc31|\ud83d\udc32|\ud83d\udc33|\ud83d\udc34|\ud83d\udc35|\ud83d\udc36|\ud83d\udc37|\ud83d\udc38|\ud83d\udc39|\ud83d\udc3a|\ud83d\udc3b|\ud83d\udc3c|\ud83d\udc3d|\ud83d\udc3e|\ud83d\udc40|\ud83d\udc42|\ud83d\udc43|\ud83d\udc44|\ud83d\udc45|\ud83d\udc46|\ud83d\udc47|\ud83d\udc48|\ud83d\udc49|\ud83d\udc4a|\ud83d\udc4b|\ud83d\udc4c|\ud83d\udc4d|\ud83d\udc4e|\ud83d\udc4f|\ud83d\udc50|\ud83d\udc51|\ud83d\udc52|\ud83d\udc53|\ud83d\udc54|\ud83d\udc55|\ud83d\udc56|\ud83d\udc57|\ud83d\udc58|\ud83d\udc59|\ud83d\udc5a|\ud83d\udc5b|\ud83d\udc5c|\ud83d\udc5d|\ud83d\udc5e|\ud83d\udc5f|\ud83d\udc60|\ud83d\udc61|\ud83d\udc62|\ud83d\udc63|\ud83d\udc64|\ud83d\udc66|\ud83d\udc67|\ud83d\udc68|\ud83d\udc69|\ud83d\udc6a|\ud83d\udc6b|\ud83d\udc6e|\ud83d\udc6f|\ud83d\udc70|\ud83d\udc71|\ud83d\udc72|\ud83d\udc73|\ud83d\udc74|\ud83d\udc75|\ud83d\udc76|\ud83d\udeb4|\ud83d\udc78|\ud83d\udc79|\ud83d\udc7a|\ud83d\udc7b|\ud83d\udc7c|\ud83d\udc7d|\ud83d\udc7e|\ud83d\udc7f|\ud83d\udc80|\ud83d\udc81|\ud83d\udc82|\ud83d\udc83|\ud83d\udc84|\ud83d\udc85|\ud83d\udc86|\ud83d\udc87|\ud83d\udc88|\ud83d\udc89|\ud83d\udc8a|\ud83d\udc8b|\ud83d\udc8c|\ud83d\udc8d|\ud83d\udc8e|\ud83d\udc8f|\ud83d\udc90|\ud83d\udc91|\ud83d\udc92|\ud83d\udc93|\ud83d\udc94|\ud83d\udc95|\ud83d\udc96|\ud83d\udc97|\ud83d\udc98|\ud83d\udc99|\ud83d\udc9a|\ud83d\udc9b|\ud83d\udc9c|\ud83d\udc9d|\ud83d\udc9e|\ud83d\udc9f|\ud83d\udca0|\ud83d\udca1|\ud83d\udca2|\ud83d\udca3|\ud83d\udca4|\ud83d\udca5|\ud83d\udca6|\ud83d\udca7|\ud83d\udca8|\ud83d\udca9|\ud83d\udcaa|\ud83d\udcab|\ud83d\udcac|\ud83d\udcae|\ud83d\udcaf|\ud83d\udcb0|\ud83d\udcb1|\ud83d\udcb2|\ud83d\udcb3|\ud83d\udcb4|\ud83d\udcb5|\ud83d\udcb8|\ud83d\udcb9|\ud83d\udcba|\ud83d\udcbb|\ud83d\udcbc|\ud83d\udcbd|\ud83d\udcbe|\ud83d\udcbf|\ud83d\udcc0|\ud83d\udcc1|\ud83d\udcc2|\ud83d\udcc3|\ud83d\udcc4|\ud83d\udcc5|\ud83d\udcc6|\ud83d\udcc7|\ud83d\udcc8|\ud83d\udcc9|\ud83d\udcca|\ud83d\udccb|\ud83d\udccc|\ud83d\udccd|\ud83d\udcce|\ud83d\udccf|\ud83d\udcd0|\ud83d\udcd1|\ud83d\udcd2|\ud83d\udcd3|\ud83d\udcd4|\ud83d\udcd5|\ud83d\udcd6|\ud83d\udcd7|\ud83d\udcd8|\ud83d\udcd9|\ud83d\udcda|\ud83d\udcdb|\ud83d\udcdc|\ud83d\udcdd|\ud83d\udcde|\ud83d\udcdf|\ud83d\udce0|\ud83d\udce1|\ud83d\udce2|\ud83d\udce3|\ud83d\udce4|\ud83d\udce5|\ud83d\udce6|\ud83d\udce7|\ud83d\udce8|\ud83d\udce9|\ud83d\udcea|\ud83d\udceb|\ud83d\udcee|\ud83d\udcf0|\ud83d\udcf1|\ud83d\udcf2|\ud83d\udcf3|\ud83d\udcf4|\ud83d\udcf6|\ud83d\udcf7|\ud83d\udcf9|\ud83d\udcfa|\ud83d\udcfb|\ud83d\udcfc|\ud83d\udd03|\ud83d\udd0a|\ud83d\udd0b|\ud83d\udd0c|\ud83d\udd0d|\ud83d\udd0e|\ud83d\udd0f|\ud83d\udd10|\ud83d\udd11|\ud83d\udd12|\ud83d\udd13|\ud83d\udd14|\ud83d\udd16|\ud83d\udd17|\ud83d\udd18|\ud83d\udd19|\ud83d\udd1a|\ud83d\udd1b|\ud83d\udd1c|\ud83d\udd1d|\ud83d\udd1e|\ud83d\udd1f|\ud83d\udd20|\ud83d\udd21|\ud83d\udd22|\ud83d\udd23|\ud83d\udd24|\ud83d\udd25|\ud83d\udd26|\ud83d\udd27|\ud83d\udd28|\ud83d\udd29|\ud83d\udd2a|\ud83d\udd2b|\ud83d\udd2e|\ud83d\udd2f|\ud83d\udd30|\ud83d\udd31|\ud83d\udd32|\ud83d\udd33|\ud83d\udd34|\ud83d\udd35|\ud83d\udd36|\ud83d\udd37|\ud83d\udd38|\ud83d\udd39|\ud83d\udd3a|\ud83d\udd3b|\ud83d\udd3c|\ud83d\udd3d|\ud83d\udd50|\ud83d\udd51|\ud83d\udd52|\ud83d\udd53|\ud83d\udd54|\ud83d\udd55|\ud83d\udd56|\ud83d\udd57|\ud83d\udd58|\ud83d\udd59|\ud83d\udd5a|\ud83d\udd5b|\ud83d\uddfb|\ud83d\uddfc|\ud83d\uddfd|\ud83d\uddfe|\ud83d\uddff|\ud83d\ude01|\ud83d\ude02|\ud83d\ude03|\ud83d\ude04|\ud83d\ude05|\ud83d\ude06|\ud83d\ude09|\ud83d\ude0a|\ud83d\ude0b|\ud83d\ude0c|\ud83d\ude0d|\ud83d\ude0f|\ud83d\ude12|\ud83d\ude13|\ud83d\ude14|\ud83d\ude16|\ud83d\ude18|\ud83d\ude1a|\ud83d\ude1c|\ud83d\ude1d|\ud83d\ude1e|\ud83d\ude20|\ud83d\ude21|\ud83d\ude22|\ud83d\ude23|\ud83d\ude24|\ud83d\ude25|\ud83d\ude28|\ud83d\ude29|\ud83d\ude2a|\ud83d\ude2b|\ud83d\ude2d|\ud83d\ude30|\ud83d\ude31|\ud83d\ude32|\ud83d\ude33|\ud83d\ude35|\ud83d\ude37|\ud83d\ude38|\ud83d\ude39|\ud83d\ude3a|\ud83d\ude3b|\ud83d\ude3c|\ud83d\ude3d|\ud83d\ude3e|\ud83d\ude3f|\ud83d\ude40|\ud83d\ude45|\ud83d\ude46|\ud83d\ude47|\ud83d\ude48|\ud83d\ude49|\ud83d\ude4a|\ud83d\ude4b|\ud83d\ude4c|\ud83d\ude4d|\ud83d\ude4e|\ud83d\ude4f|\ud83d\ude80|\ud83d\ude83|\ud83d\ude84|\ud83d\ude85|\ud83d\ude87|\ud83d\ude89|\ud83d\ude8c|\ud83d\ude8f|\ud83d\ude91|\ud83d\ude92|\ud83d\ude93|\ud83d\ude95|\ud83d\ude97|\ud83d\ude99|\ud83d\ude9a|\ud83d\udea2|\ud83d\udea4|\ud83d\udea5|\ud83d\udea7|\ud83d\udea8|\ud83d\udea9|\ud83d\udeaa|\ud83d\udeab|\ud83d\udeac|\ud83d\udead|\ud83d\udeb2|\ud83d\udeb6|\ud83d\udeb9|\ud83d\udeba|\ud83d\udebb|\ud83d\udebc|\ud83d\udebd|\ud83d\udebe|\ud83d\udec0|\ud83c\udde6|\ud83c\udde7|\ud83c\udde8|\ud83c\udde9|\ud83c\uddea|\ud83c\uddeb|\ud83c\uddec|\ud83c\udded|\ud83c\uddee|\ud83c\uddef|\ud83c\uddf0|\ud83c\uddf1|\ud83c\uddf2|\ud83c\uddf3|\ud83c\uddf4|\ud83c\uddf5|\ud83c\uddf6|\ud83c\uddf7|\ud83c\uddf8|\ud83c\uddf9|\ud83c\uddfa|\ud83c\uddfb|\ud83c\uddfc|\ud83c\uddfd|\ud83c\uddfe|\ud83c\uddff|\ud83c\udf0d|\ud83c\udf0e|\ud83c\udf10|\ud83c\udf12|\ud83c\udf16|\ud83c\udf17|\ue50a|\u3030|\u27b0|\u2797|\u2796|\u2795|\u2755|\u2754|\u2753|\u274e|\u274c|\u2728|\u270b|\u270a|\u2705|\u26ce|\u23f3|\u23f0|\u23ec|\u23eb|\u23ea|\u23e9|\u2122|\u27bf|\u00a9|\u00ae)|(?:(?:\ud83c\udc04|\ud83c\udd7f|\ud83c\ude1a|\ud83c\ude2f|\u3299|\u303d|\u2b55|\u2b50|\u2b1c|\u2b1b|\u2b07|\u2b06|\u2b05|\u2935|\u2934|\u27a1|\u2764|\u2757|\u2747|\u2744|\u2734|\u2733|\u2716|\u2714|\u2712|\u270f|\u270c|\u2709|\u2708|\u2702|\u26fd|\u26fa|\u26f5|\u26f3|\u26f2|\u26ea|\u26d4|\u26c5|\u26c4|\u26be|\u26bd|\u26ab|\u26aa|\u26a1|\u26a0|\u2693|\u267f|\u267b|\u3297|\u2666|\u2665|\u2663|\u2660|\u2653|\u2652|\u2651|\u2650|\u264f|\u264e|\u264d|\u264c|\u264b|\u264a|\u2649|\u2648|\u263a|\u261d|\u2615|\u2614|\u2611|\u260e|\u2601|\u2600|\u25fe|\u25fd|\u25fc|\u25fb|\u25c0|\u25b6|\u25ab|\u25aa|\u24c2|\u231b|\u231a|\u21aa|\u21a9|\u2199|\u2198|\u2197|\u2196|\u2195|\u2194|\u2139|\u2049|\u203c|\u2668)([\uFE0E\uFE0F]?)))/g,SVGPATH:s,ZREKNARF:'<svg style="padding:1.75px 0" class="svg-glyph_views ffz-svg svg-zreknarf" width="16px" viewBox="0 0 249 195" version="1.1" height="12.5px">'+s+"</svg>",CHAT_BUTTON:'<svg class="svg-emoticons ffz-svg" height="18px" width="24px" viewBox="0 0 249 195" version="1.1">'+s+"</svg>",ROOMS:'<svg class="svg-glyph_views svg-roomlist" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M1,13v-2h14v2H1z M1,5h13v2H1V5z M1,2h10v2H1V2z M12,10H1V8h11V10z" fill-rule="evenodd"></path></svg>',CAMERA:'<svg class="svg-camera" height="16px" version="1.1" viewBox="0 0 36 36" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" d="M24,20v6H4V10h20v6l8-6v16L24,20z"/></svg>',INVITE:'<svg class="svg-plus" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,9h-3v3h-2V9H7V7h3V4h2v3h3V9z M9,6H6v4h2h1v3h4l0,0l0,0v1h-3H4H1v-1l3-3h2L4,8V2h6v1H9V6z" fill-rule="evenodd"></path></svg>',EYE:'<svg class="svg-glyph_views ffz-svg svg-eye" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M11,13H5L1,9V8V7l4-4h6l4,4v1v1L11,13z M8,5C6.344,5,5,6.343,5,8c0,1.656,1.344,3,3,3c1.657,0,3-1.344,3-3C11,6.343,9.657,5,8,5z M8,9C7.447,9,7,8.552,7,8s0.447-1,1-1s1,0.448,1,1S8.553,9,8,9z" fill-rule="evenodd"></path></svg>',CLOCK:'<svg class="svg-glyph_views ffz-svg svg-clock" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" fill="#888888" d="M8,15c-3.866,0-7-3.134-7-7s3.134-7,7-7s7,3.134,7,7 S11.866,15,8,15z M8,3C5.238,3,3,5.238,3,8s2.238,5,5,5s5-2.238,5-5S10.762,3,8,3z M7.293,8.707L7,8l1-4l0.902,3.607L11,11 L7.293,8.707z"/></svg>',GEAR:'<svg class="svg-gear" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,7v2h-2.115c-0.125,0.615-0.354,1.215-0.713,1.758l1.484,1.484l-1.414,1.414l-1.484-1.484C10.215,12.531,9.615,12.76,9,12.885V15H7v-2.12c-0.614-0.126-1.21-0.356-1.751-0.714l-1.491,1.49l-1.414-1.414l1.491-1.49C3.477,10.211,3.247,9.613,3.12,9H1V7h2.116C3.24,6.384,3.469,5.785,3.829,5.242L2.343,3.757l1.414-1.414l1.485,1.485C5.785,3.469,6.384,3.24,7,3.115V1h2v2.12c0.613,0.126,1.211,0.356,1.752,0.714l1.49-1.491l1.414,1.414l-1.49,1.492C12.523,5.79,12.754,6.387,12.88,7H15z M8,6C6.896,6,6,6.896,6,8s0.896,2,2,2s2-0.896,2-2S9.104,6,8,6z" fill-rule="evenodd"></path></svg>',HEART:'<svg class="svg-heart" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M8,13.5L1.5,7V4l2-2h3L8,3.5L9.5,2h3l2,2v3L8,13.5z" fill-rule="evenodd"></path></svg>',EMOTE:'<svg class="svg-emote" height="16px" version="1.1" viewBox="0 0 18 18" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M9,18c-4.971,0-9-4.029-9-9s4.029-9,9-9s9,4.029,9,9S13.971,18,9,18z M14,4.111V4h-0.111C12.627,2.766,10.904,2,9,2C7.095,2,5.373,2.766,4.111,4H4v0.111C2.766,5.373,2,7.096,2,9s0.766,3.627,2,4.889V14l0.05-0.051C5.317,15.217,7.067,16,9,16c1.934,0,3.684-0.783,4.949-2.051L14,14v-0.111c1.234-1.262,2-2.984,2-4.889S15.234,5.373,14,4.111zM11,6h2v4h-2V6z M12.535,12.535C11.631,13.44,10.381,14,9,14s-2.631-0.56-3.536-1.465l0.707-0.707C6.896,12.553,7.896,13,9,13s2.104-0.447,2.828-1.172L12.535,12.535z M5,6h2v4H5V6z" fill-rule="evenodd"></path></svg>',STAR:'<svg class="svg-star" height="16px" version="1.1" viewbox="0 0 16 16" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M15,6l-4.041,2.694L13,14l-5-3.333L3,14l2.041-5.306L1,6h5.077L8,1l1.924,5H15z" fill-rule="evenodd"></path></svg>'}},{}],4:[function(){var t=e.FrankerFaceZ;t.settings_info.developer_mode={type:"boolean",value:!1,storage_key:"ffzDebugMode",visible:function(){return this.settings.developer_mode||Date.now()-parseInt(localStorage.ffzLastDevMode||"0")<6048e5},category:"Debugging",name:"Developer Mode",help:"Load FrankerFaceZ from the local development server instead of the CDN. Please refresh after changing this setting.",on_update:function(){localStorage.ffzLastDevMode=Date.now()}},t.ffz_commands.developer_mode=function(e,t){var s,t=t&&t.length?t[0].toLowerCase():null;return"y"==t||"yes"==t||"true"==t||"on"==t?s=!0:("n"==t||"no"==t||"false"==t||"off"==t)&&(s=!1),void 0===s?"Developer Mode is currently "+(this.settings.developer_mode?"enabled.":"disabled."):(this.settings.set("developer_mode",s),"Developer Mode is now "+(s?"enabled":"disabled")+". Please refresh your browser.")},t.ffz_commands.developer_mode.help="Usage: /ffz developer_mode <on|off>\nEnable or disable Developer Mode. When Developer Mode is enabled, the script will be reloaded from //localhost:8000/script.js instead of from the CDN."},{}],5:[function(t){var s=e.FrankerFaceZ,o=t("../utils"),n=t("../constants");s.prototype.setup_channel=function(){this.log("Creating channel style element.");var e=this._channel_style=document.createElement("style");e.id="ffz-channel-css",document.head.appendChild(e),document.body.classList.toggle("ffz-hide-view-count",!this.settings.channel_views),this.log("Creating channel style element.");var e=this._channel_style=document.createElement("style");e.id="ffz-channel-css",document.head.appendChild(e),this.log("Hooking the Ember Channel Index view.");var t=App.__container__.resolve("view:channel/index"),o=this;if(t){this._modify_cindex(t);try{t.create().destroy()}catch(n){}for(var i in Ember.View.views)if(Ember.View.views.hasOwnProperty(i)){var a=Ember.View.views[i];a instanceof t&&(this.log("Manually updating Channel Index view.",a),this._modify_cindex(a),a.ffzInit())}this.log("Hooking the Ember Channel controller."),t=App.__container__.lookup("controller:channel"),t&&t.reopen({ffzUpdateUptime:function(){o._cindex&&o._cindex.ffzUpdateUptime()}.observes("isLive","content.id"),ffzUpdateTitle:function(){var e=this.get("content.name"),t=this.get("content.display_name");t&&(s.capitalization[e]=[t,Date.now()]),o._cindex&&o._cindex.ffzFixTitle()}.observes("content.status","content.id"),ffzHostTarget:function(){var e=this.get("content.hostModeTarget"),t=e&&e.get("name"),n=e&&e.get("id"),i=e&&e.get("display_name");n!==o.__old_host_target&&(o.__old_host_target&&o.ws_send("unsub_channel",o.__old_host_target),n?(o.ws_send("sub_channel",n),o.__old_host_target=n):delete o.__old_host_target),i&&(s.capitalization[t]=[i,Date.now()]),o.settings.group_tabs&&o._chatv&&o._chatv.ffzRebuildTabs(),o.settings.follow_buttons&&o.rebuild_following_ui(),o.settings.srl_races&&o.rebuild_race_ui()}.observes("content.hostModeTarget")})}},s.prototype._modify_cindex=function(e){var t=this;e.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(e){t.error("CIndex didInsertElement: "+e)}},willClearRender:function(){try{this.ffzTeardown()}catch(e){t.error("CIndex willClearRender: "+e)}return this._super()},ffzInit:function(){var e=this.get("controller.id"),s=this.get("element");t._cindex=this,t.ws_send("sub_channel",e),s.setAttribute("data-channel",e),s.classList.add("ffz-channel"),this.$(".theatre-button a").attr("title","Theater Mode (Alt+T)"),this.ffzFixTitle(),this.ffzUpdateUptime(),this.ffzUpdateChatters();var o=this.get("element").querySelector(".svg-glyph_views:not(.ffz-svg)");o&&o.parentNode.classList.add("twitch-channel-views"),t.settings.follow_buttons&&t.rebuild_following_ui(),t.settings.srl_races&&t.rebuild_race_ui()},ffzFixTitle:function(){if(!t.has_bttv&&t.settings.stream_title){var e=this.get("controller.status"),s=this.get("controller.id");e=t.render_tokens(t.tokenize_line(s,s,e,!0)),this.$(".title span").each(function(t,s){var o=s.querySelectorAll("script");s.innerHTML=o.length?o[0].outerHTML+e+o[1].outerHTML:e})}},ffzUpdateChatters:function(){var e=this.get("controller.id"),s=t.rooms&&t.rooms[e];if(!s||!t.settings.chatter_count){var i=this.get("element").querySelector("#ffz-chatter-display");return i&&i.parentElement.removeChild(i),i=this.get("element").querySelector("#ffz-ffzchatter-display"),void(i&&i.parentElement.removeChild(i))}var a=Object.keys(s.room.get("ffz_chatters")||{}).length,r=s.ffz_chatters||0,d=s.ffz_viewers||0,i=this.get("element").querySelector("#ffz-chatter-display span");if(!i){var u=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-chatter-display",c.title="Currently in Chat",c.innerHTML=n.ROOMS+" ",i=document.createElement("span"),c.appendChild(i);var l=u.querySelector("#ffz-ffzchatter-display");l?u.insertBefore(c,l):u.appendChild(c),jQuery(c).tipsy()}if(i.innerHTML=o.number_commas(a),!r&&!d)return i=this.get("element").querySelector("#ffz-ffzchatter-display"),void(i&&i.parentNode.removeChild(i));if(i=this.get("element").querySelector("#ffz-ffzchatter-display span"),!i){var u=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-ffzchatter-display",c.title="Viewers (In Chat) with FrankerFaceZ",c.innerHTML=n.ZREKNARF+" ",i=document.createElement("span"),c.appendChild(i);var l=u.querySelector("#ffz-chatter-display");l?u.insertBefore(c,l.nextSibling):u.appendChild(c),jQuery(c).tipsy()}i.innerHTML=o.number_commas(d)+" ("+o.number_commas(r)+")"},ffzUpdateUptime:function(){if(this._ffz_update_uptime&&(clearTimeout(this._ffz_update_uptime),delete this._ffz_update_uptime),!t.settings.stream_uptime||!this.get("controller.isLiveAccordingToKraken")){var e=this.get("element").querySelector("#ffz-uptime-display");return void(e&&e.parentElement.removeChild(e))}this._ffz_update_uptime=setTimeout(this.ffzUpdateUptime.bind(this),1e3);var s=this.get("controller.content.stream.created_at");if(s&&(s=o.parse_date(s))){var i=Math.floor((Date.now()-s.getTime())/1e3);if(!(0>i)){var e=this.get("element").querySelector("#ffz-uptime-display span");if(!e){var a=this.get("element").querySelector(".stats-and-actions .channel-stats");if(!a)return;var r=document.createElement("span");r.className="ffz stat",r.id="ffz-uptime-display",r.title="Stream Uptime <nobr>(since "+s.toLocaleString()+")</nobr>",r.innerHTML=n.CLOCK+" ",e=document.createElement("span"),r.appendChild(e);var d=a.querySelector(".live-count");if(d)a.insertBefore(r,d.nextSibling);
|
||
else try{d=a.querySelector("script:nth-child(0n+2)"),a.insertBefore(r,d.nextSibling)}catch(u){a.insertBefore(r,a.childNodes[0])}jQuery(r).tipsy({html:!0})}e.innerHTML=o.time_to_string(i)}}},ffzTeardown:function(){var e=this.get("controller.id");e&&t.ws_send("unsub_channel",e),this.get("element").setAttribute("data-channel",""),t._cindex=void 0,this._ffz_update_uptime&&clearTimeout(this._ffz_update_uptime),o.update_css(t._channel_style,e,null)}})},s.settings_info.chatter_count={type:"boolean",value:!1,category:"Channel Metadata",name:"Chatter Count",help:"Display the current number of users connected to chat beneath the channel.",on_update:function(e){if(this._cindex&&this._cindex.ffzUpdateChatters(),e&&this.rooms)for(var t in this.rooms)this.rooms.hasOwnProperty(t)&&this.rooms[t].room&&this.rooms[t].room.ffzInitChatterCount()}},s.settings_info.channel_views={type:"boolean",value:!0,category:"Channel Metadata",name:"Channel Views",help:"Display the number of times the channel has been viewed beneath the stream.",on_update:function(e){document.body.classList.toggle("ffz-hide-view-count",!e)}},s.settings_info.stream_uptime={type:"boolean",value:!1,category:"Channel Metadata",name:"Stream Uptime",help:"Display the stream uptime under a channel by the viewer count.",on_update:function(){this._cindex&&this._cindex.ffzUpdateUptime()}},s.settings_info.stream_title={type:"boolean",value:!0,no_bttv:!0,category:"Channel Metadata",name:"Title Links",help:"Make links in stream titles clickable.",on_update:function(){this._cindex&&this._cindex.ffzFixTitle()}}},{"../constants":3,"../utils":31}],6:[function(t){var s=e.FrankerFaceZ,o=(t("../utils"),t("../constants"),{BACKSPACE:8,TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,TWO:50,COLON:186}),n=function(e){if("number"==typeof e.selectionStart)return e.selectionStart;if(!e.createTextRange)return-1;var t=document.selection.createRange(),s=e.createTextRange();return s.moveToBookmark(t.getBookmark()),s.moveStart("character",-e.value.length),s.text.length},i=function(e,t){if(e.setSelectionRange)e.setSelectionRange(t,t);else if(e.createTextRange){var s=e.createTextRange();s.move("character",-e.value.length),s.move("character",t),s.select()}};s.settings_info.input_quick_reply={type:"boolean",value:!0,category:"Chat Input",no_bttv:!0,name:"Reply to Whispers with /r",help:"Automatically replace /r at the start of the line with the command to whisper to the person you've whispered with most recently."},s.settings_info.input_mru={type:"boolean",value:!0,category:"Chat Input",no_bttv:!0,name:"Chat Input History",help:"Use the Up and Down arrows in chat to select previously sent chat messages."},s.settings_info.input_emoji={type:"boolean",value:!1,category:"Chat Input",visible:!1,no_bttv:!0,name:"Enter Emoji By Name",help:"Replace emoji that you type by name with the character. :+1: becomes 👍."},s.prototype.setup_chat_input=function(){this.log("Hooking the Ember Chat Input controller.");var e=App.__container__.resolve("component:twitch-chat-input");if(e&&(this._modify_chat_input(e),this._roomv))for(var t=0;t<this._roomv._childViews.length;t++){var s=this._roomv._childViews[t];s instanceof e&&(this._modify_chat_input(s),s.ffzInit())}},s.prototype._modify_chat_input=function(t){var a=this;t.reopen({ffz_mru_index:-1,didInsertElement:function(){this._super();try{this.ffzInit()}catch(e){a.error("ChatInput didInsertElement: "+e)}},willClearRender:function(){try{this.ffzTeardown()}catch(e){a.error("ChatInput willClearRender: "+e)}return this._super()},ffzInit:function(){a._inputv=this;var e=this.$("textarea");e.off("keydown"),e.on("keydown",this._ffzKeyDown.bind(this))},ffzTeardown:function(){a._inputv===this&&(a._inputv=void 0);var e=this.$("textarea");e.off("keydown"),e.on("keydown",this._onKeyDown.bind(this))},_ffzKeyDown:function(t){var s=t||e.event,r=s.charCode||s.keyCode;switch(r){case o.UP:case o.DOWN:if(this.get("isShowingSuggestions"))s.preventDefault();else{if(!a.settings.input_mru)return this._onKeyDown(t);Ember.run.next(this.ffzCycleMRU.bind(this,r))}break;case o.SPACE:if(!a.settings.input_quick_reply||2!==n(this.get("chatTextArea"))||"/r"!==this.get("textareaValue").substring(0,2))return this._onKeyDown(t);var d=this;Ember.run.next(function(){var e=d.get("uniqueWhisperSuggestions.0");if(e){var t="/w "+e+d.get("textareaValue").substr(2);d.set("_currentWhisperTarget",0),d.set("textareaValue",t),Ember.run.next(function(){i(d.get("chatTextArea"),4+e.length)})}});break;case o.COLON:var d;return this._onKeyDown(t);case o.ENTER:s.shiftKey||s.shiftLeft||this.set("ffz_mru_index",-1);default:return this._onKeyDown(t)}},ffzCycleMRU:function(e){var t=this.get("ffz_mru_index"),s=this._parentView.get("context.model.mru_list")||[];t=e===o.UP?(t+1)%(s.length+1):(t+s.length)%(s.length+1);var n=this.get("ffz_old_mru");void 0===n&&this.set("ffz_old_mru",this.get("textareaValue"));var i=s[t];void 0===i&&(this.set("ffz_old_mru",void 0),i=n),this.set("ffz_mru_index",t),this.set("textareaValue",i)},completeSuggestion:function(e){var t,o,n=this,a=this.get("textareaValue"),r=this.get("partialNameStartIndex");t=a.substring(0,r)+("/"===a.charAt(0)?e:s.get_capitalization(e)),o=a.substring(r+this.get("partialName").length),o||(t+=" "),this.set("textareaValue",t+o),this.set("isShowingSuggestions",!1),this.set("partialName",""),this.trackSuggestionsCompleted(),Ember.run.next(function(){i(n.get("chatTextArea"),t.length)})}})}},{"../constants":3,"../utils":31}],7:[function(t){var s=e.FrankerFaceZ,o=t("../utils"),n=t("../constants"),i=function(e){return 1>e?"":e>=99?"99+":""+e};s.settings_info.swap_sidebars={type:"boolean",value:!1,category:"Miscellaneous",no_bttv:!0,name:"Swap Sidebar Positions",help:"Swap the positions of the left and right sidebars, placing chat on the left.",on_update:function(e){this.has_bttv||document.body.classList.toggle("ffz-sidebar-swap",e)}},s.settings_info.minimal_chat={type:"boolean",value:!1,category:"Chat",name:"Minimalistic Chat",help:"Hide all of the chat user interface, only showing messages and an input box.",on_update:function(e){if(document.body.classList.toggle("ffz-minimal-chat",e),this.settings.group_tabs&&this._chatv&&this._chatv._ffz_tabs){var t=this;setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px"),t._roomv&&t._roomv.get("stuckToBottom")&&t._roomv._scrollToBottom()},0)}}},s.settings_info.prevent_clear={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Show Deleted Messages",help:"Fade deleted messages instead of replacing them, and prevent chat from being cleared.",on_update:function(e){if(!this.has_bttv&&this.rooms)for(var t in this.rooms){var s=this.rooms[t],o=s&&s.room;o&&o.get("messages").forEach(function(t,s){e&&!t.ffz_deleted&&t.deleted?o.set("messages."+s+".deleted",!1):!t.ffz_deleted||e||t.deleted||o.set("messages."+s+".deleted",!0)})}}},s.settings_info.chat_history={type:"boolean",value:!0,visible:!1,category:"Chat",name:"Chat History <span>Alpha</span>",help:"Load previous chat messages when loading a chat room so you can see what people have been talking about. <b>This currently only works in a handful of channels due to server capacity.</b>"},s.settings_info.group_tabs={type:"boolean",value:!1,no_bttv:!0,category:"Chat",name:"Chat Room Tabs <span>Beta</span>",help:"Enhanced UI for switching the current chat room and noticing new messages.",on_update:function(e){var t=!this.has_bttv&&e;this._chatv&&t!==this._group_tabs_state&&(t?this._chatv.ffzEnableTabs():this._chatv.ffzDisableTabs())}},s.settings_info.pinned_rooms={type:"button",value:[],category:"Chat",visible:!1,name:"Pinned Chat Rooms",help:"Set a list of channels that should always be available in chat."},s.prototype.setup_chatview=function(){document.body.classList.toggle("ffz-minimal-chat",this.settings.minimal_chat),this.has_bttv||document.body.classList.toggle("ffz-sidebar-swap",this.settings.swap_sidebars),this.log("Hooking the Ember Chat controller.");var e=App.__container__.lookup("controller:chat"),t=this;e&&e.reopen({ffzUpdateChannels:function(){t.settings.group_tabs&&t._chatv&&t._chatv.ffzRebuildTabs()}.observes("currentChannelRoom","connectedPrivateGroupRooms"),removeCurrentChannelRoom:function(){if(!t.settings.group_tabs||t.has_bttv)return this._super();var e=this.get("currentChannelRoom"),s=e&&e.get("id");t.settings.pinned_rooms&&-1!==t.settings.pinned_rooms.indexOf(s)||(e===this.get("currentRoom")&&this.blurRoom(),e&&e.destroy()),this.set("currentChannelRoom",void 0)}}),this.log("Hooking the Ember Chat view.");var e=App.__container__.resolve("view:chat");this._modify_cview(e);try{e.create().destroy()}catch(s){}for(var o in Ember.View.views)if(Ember.View.views.hasOwnProperty(o)){var n=Ember.View.views[o];if(n instanceof e){this.log("Manually updating existing Chat view.",n);try{n.ffzInit()}catch(s){this.error("setup: build_ui_link: "+s)}}}this.log("Hooking the Ember Layout controller.");var i=App.__container__.lookup("controller:layout");if(i){i.reopen({ffzFixTabs:function(){t.settings.group_tabs&&t._chatv&&t._chatv._ffz_tabs&&setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("isRightColumnClosed")}),this.log("Hooking the Ember 'Right Column' controller. Seriously...");var a=App.__container__.lookup("controller:right-column");a&&a.reopen({ffzFixTabs:function(){t.settings.group_tabs&&t._chatv&&t._chatv._ffz_tabs&&setTimeout(function(){t._chatv&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px")},0)}.observes("firstTabSelected")})}},s.prototype._modify_cview=function(e){var t=this;e.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(e){t.error("ChatView didInsertElement: "+e)}},willClearRender:function(){try{this.ffzTeardown()}catch(e){t.error("ChatView willClearRender: "+e)}this._super()},ffzInit:function(){t._chatv=this,this.$(".textarea-contain").append(t.build_ui_link(this)),!t.has_bttv&&t.settings.group_tabs&&this.ffzEnableTabs(),setTimeout(function(){t.settings.group_tabs&&t._chatv._ffz_tabs&&t._chatv.$(".chat-room").css("top",t._chatv._ffz_tabs.offsetHeight+"px");var e=t._chatv.get("controller");e&&e.set("showList",!1)},1e3)},ffzTeardown:function(){t._chatv===this&&(t._chatv=null),this.$(".textarea-contain .ffz-ui-toggle").remove(),t.settings.group_tabs&&this.ffzDisableTabs()},ffzChangeRoom:Ember.observer("controller.currentRoom",function(){try{if(t.update_ui_link(),!t.has_bttv&&t.settings.group_tabs&&this._ffz_tabs){var e=this.get("controller.currentRoom");e&&e.resetUnreadCount();var s=jQuery(this._ffz_tabs);s.children(".ffz-chat-tab").removeClass("active"),e&&s.children('.ffz-chat-tab[data-room="'+e.get("id")+'"]').removeClass("tab-mentioned").addClass("active").children("span").text("");var o=e&&e.get("canInvite");this._ffz_invite&&this._ffz_invite.classList.toggle("hidden",!o),this.set("controller.showInviteUser",o&&this.get("controller.showInviteUser")),this.$(".chat-room").css("top",this._ffz_tabs.offsetHeight+"px")}}catch(n){t.error("ChatView ffzUpdateLink: "+n)}}),ffzEnableTabs:function(){if(!t.has_bttv&&t.settings.group_tabs){this.$(".chat-header").addClass("hidden");var e=this._ffz_tabs=document.createElement("div");e.id="ffz-group-tabs",this.$(".chat-header").after(e),this.ffzRebuildTabs()}},ffzRebuildTabs:function(){if(!t.has_bttv&&t.settings.group_tabs){var e=this._ffz_tabs||this.get("element").querySelector("#ffz-group-tabs");if(e){e.innerHTML="";var s=document.createElement("a"),o=this;s.className="button glyph-only tooltip",s.title="Chat Room Management",s.innerHTML=n.ROOMS,s.addEventListener("click",function(){var e=o.get("controller");e&&e.set("showList",!e.get("showList"))}),e.appendChild(s),s=document.createElement("a"),s.className="button glyph-only tooltip invite",s.title="Invite a User",s.innerHTML=n.INVITE,s.addEventListener("click",function(){var e=o.get("controller");e&&e.set("showInviteUser",e.get("currentRoom.canInvite")&&!e.get("showInviteUser"))}),s.classList.toggle("hidden",!this.get("controller.currentRoom.canInvite")),o._ffz_invite=s,e.appendChild(s);var i,a=this.get("controller.currentChannelRoom");a&&(i=this.ffzBuildTab(o,a,!0),i&&e.appendChild(i));var r=App.__container__.lookup("controller:channel"),d=App.__container__.resolve("model:room");if(target=r&&r.get("hostModeTarget"),target&&d){var u=target.get("id");this._ffz_host!==u&&(-1===t.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),this._ffz_host=u,this._ffz_host_room=d.findOne(u))}else this._ffz_host&&(-1===t.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),delete this._ffz_host,delete this._ffz_host_room);this._ffz_host_room&&(i=o.ffzBuildTab(o,this._ffz_host_room,!1,!0),i&&e.appendChild(i));for(var c=0;c<t.settings.pinned_rooms.length;c++){var l=t.settings.pinned_rooms[c];if(a&&a.get("id")!==l&&this._ffz_host!==l&&t.rooms[l]&&t.rooms[l].room){var i=o.ffzBuildTab(o,t.rooms[l].room,!1,!1);i&&e.appendChild(i)}}_.each(this.get("controller.connectedPrivateGroupRooms"),function(t){var s=o.ffzBuildTab(o,t);s&&e.appendChild(s)}),this.$(".chat-room").css("top",e.offsetHeight+"px")}}},ffzTabUnread:function(e){if(!t.has_bttv&&t.settings.group_tabs){var s=this._ffz_tabs||this.get("element").querySelector("#ffz-group-tabs"),o=this.get("controller.currentRoom.id");if(s){if(e){var n=s.querySelector('.ffz-chat-tab[data-room="'+e+'"]'),a=t.rooms&&t.rooms[e];if(n&&a){var r=i(e===o?0:a.room.get("unreadCount"));n.querySelector("span").innerHTML=r}return this.$(".chat-room").css("top",s.offsetHeight+"px")}for(var d=s.querySelectorAll(".ffz-chat-tab"),u=0;u<d.length;u++){var n=d[u],e=n.getAttribute("data-room"),a=t.rooms&&t.rooms[e];if(a){var r=i(e===o?0:a.room.get("unreadCount"));n.querySelector("span").innerHTML=r}}this.$(".chat-room").css("top",s.offsetHeight+"px")}}},ffzBuildTab:function(e,t,a,r){var d,u,c=document.createElement("span"),l="",h=t.get("isGroupRoom"),f=t===e.get("controller.currentRoom");return c.setAttribute("data-room",t.id),c.className="ffz-chat-tab tooltip",c.classList.toggle("current-channel",a),c.classList.toggle("host-channel",r),c.classList.toggle("group-chat",h),c.classList.toggle("active",f),u=i(f?0:t.get("unreadCount")),d=t.get("tmiRoom.displayName")||(h?t.get("tmiRoom.name"):s.get_capitalization(t.get("id"),function(e){u=i(f?0:t.get("unreadCount")),c.innerHTML=l+o.sanitize(e)+"<span>"+u+"</span>"})),a?(l=n.CAMERA,c.title="Current Channel"):r?(l=n.EYE,c.title="Hosted Channel"):c.title=h?"Group Chat":"Pinned Channel",c.innerHTML=l+o.sanitize(d)+"<span>"+u+"</span>",c.addEventListener("click",function(){e.get("controller").focusRoom(t)}),c},ffzDisableTabs:function(){this._ffz_tabs&&(this._ffz_tabs.parentElement.removeChild(this._ffz_tabs),delete this._ffz_tabs,delete this._ffz_invite),this._ffz_host&&(-1===t.settings.pinned_rooms.indexOf(this._ffz_host)&&this._ffz_host_room&&(this.get("controller.currentRoom")===this._ffz_host_room&&this.get("controller").blurRoom(),this._ffz_host_room.destroy()),delete this._ffz_host,delete this._ffz_host_room),this.$(".chat-room").css("top",""),this.$(".chat-header").removeClass("hidden")}})},s.prototype.connect_extra_chat=function(){if(!this.has_bttv){for(var e=0;e<this.settings.pinned_rooms.length;e++)this._join_room(this.settings.pinned_rooms[e],!0);!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs()}},s.prototype._join_room=function(e,t){var s=!1;if(-1===this.settings.pinned_rooms.indexOf(e)&&(this.settings.pinned_rooms.push(e),this.settings.set("pinned_rooms",this.settings.pinned_rooms),s=!0),this.rooms[e]&&this.rooms[e].room)return s;{var o=App.__container__.resolve("model:room");o&&o.findOne(e)}return!t&&!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),s},s.prototype._leave_room=function(e,t){var s=!1;if(-1!==this.settings.pinned_rooms.indexOf(e)&&(this.settings.pinned_rooms.removeObject(e),this.settings.set("pinned_rooms",this.settings.pinned_rooms),s=!0),!this.rooms[e]||!this.rooms[e].room)return s;var o=App.__container__.lookup("controller:chat"),n=this.rooms[e].room;return!o||o.get("currentChannelRoom.id")===e||this._chatv&&this._chatv._ffz_host===e?s:(o.get("currentRoom.id")===e&&o.blurRoom(),n.destroy(),!t&&!this.has_bttv&&this._chatv&&this.settings.group_tabs&&this._chatv.ffzRebuildTabs(),s)},s.chat_commands.join=function(e,t){if(!t||!t.length||t.length>1)return"Join Usage: /join <channel>";var s=t[0].toLowerCase();return"#"===s.charAt(0)&&(s=s.substr(1)),this._join_room(s)?"Joining "+s+". You will always connect to this channel's chat unless you later /part from it.":"You have already joined "+s+'. Please use "/part '+s+'" to leave it.'},s.chat_commands.part=function(e,t){if(!t||!t.length||t.length>1)return"Part Usage: /part <channel>";var s=t[0].toLowerCase();return"#"===s.charAt(0)&&(s=s.substr(1)),this._leave_room(s)?"Leaving "+s+".":this.rooms[s]?"You do not have "+s+" pinned and you cannot leave the current channel or hosted channels via /part.":"You are not in "+s+"."}},{"../constants":3,"../utils":31}],8:[function(t){var s=e.FrankerFaceZ,o=t("../utils"),n="[\\s`~<>!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]",i=new RegExp(n+"*,"+n+"*"),a=function(e){return(e+"").replace(/&/g,"&").replace(/'/g,"'").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")},r="http://static-cdn.jtvnw.net/emoticons/v1/",d={};build_srcset=function(e){if(d[e])return d[e];var t=d[e]=r+e+"/1.0 1x, "+r+e+"/2.0 2x, "+r+e+"/3.0 4x";return t},data_to_tooltip=function(e){var t=e.set,s=e.set_type,o=e.owner;return void 0===s&&(s="Channel"),t?(("--twitch-turbo--"==t||"turbo"==t)&&(t="Twitch Turbo",s=null),"Emoticon: "+e.code+"\n"+(s?s+": ":"")+t+(o?"\nBy: "+o.display_name:"")):e.code},build_tooltip=function(e){{var t=this._twitch_emotes[e];t?t.set:null}return t?"string"==typeof t?t:t.tooltip?t.tooltip:t.tooltip=data_to_tooltip(t):"???"},load_emote_data=function(e,t,s,o){if(s){t&&(o.code=t),this._twitch_emotes[e]=o;for(var n=build_tooltip.bind(this)(e),i=document.querySelectorAll('img[emote-id="'+e+'"]'),a=0;a<i.length;a++)i[a].title=n}},build_link_tooltip=function(e){var t,s=this._link_data[e];if(!s)return"";if(s.tooltip)return s.tooltip;if("youtube"==s.type)t="<b>YouTube: "+o.sanitize(s.title)+"</b><hr>",t+="Channel: "+o.sanitize(s.channel)+" | "+o.time_to_string(s.duration)+"<br>",t+=o.number_commas(s.views||0)+" Views | 👍 "+o.number_commas(s.likes||0)+" 👎 "+o.number_commas(s.dislikes||0);else if("strawpoll"==s.type){t="<b>Strawpoll: "+o.sanitize(s.title)+"</b><hr><table><tbody>";for(var n in s.items){{var i=s.items[n];Math.floor(i/s.total*100)}t+='<tr><td style="text-align:left">'+o.sanitize(n)+'</td><td style="text-align:right">'+o.number_commas(i)+"</td></tr>"}t+="</tbody></table><hr>Total: "+o.number_commas(s.total);var a=o.parse_date(s.fetched);if(a){var r=Math.floor((a.getTime()-Date.now())/1e3);r>60&&(t+="<br><small>Data was cached "+o.time_to_string(r)+" ago.</small>")}}else if("twitch"==s.type){t="<b>Twitch: "+o.sanitize(s.display_name)+"</b><hr>";var d=o.parse_date(s.since);d&&(t+="Member Since: "+o.date_string(d)+"<br>"),t+="<nobr>Views: "+o.number_commas(s.views)+"</nobr> | <nobr>Followers: "+o.number_commas(s.followers)+"</nobr>"}else if("twitch_vod"==s.type)t="<b>Twitch "+("highlight"==s.broadcast_type?"Highlight":"Broadcast")+": "+o.sanitize(s.title)+"</b><hr>",t+="By: "+o.sanitize(s.display_name)+(s.game?" | Playing: "+o.sanitize(s.game):" | Not Playing")+"<br>",t+="Views: "+o.number_commas(s.views)+" | "+o.time_to_string(s.length);else if("twitter"==s.type)t="<b>Tweet By: "+o.sanitize(s.user)+"</b><hr>",t+=o.sanitize(s.tweet);else if("reputation"==s.type){if(t='<span style="word-wrap: break-word">'+o.sanitize(s.full.toLowerCase())+"</span>",s.trust<50||s.safety<50||s.tags&&s.tags.length>0){t+="<hr>";var u=!1;(s.trust<50||s.safety<50)&&(s.unsafe=!0,t+="<b>Potentially Unsafe Link</b><br>",t+="Trust: "+s.trust+"% | Child Safety: "+s.safety+"%",u=!0),s.tags&&s.tags.length>0&&(t+=(u?"<br>":"")+"Tags: "+s.tags.join(", ")),t+="<br>Data Source: WOT"}}else s.full&&(t='<span style="word-wrap: break-word">'+o.sanitize(s.full.toLowerCase())+"</span>");return t||(t='<span style="word-wrap: break-word">'+o.sanitize(e.toLowerCase())+"</span>"),s.tooltip=t,t},load_link_data=function(e,t,s){if(t){this._link_data[e]=s,s.unsafe=!1;var o,n=build_link_tooltip.bind(this)(e),i="/"==e.charAt(e.length-1)?e.substr(0,e.length-1):null;if(o=document.querySelectorAll(i?'span.message a[href="'+e+'"], span.message a[href="'+i+'"], span.message a[data-url="'+e+'"], span.message a[data-url="'+i+'"]':'span.message a[href="'+e+'"], span.message a[data-url="'+e+'"]'),this.settings.link_info)for(var a=0;a<o.length;a++)s.unsafe&&o[a].classList.add("unsafe-link"),o[a].classList.contains("deleted-link")||(o[a].title=n)}},s.settings_info.room_status={type:"boolean",value:!0,category:"Chat",no_bttv:!0,name:"Room Status Indicators",help:"Display the current room state (slow mode, sub mode, and r9k mode) next to the Chat button.",on_update:function(){this._roomv&&this._roomv.ffzUpdateStatus()}},s.settings_info.replace_bad_emotes={type:"boolean",value:!0,category:"Chat",name:"Fix Low Quality Twitch Global Emoticons",help:"Replace emoticons such as DansGame and RedCoat with cleaned up versions that don't have pixels around the edges or white backgrounds for nicer display on dark chat."},s.settings_info.parse_emoji={type:"boolean",value:!0,category:"Chat",name:"Replace Emoji with Images",help:"Replace emoji in chat messages with nicer looking images from the open-source Twitter Emoji project."},s.settings_info.room_status={type:"boolean",value:!0,category:"Chat",no_bttv:!0,name:"Room Status Indicators",help:"Display the current room state (slow mode, sub mode, and r9k mode) next to the Chat button.",on_update:function(){this._roomv&&this._roomv.ffzUpdateStatus()}},s.settings_info.scrollback_length={type:"button",value:150,category:"Chat",no_bttv:!0,name:"Scrollback Length",help:"Set the maximum number of lines to keep in chat.",method:function(){var e=prompt("Scrollback Length\n\nPlease enter a new maximum length for the chat scrollback. Default: 150\n\nNote: Making this too large will cause your browser to lag.",this.settings.scrollback_length);if(null!==e&&void 0!==e&&(e=parseInt(e),0/0!==e)){10>e&&(e=10),this.settings.set("scrollback_length",e);var t=App.__container__.lookup("controller:chat"),s=t&&t.get("currentRoom.id");for(var o in this.rooms){var n=this.rooms[o];n.room.set("messageBufferSize",e+(this._roomv&&!this._roomv.get("stuckToBottom")&&s===o?150:0))}}}},s.settings_info.banned_words={type:"button",value:[],category:"Chat",no_bttv:!0,name:"Banned Words",help:"Set a list of words that will be locally removed from chat messages.",method:function(){var e=this.settings.banned_words.join(", "),t=prompt("Banned Words\n\nPlease enter a comma-separated list of words that you would like to be removed from chat messages.",e);if(null!==t&&void 0!==t){t=t.trim().split(i);for(var s=[],o=0;o<t.length;o++)t[o]&&s.push(t[o]);1==s.length&&"disable"==s[0]&&(s=[]),this.settings.set("banned_words",s)}}},s.settings_info.keywords={type:"button",value:[],category:"Chat",no_bttv:!0,name:"Highlight Keywords",help:"Set additional keywords that will be highlighted in chat.",method:function(){var e=this.settings.keywords.join(", "),t=prompt("Highlight Keywords\n\nPlease enter a comma-separated list of words that you would like to be highlighted in chat.",e);if(null!==t&&void 0!==t){t=t.trim().split(i);for(var s=[],o=0;o<t.length;o++)t[o]&&s.push(t[o]);1==s.length&&"disable"==s[0]&&(s=[]),this.settings.set("keywords",s)}}},s.settings_info.fix_color={type:"boolean",value:!0,category:"Chat",no_bttv:!0,name:"Adjust Username Colors",help:"Ensure that username colors contrast with the background enough to be readable.",on_update:function(e){this.has_bttv||document.body.classList.toggle("ffz-chat-colors",e)}},s.settings_info.link_info={type:"boolean",value:!0,category:"Chat",no_bttv:!0,name:"Link Tooltips <span>Beta</span>",help:"Check links against known bad websites, unshorten URLs, and show YouTube info."},s.settings_info.chat_rows={type:"boolean",value:!1,category:"Chat",no_bttv:!0,name:"Chat Line Backgrounds",help:"Display alternating background colors for lines in chat.",on_update:function(e){this.has_bttv||document.body.classList.toggle("ffz-chat-background",e)}},s.prototype.setup_line=function(){document.body.classList.toggle("ffz-chat-colors",!this.has_bttv&&this.settings.fix_color),document.body.classList.toggle("ffz-chat-background",!this.has_bttv&&this.settings.chat_rows),this._colors={},this._last_row={};var e=this._fix_color_style=document.createElement("style");e.id="ffz-style-username-colors",e.type="text/css",document.head.appendChild(e),this._twitch_emotes={},this._link_data={},this.log("Hooking the Ember Whisper controller.");var t=App.__container__.resolve("component:whisper-line");t&&this._modify_line(t),this.log("Hooking the Ember Line controller.");var o=App.__container__.resolve("component:message-line");o&&this._modify_line(o);var n=this.get_user();n&&n.name&&(s.capitalization[n.login]=[n.name,Date.now()])},s.prototype._modify_line=function(e){var t=this;e.reopen({tokenizedMessage:function(){var e=this.get("msgObject.cachedTokens");if(e)return e;e=this._super();try{var o=performance.now(),n=t.get_user(),i=n&&this.get("msgObject.from")===n.login;e=t._remove_banned(e),e=t._emoticonize(this,e),t.settings.parse_emoji&&(e=t.tokenize_emoji(e));var a=this.get("msgObject.tags.display-name");a&&a.length&&(s.capitalization[this.get("msgObject.from")]=[a.trim(),Date.now()]),i||(e=t.tokenize_mentions(e));for(var r=0;r<e.length;r++){var d=e[r];if(!_.isString(d)&&d.mentionedUser&&!d.own){this.set("msgObject.ffz_has_mention",!0);break}}var u=performance.now();u-o>5&&t.log("Tokenizing Message Took Too Long - "+(u-o)+"ms",e,!1,!0)}catch(c){try{t.error("LineController tokenizedMessage: "+c)}catch(c){}}return this.set("msgObject.cachedTokens",e),e}.property("msgObject.message","isChannelLinksDisabled","currentUserNick","msgObject.from","msgObject.tags.emotes"),ffzUpdated:Ember.observer("msgObject.ffz_deleted","msgObject.ffz_old_messages",function(){this.rerender()}),willClearRender:function(){try{this.$("a.mod-icon").tipsy("disable"),jQuery("body > .tipsy:last").remove()}catch(e){t.error("LineView willClearRender: "+e)}this._super()},didInsertElement:function(){this._super();try{var e=performance.now(),n=this.get("element"),i=this.get("msgObject.from"),a=this.get("msgObject.room")||App.__container__.lookup("controller:chat").get("currentRoom.id"),r=this.get("msgObject.color"),d=this.get("msgObject.ffz_alternate");r&&t._handle_color(r),void 0===d&&(d=t._last_row[a]=t._last_row.hasOwnProperty(a)?!t._last_row[a]:!1,this.set("msgObject.ffz_alternate",d)),n.classList.toggle("ffz-alternate",d||!1),n.classList.toggle("ffz-deleted",t.settings.prevent_clear&&this.get("msgObject.ffz_deleted")||!1),n.setAttribute("data-room",a),n.setAttribute("data-sender",i),n.setAttribute("data-deleted",this.get("msgObject.deleted")||!1);var u=this.get("msgObject.ffz_old_messages");if(u&&u.length){var c=document.createElement("div");c.className="button primary float-right",c.innerHTML="Show "+o.number_commas(u.length)+" Old",c.addEventListener("click",t._show_deleted.bind(t,a)),n.classList.add("clearfix"),n.classList.add("ffz-has-deleted"),this.$(".message").append(c)}t.render_badge(this),this.get("msgObject.ffz_has_mention")&&n.classList.add("ffz-mentioned");for(var l=n.querySelectorAll("span.message a.deleted-link"),h=0;h<l.length;h++)l[h].addEventListener("click",t._deleted_link_click);if(t.settings.link_info){for(var f=n.querySelectorAll("span.message a"),h=0;h<f.length;h++){var _=f[h],m=_.href,p=!1;_.classList.contains("deleted-link")&&(m=_.getAttribute("data-url"),p=!0);var g=t._link_data[m];g?(p||"boolean"==typeof g||(_.title=g.tooltip),g.unsafe&&_.classList.add("unsafe-link")):/^mailto:/.test(m)||(t._link_data[m]=!0,t.ws_send("get_link",m,load_link_data.bind(t,m)))}jQuery(f).tipsy({html:!0})}for(var v=n.querySelectorAll("span.message img.emoticon"),h=0;h<v.length;h++){var b=v[h],y=(b.alt,s.src_to_id(b.src));if(null!==y){b.setAttribute("srcset",build_srcset(y)),b.setAttribute("emote-id",y);var w=t._twitch_emotes[y];w?"string"!=typeof w&&(b.title=w.tooltip):(t._twitch_emotes[y]=b.alt,t.ws_send("twitch_emote",y,load_emote_data.bind(t,y,b.alt)))}else if(b.getAttribute("data-ffz-emoji")){var z=b.getAttribute("data-ffz-emoji"),k=t.emoji_data&&t.emoji_data[z];k&&(b.setAttribute("srcset",k.srcSet),b.title="Emoji: "+b.alt+"\nName: :"+k.short_name+":")}else if(b.getAttribute("data-ffz-emote")){var k=JSON.parse(decodeURIComponent(b.getAttribute("data-ffz-emote"))),y=k&&k[0]||null,E=k&&k[1]||null,C=t.emote_sets[E],T=C?C.emoticons[y]:null;T&&T.srcSet&&b.setAttribute("srcset",T.srcSet),C&&t.feature_friday&&C.id==t.feature_friday.set&&(set_name=t.feature_friday.title+" - "+t.feature_friday.display_name),b.title=t._emote_tooltip(T)}}jQuery(v).tipsy();var x=performance.now()-e;x>5&&t.log("Line Took Too Long - "+x+"ms",n.innerHTML,!1,!0)}catch(F){try{t.error("LineView didInsertElement: "+F)}catch(F){}}}})},s.prototype._handle_color=function(e){if(e&&!this._colors[e]){this._colors[e]=!0;var t=parseInt(e.substr(1),16),s=[t>>16,t>>8&255,255&t],n=o.get_luminance(s),i="",a='span[style="color:'+e+'"]',r=!1;if(n>.3){r=!0;for(var d=127,u=s;d--&&(u=o.darken(u),!(o.get_luminance(u)<=.3)););i+=".ffz-chat-colors .ember-chat-container:not(.dark) .chat-line "+a+", .ffz-chat-colors .chat-container:not(.dark) .chat-line "+a+" { color: "+o.rgb_to_css(u)+" !important; }\n"}else i+=".ffz-chat-colors .ember-chat-container:not(.dark) .chat-line "+a+", .ffz-chat-colors .chat-container:not(.dark) .chat-line "+a+" { color: "+e+" !important; }\n";if(.15>n){r=!0;for(var d=127,u=s;d--&&(u=o.brighten(u),!(o.get_luminance(u)>=.15)););i+=".ffz-chat-colors .theatre .chat-container .chat-line "+a+", .ffz-chat-colors .chat-container.dark .chat-line "+a+", .ffz-chat-colors .ember-chat-container.dark .chat-line "+a+" { color: "+o.rgb_to_css(u)+" !important; }\n"}else i+=".ffz-chat-colors .theatre .chat-container .chat-line "+a+", .ffz-chat-colors .chat-container.dark .chat-line "+a+", .ffz-chat-colors .ember-chat-container.dark .chat-line "+a+" { color: "+e+" !important; }\n";
|
||
r&&(this._fix_color_style.innerHTML+=i)}},s.capitalization={},s._cap_fetching=0,s.get_capitalization=function(e,t){if(!e)return e;if(e=e.toLowerCase(),"jtv"==e||"twitchnotify"==e)return e;var o=s.capitalization[e];return o&&Date.now()-o[1]<36e5?o[0]:(s._cap_fetching<25&&(s._cap_fetching++,s.get().ws_send("get_display_name",e,function(o,n){var i=o?n:e;s.capitalization[e]=[i,Date.now()],s._cap_fetching--,"function"==typeof t&&t(i)})),o?o[0]:e)},s.prototype._remove_banned=function(e){var t=this.settings.banned_words;if(!t||!t.length)return e;"string"==typeof e&&(e=[e]);for(var o=s._words_to_regex(t),n=[],i=0;i<e.length;i++){var r=e[i];n.push(_.isString(r)?r.replace(o,"$1***"):r.emoticonSrc&&o.test(r.altText)?r.altText.replace(o,"$1***"):r.isLink&&o.test(r.href)?{mentionedUser:'</span><a class="deleted-link" title="'+a(r.href.replace(o,"$1***"))+'" data-url="'+a(r.href)+'" href="#"><banned link></a><span class="mentioning">',own:!0}:r)}return n},s.prototype._emoticonize=function(e,t){var s=e.get("msgObject.room"),o=e.get("msgObject.from");return this.tokenize_emotes(o,s,t)}},{"../utils":31}],9:[function(t){var s,o=e.FrankerFaceZ,n=t("../utils"),i={ESC:27,P:80,B:66,T:84,U:85},a='<svg class="svg-messages" height="16px" version="1.1" viewBox="0 0 18 18" width="16px" x="0px" y="0px"><path clip-rule="evenodd" d="M1,15V3h16v12H1z M15.354,5.354l-0.707-0.707L9,10.293L3.354,4.646L2.646,5.354L6.293,9l-3.646,3.646l0.707,0.707L7,9.707l1.646,1.646h0.707L11,9.707l3.646,3.646l0.707-0.707L11.707,9L15.354,5.354z" fill-rule="evenodd"></path></svg>',r='<svg class="svg-unban" height="16px" version="1.1" viewBox="0 0 16 16" width="16px" x="0px" y="0px"><path fill-rule="evenodd" clip-rule="evenodd" fill="#888888" d="M6.5,12.75L2,8.25l2-2l2.5,2.5l5.5-5.5l2,2L6.5,12.75z"/></svg>',d={},u=function(e){if(1===e)return"Purge";if(d[e])return d[e];var t,s,o,n,i;t=Math.floor(e/604800),i=e%604800,s=Math.floor(i/86400),i%=86400,o=Math.floor(i/3600),i%=3600,n=Math.floor(i/60),i%=60;var a=d[e]=(t?t+"w":"")+(s||t&&(o||n||i)?s+"d":"")+(o||(t||s)&&(n||i)?o+"h":"")+(n||(t||s||o)&&i?n+"m":"")+(i?i+"s":"");return a};try{s=e.require&&e.require("ember-twitch-chat/helpers/chat-line-helpers")}catch(c){}o.settings_info.chat_hover_pause={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Pause Chat Scrolling on Mouse Hover",help:"Automatically prevent the chat from scrolling when moving the mouse over it to prevent moderation mistakes and link mis-clicks.",on_update:function(e){this._roomv&&(e?this._roomv.ffzEnableFreeze():this._roomv.ffzDisableFreeze())}},o.settings_info.short_commands={type:"boolean",value:!0,no_bttv:!0,category:"Chat Moderation",name:"Short Moderation Commands",help:"Use /t, /b, and /u in chat in place of /timeout, /ban, /unban for quicker moderation, and use /p for 1 second timeouts."},o.settings_info.mod_card_hotkeys={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Moderation Card Hotkeys",help:"With a moderation card selected, press B to ban the user, T to time them out for 10 minutes, P to time them out for 1 second, or U to unban them. ESC closes the card."},o.settings_info.mod_card_history={type:"boolean",value:!1,no_bttv:!0,category:"Chat Moderation",name:"Moderation Card History",help:"Display a few of the user's previously sent messages on moderation cards.",on_update:function(e){if(!e&&this.rooms)for(var t in this.rooms){var s=this.rooms[t];s&&(s.user_history=void 0)}}},o.settings_info.mod_card_durations={type:"button",value:[300,600,3600,43200,86400,604800],category:"Chat Moderation",no_bttv:!0,name:"Moderation Card Timeout Buttons",help:"Add additional timeout buttons to moderation cards with specific durations.",method:function(){var e=this.settings.mod_card_durations.join(", "),t=prompt('Moderation Card Timeout Buttons\n\nPlease enter a comma-separated list of durations that you would like to have timeout buttons for. Durations must be expressed in seconds.\n\nEnter "reset" without quotes to return to the default value.',e);if(null!==t&&void 0!==t){"reset"===t&&(t=o.settings_info.mod_card_durations.value.join(", ")),t=t.trim().split(/[ ,]+/);for(var s=[],n=0;n<t.length;n++){var i=parseInt(t[n]);0===i&&(i=1),0/0!==i&&i>0&&s.push(i)}this.settings.set("mod_card_durations",s)}}},o.prototype.setup_mod_card=function(){this.log("Modifying Mousetrap stopCallback so we can catch ESC.");var t=Mousetrap.stopCallback;Mousetrap.stopCallback=function(e,s,o){return s.classList.contains("no-mousetrap")?!0:t(e,s,o)},Mousetrap.bind("up up down down left right left right b a enter",function(){var e=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");e&&e.classList.toggle("ffz-flip")}),this.log("Hooking the Ember Moderation Card view.");var o=App.__container__.resolve("component:moderation-card"),d=this;o.reopen({ffzForceRedraw:function(){this.rerender()}.observes("cardInfo.isModeratorOrHigher","cardInfo.user"),didInsertElement:function(){this._super(),e._card=this;try{if(d.has_bttv)return;var t=this.get("element"),o=this.get("controller");if((d.settings.mod_card_hotkeys||d.settings.mod_card_durations&&d.settings.mod_card_durations.length)&&t.classList.add("ffz-moderation-card"),o.get("cardInfo.isModeratorOrHigher")){t.classList.add("ffz-is-mod"),t.setAttribute("tabindex",1),d.settings.mod_card_hotkeys&&(t.classList.add("no-mousetrap"),t.addEventListener("keyup",function(e){var t=e.keyCode||e.which,s=o.get("cardInfo.user.id"),n=App.__container__.lookup("controller:chat").get("currentRoom");if(t==i.P)n.send("/timeout "+s+" 1");else if(t==i.B)n.send("/ban "+s);else if(t==i.T)n.send("/timeout "+s+" 600");else if(t==i.U)n.send("/unban "+s);else if(t!=i.ESC)return;o.send("close")}));var c=function(e){var t=o.get("cardInfo.user.id"),s=App.__container__.lookup("controller:chat").get("currentRoom");s.send(-1===e?"/unban "+t:"/timeout "+t+" "+e)},l=function(e){var t=document.createElement("button");return t.className="button",t.innerHTML=u(e),t.title="Timeout User for "+n.number_commas(e)+" Second"+(1!=e?"s":""),d.settings.mod_card_hotkeys&&600===e?t.title="(T)"+t.title.substr(1):d.settings.mod_card_hotkeys&&1===e&&(t.title="(P)urge - "+t.title),jQuery(t).tipsy(),t.addEventListener("click",c.bind(this,e)),t};if(d.settings.mod_card_durations&&d.settings.mod_card_durations.length){var h=document.createElement("div");h.className="interface clearfix",h.appendChild(l(1));var f=document.createElement("span");f.className="right",h.appendChild(f);for(var _=0;_<d.settings.mod_card_durations.length;_++)f.appendChild(l(d.settings.mod_card_durations[_]));t.appendChild(h),this.$("button.timeout").remove()}var m=t.querySelector("button.ban");d.settings.mod_card_hotkeys&&m.setAttribute("title","(B)an User");var p=document.createElement("button");p.className="unban button glyph-only light",p.innerHTML=r,p.title=(d.settings.mod_card_hotkeys?"(U)":"U")+"nban User",jQuery(p).tipsy(),p.addEventListener("click",c.bind(this,-1)),jQuery(m).after(p)}var g=t.querySelector("button.mod");if(g){var v=o.get("cardInfo.isChannelOwner"),b=ffz.get_user();can_op=v||b&&b.is_admin||b&&b.is_staff,can_op||g.parentElement.removeChild(g)}var y=t.querySelector(".interface > button");if(y&&y.classList.contains("message-button")&&(y.innerHTML=a,y.classList.add("glyph-only"),y.classList.add("message"),y.title="Whisper User",jQuery(y).tipsy()),d.settings.mod_card_history){var w=App.__container__.lookup("controller:chat"),z=w&&w.get("currentRoom"),k=z&&d.rooms&&d.rooms[z.get("id")],E=k&&k.user_history&&k.user_history[o.get("cardInfo.user.id")];if(E&&E.length){var C=document.createElement("ul"),T=!1;C.className="interface clearfix chat-history";for(var _=0;_<E.length;_++){var h=E[_],x=document.createElement("li");x.className="message-line chat-line",x.classList.toggle("ffz-alternate",T),T=!T,h.style&&x.classList.add(h.style),x.innerHTML=(s?'<span class="timestamp float-left">'+s.getTime(h.date)+"</span> ":"")+'<span class="message">'+("action"===h.style?"*"+h.from+" ":"")+d.render_tokens(h.cachedTokens)+"</span>";for(var F=x.querySelectorAll("a.deleted-link"),S=0;S<F.length;S++)F[S].addEventListener("click",d._deleted_link_click);jQuery("a",x).tipsy({html:!0}),C.appendChild(x)}t.appendChild(C),C.scrollTop=C.scrollHeight}}var L=t.getBoundingClientRect(),A=document.body.getBoundingClientRect();if(L.bottom>A.bottom){var M=L.bottom-A.bottom;L.top-M>A.top&&(t.style.top=L.top-M+"px")}this.$().draggable({start:function(){t.focus()}}),t.focus()}catch(R){try{d.error("ModerationCardView didInsertElement: "+R)}catch(R){}}}})},o.chat_commands.purge=function(e,t){if(!t||!t.length)return"Purge Usage: /p username [more usernames separated by spaces]";if(t.length>10)return"Please only purge up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/timeout "+o+" 1")}},o.chat_commands.p=function(e,t){return o.chat_commands.purge.bind(this)(e,t)},o.chat_commands.p.enabled=function(){return this.settings.short_commands},o.chat_commands.t=function(e,t){return t&&t.length?void e.room.send("/timeout "+t.join(" ")):"Timeout Usage: /t username [duration]"},o.chat_commands.t.enabled=function(){return this.settings.short_commands},o.chat_commands.b=function(e,t){if(!t||!t.length)return"Ban Usage: /b username [more usernames separated by spaces]";if(t.length>10)return"Please only ban up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/ban "+o)}},o.chat_commands.b.enabled=function(){return this.settings.short_commands},o.chat_commands.u=function(e,t){if(!t||!t.length)return"Unban Usage: /u username [more usernames separated by spaces]";if(t.length>10)return"Please only unban up to 10 users at once.";for(var s=0;s<t.length;s++){var o=t[s];o&&e.room.send("/unban "+o)}},o.chat_commands.u.enabled=function(){return this.settings.short_commands}},{"../utils":31}],10:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils"),i=function(e){return e.moderator_badge?'.chat-line[data-room="'+e.id+'"] .badges .moderator:not(.ffz-badge-replacement) { background-image:url("'+e.moderator_badge+'") !important; }':""};s.prototype.setup_room=function(){this.rooms={},this.log("Creating room style element.");var e=this._room_style=document.createElement("style");e.id="ffz-room-css",document.head.appendChild(e),this.log("Hooking the Ember Room controller.");var t=App.__container__.lookup("controller:room");if(t){var s=t._actions.banUser,o=t._actions.timeoutUser;t._actions.banUser=function(e){s.bind(this)(e),this.get("model").clearMessages(e.user)},t._actions.timeoutUser=function(e){o.bind(this)(e),this.get("model").clearMessages(e.user)},t._actions.purgeUser=function(e){this.get("model.tmiRoom").sendMessage("/timeout "+e.user+" 1"),this.get("model").clearMessages(e.user)}}this.log("Hooking the Ember Room model.");var n=App.__container__.resolve("model:room");this._modify_room(n);var i=n.instances;for(var a in i)if(i.hasOwnProperty(a)){var r=i[a];this.add_room(r.id,r),this._modify_room(r),r.ffzPatchTMI()}this.log("Hooking the Ember Room view.");var d=App.__container__.resolve("view:room");this._modify_rview(d);try{d.create().destroy()}catch(u){}for(var a in Ember.View.views)if(Ember.View.views.hasOwnProperty(a)){var c=Ember.View.views[a];if(c instanceof d){this.log("Manually updating existing Room view.",c);try{c.ffzInit()}catch(u){this.error("RoomView setup ffzInit: "+u)}}}},s.prototype._modify_rview=function(e){var t=this;e.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(e){t.error("RoomView didInsertElement: "+e)}},willClearRender:function(){try{this.ffzTeardown()}catch(e){t.error("RoomView willClearRender: "+e)}this._super()},ffzInit:function(){t._roomv=this,this.ffz_frozen=!1,t.settings.chat_hover_pause&&this.ffzEnableFreeze(),t.settings.room_status&&this.ffzUpdateStatus();var e=this.get("controller");e&&(e.reopen({submitButtonText:function(){if(this.get("model.isWhisperMessage")&&this.get("model.isWhispersEnabled"))return i18n("Whisper");var e=this.get("model.slowWait"),s=this.get("model.messageToSend")||"";return"/"===s.charAt(0)&&"/me "!==s.substr(0,4)||!e||!t.settings.room_status?i18n("Chat"):n.time_to_string(e,!1,!1,!0)}.property("model.isWhisperMessage","model.isWhispersEnabled","model.slowWait")}),Ember.propertyDidChange(e,"submitButtonText"))},ffzTeardown:function(){t._roomv===this&&(t._roomv=void 0),this.ffzDisableFreeze()},ffzUpdateStatus:function(){var e=this.get("controller.model"),s=this.get("element"),o=s&&s.querySelector(".chat-buttons-container");if(!o)return t.log("no container");var i=o.querySelector("#ffz-stat-r9k"),a=o.querySelector("#ffz-stat-sub"),r=o.querySelector("#ffz-stat-slow"),d=o.querySelector("#ffz-stat-banned"),u=o.querySelector("button");return t.has_bttv||!t.settings.room_status?(i&&i.parentElement.removeChild(i),a&&a.parentElement.removeChild(a),r&&r.parentElement.removeChild(r),void(u&&u.classList.remove("ffz-waiting"))):(i||(i=document.createElement("span"),i.className="ffz room-state stat float-right",i.id="ffz-stat-r9k",i.innerHTML="R9K",i.title="This room is in R9K-mode.",o.appendChild(i),jQuery(i).tipsy({gravity:"s",offset:15})),a||(a=document.createElement("span"),a.className="ffz room-state stat float-right",a.id="ffz-stat-sub",a.innerHTML="SUB",a.title="This room is in subscribers-only mode.",o.appendChild(a),jQuery(a).tipsy({gravity:"s",offset:15})),r||(r=document.createElement("span"),r.className="ffz room-state stat float-right",r.id="ffz-stat-slow",r.innerHTML="SLOW",r.title="This room is in slow mode. You may send messages every 120 seconds.",o.appendChild(r),jQuery(r).tipsy({gravity:"s",offset:15})),d||(d=document.createElement("span"),d.className="ffz room-state stat float-right",d.id="ffz-stat-banned",d.innerHTML="BAN",d.title="You have been banned from talking in this room.",o.appendChild(d),jQuery(d).tipsy({gravity:"s",offset:15})),i.classList.toggle("hidden",!(e&&e.get("r9kMode"))),a.classList.toggle("hidden",!(e&&e.get("subsOnlyMode"))),r.classList.toggle("hidden",!(e&&e.get("slowMode"))),r.title="This room is in slow mode. You may send messages every "+n.number_commas(e&&e.get("slowValue")||120)+" seconds.",d.classList.toggle("hidden",!(e&&e.get("ffz_banned"))),void(u&&(u.classList.toggle("ffz-waiting",e&&e.get("slowWait")||0),u.classList.toggle("ffz-banned",e&&e.get("ffz_banned")))))}.observes("controller.model"),ffzEnableFreeze:function(){var e=this.get("element"),t=e.querySelector(".chat-messages");t&&(this._ffz_interval=setInterval(this.ffzPulse.bind(this),200),this._ffz_messages=t,this._ffz_mouse_move=this.ffzMouseMove.bind(this),this._ffz_mouse_out=this.ffzMouseOut.bind(this),t.addEventListener("mousemove",this._ffz_mouse_move),t.addEventListener("mouseout",this._ffz_mouse_out),document.addEventListener("mouseout",this._ffz_mouse_out))},ffzDisableFreeze:function(){this._ffz_interval&&(clearInterval(this._ffz_interval),this._ffz_interval=void 0),this.ffzUnfreeze();var e=this._ffz_messages;e&&(this._ffz_messages=void 0,this._ffz_mouse_move&&(e.removeEventListener("mousemove",this._ffz_mouse_move),this._ffz_mouse_move=void 0),this._ffz_mouse_out&&(e.removeEventListener("mouseout",this._ffz_mouse_out),this._ffz_mouse_out=void 0))},ffzPulse:function(){if(this.ffz_frozen){var e=Date.now()-this._ffz_last_move;e>750&&this.ffzUnfreeze()}},ffzUnfreeze:function(){this.ffz_frozen=!1,this._ffz_last_move=0,this.ffzUnwarnPaused(),this.get("stuckToBottom")&&this._scrollToBottom()},ffzMouseOut:function(){this._ffz_outside=!0;var e=this;setTimeout(function(){e._ffz_outside&&e.ffzUnfreeze()},25)},ffzMouseMove:function(e){this._ffz_last_move=Date.now(),this._ffz_outside=!1,(e.screenX!==this._ffz_last_screenx||e.screenY!==this._ffz_last_screeny)&&(this._ffz_last_screenx=e.screenX,this._ffz_last_screeny=e.screenY,this.ffz_frozen||e.clientY>=this._ffz_messages.getBoundingClientRect().bottom-21||(this.ffz_frozen=!0,this.get("stuckToBottom")&&(this.set("controller.model.messageBufferSize",t.settings.scrollback_length+150),this.ffzWarnPaused())))},_scrollToBottom:_.throttle(function(){var e=this,t=this._$chatMessagesScroller;Ember.run.next(function(){setTimeout(function(){!e.ffz_frozen&&t&&t.length&&(t.scrollTop(t[0].scrollHeight),e._setStuckToBottom(!0))})})},200),_setStuckToBottom:function(e){this.set("stuckToBottom",e),this.get("controller.model")&&this.set("controller.model.messageBufferSize",t.settings.scrollback_length+(e?0:150))},ffzWarnPaused:function(){var e=this.get("element"),t=e&&e.querySelector(".chat-interface .more-messages-indicator.ffz-freeze-indicator");if(e){if(!t){t=document.createElement("div"),t.className="more-messages-indicator ffz-freeze-indicator",t.innerHTML="(Chat Paused Due to Mouse Movement)";var s=e.querySelector(".chat-interface");if(!s)return;s.insertBefore(t,s.childNodes[0])}t.classList.remove("hidden")}},ffzUnwarnPaused:function(){var e=this.get("element"),t=e&&e.querySelector(".chat-interface .more-messages-indicator.ffz-freeze-indicator");t&&t.classList.add("hidden")}})},s.chat_commands={},s.ffz_commands={},s.prototype.room_message=function(e,t){var s=t.split("\n");if(this.has_bttv)for(var o=0;o<s.length;o++)BetterTTV.chat.handlers.onPrivmsg(e.id,{style:"admin",date:new Date,from:"jtv",message:s[o]});else for(var o=0;o<s.length;o++)e.room.addMessage({style:"ffz admin",date:new Date,from:"FFZ",message:s[o]})},s.prototype.run_command=function(e,t){var o=this.rooms[t];if(!o||!o.room)return!1;if(e){var n,i=e.split(" "),a=i.shift().substr(1).toLowerCase(),r=s.chat_commands[a];if(!r)return!1;if(r.hasOwnProperty("enabled")){var d=r.enabled;if("function"==typeof d)try{d=r.enabled.bind(this)(o,i)}catch(u){this.error('command "'+a+'" enabled: '+u),d=!1}if(!d)return!1}this.log("Received Command: "+a,i,!0);try{n=r.bind(this)(o,i)}catch(u){this.error('command "'+a+'" runner: '+u),n="There was an error running the command."}return n&&this.room_message(o,n),!0}},s.prototype.run_ffz_command=function(e,t){var o=this.rooms[t];if(o&&o.room){if(!e){var n=document.querySelector("a.ffz-ui-toggle");if(n)return n.click();e="help"}var i=e.split(" "),a=i.shift().toLowerCase();this.log("Received Command: "+a,i,!0);var r,d=s.ffz_commands[a];if(d)try{r=d.bind(this)(o,i)}catch(u){this.log("Error Running Command - "+a+": "+u,o),r="There was an error running the command."}else r='There is no "'+a+'" command.';r&&this.room_message(o,r)}},s.ffz_commands.help=function(e,t){if(t&&t.length){var o=s.ffz_commands[t[0].toLowerCase()];return o?o.help?o.help:'No help is available for the command "'+t[0]+'".':'There is no "'+t[0]+'" command.'}var n=[];for(var i in s.ffz_commands)s.ffz_commands.hasOwnProperty(i)&&n.push(i);return"The available commands are: "+n.join(", ")},s.ffz_commands.help.help="Usage: /ffz help [command]\nList available commands, or show help for a specific command.",s.prototype.add_room=function(e,t){if(this.rooms[e])return this.log("Tried to add existing room: "+e);this.log("Adding Room: "+e);var s=this.rooms[e]={id:e,room:t,menu_sets:[],sets:[],css:null,needs_history:!1};if(this.follow_sets&&this.follow_sets[e]){s.extra_sets=this.follow_sets[e],delete this.follow_sets[e];for(var o=0;o<s.extra_sets.length;o++){var n=s.extra_sets[o],i=this.emote_sets&&this.emote_sets[n];i?-1===i.users.indexOf(e)&&i.users.push(e):this.load_set(n,function(t,s){t&&s.users.push(e)})}}this.ws_send("sub",e),!this.has_bttv&&this.settings.chat_history&&t&&(t.get("messages.length")||0)<10&&(this.ws_send("chat_history",[e,25],this._load_history.bind(this,e))||(s.needs_history=!0)),t.set("messageBufferSize",this.settings.scrollback_length+(this._roomv&&!this._roomv.get("stuckToBottom")&&this._roomv.get("controller.model.id")===e?150:0)),this.load_room(e)},s.prototype.remove_room=function(e){var t=this.rooms[e];if(t&&(this.log("Removing Room: "+e),(t.css||t.moderator_badge)&&n.update_css(this._room_style,e,null),this.ws_send("unsub",e),delete this.rooms[e],"_"!==e.charAt(0))){var s=this.emote_sets[t.set];s&&(s.users.removeObject(e),this.global_sets.contains(t.set)||s.users.length||this.unload_set(t.set))}},s.prototype._load_history=function(e,t,s){var o=this.rooms[e];if(o&&o.room){if(!t)return this.log("Error retrieving chat history for: "+e);if(this.log("Received "+s.length+" old messages for: "+e),s.length)return this._insert_history(e,s)}},s.prototype._show_deleted=function(e){var t=this.rooms[e];if(t&&t.room){var s=t.room.get("messages.0.ffz_old_messages");s&&s.length&&(t.room.set("messages.0.ffz_old_messages",void 0),this._insert_history(e,s))}},s.prototype._insert_history=function(e,t){var s=this.rooms[e];if(s&&s.room){var o=s.room,i=o.get("messages"),a=o.tmiSession||TMI._sessions&&TMI._sessions[0],r=(o.tmiRoom,0),d=t[t.length-1],u=new Date,c="string"==typeof d.date?n.parse_date(d.date):d.date,l=(u-c)/1e3,h=l>300,f=t.length,_=o.get("messages.0.ffz_alternate")||!1;h&&(_=!_);for(var f=t.length;f--;){var m=t[f];if("string"==typeof m.date&&(m.date=n.parse_date(m.date)),m.ffz_alternate=_=!_,m.room||(m.room=e),m.color||(m.color=m.tags&&m.tags.color?m.tags.color:a&&m.from?a.getColor(m.from.toLowerCase()):"#755000"),!m.labels||!m.labels.length){var p=m.labels=[];if(m.tags)if(m.tags.turbo&&p.push("turbo"),m.tags.subscriber&&p.push("subscriber"),m.from===e)p.push("owner");else{var g=m.tags["user-type"];("mod"===g||"staff"===g||"admin"===g||"global_mod"===g)&&p.push(g)}}if(m.style||("jtv"===m.from?m.style="admin":"twitchnotify"===m.from&&(m.style="notification")),m.cachedTokens&&m.cachedTokens.length||this.tokenize_chat_line(m,!0),o.shouldShowMessage(m)){if(!(i.length<o.get("messageBufferSize")))break;if(m.ffz_old_messages){var v=o.get("messageBufferSize")-(i.length+1);m.ffz_old_messages.length>v&&(m.ffz_old_messages=m.ffz_old_messages.slice(m.ffz_old_messages.length-v))}i.unshiftObject(m),r+=1}}if(h){var m={ffz_alternate:!_,color:"#755000",date:new Date,from:"frankerfacez_admin",style:"admin",message:"(Last message is "+n.human_time(l)+" old.)",room:e};if(this.tokenize_chat_line(m),o.shouldShowMessage(m))for(i.insertAt(r,m);i.length>o.get("messageBufferSize");)i.removeAt(0)}}},s.prototype.load_room=function(e,t,s){var n=this;jQuery.getJSON(o.API_SERVER+"v1/room/"+e).done(function(s){if(s.sets)for(var o in s.sets)s.sets.hasOwnProperty(o)&&n._load_set_json(o,void 0,s.sets[o]);n._load_room_json(e,t,s)}).fail(function(o){return 404==o.status?"function"==typeof t&&t(!1):(s=(s||0)+1,10>s?n.load_room(e,t,s):"function"==typeof t&&t(!1))})},s.prototype._load_room_json=function(e,t,s){if(!s||!s.room)return"function"==typeof t&&t(!1);s=s.room,this.rooms[e]&&(s.room=this.rooms[e].room);for(var o in this.rooms[e])"room"!==o&&this.rooms[e].hasOwnProperty(o)&&!s.hasOwnProperty(o)&&(s[o]=this.rooms[e][o]);s.needs_history=this.rooms[e]&&this.rooms[e].needs_history||!1,this.rooms[e]=s,(s.css||s.moderator_badge)&&n.update_css(this._room_style,e,i(s)+(s.css||"")),this.emote_sets.hasOwnProperty(s.set)?-1===this.emote_sets[s.set].users.indexOf(e)&&this.emote_sets[s.set].users.push(e):this.load_set(s.set,function(t,s){-1===s.users.indexOf(e)&&s.users.push(e)}),this.update_ui_link(),t&&t(!0,s)},s.prototype._modify_room=function(t){var s=this;t.reopen({subsOnlyMode:!1,r9kMode:!1,slowWaiting:!1,slowValue:0,mru_list:[],updateWait:function(e,t){var o=this.get("slowWait")||0;this.set("slowWait",e),1>o&&e>0?(setTimeout(this.ffzUpdateWait.bind(this),1e3),s._roomv&&s._roomv.ffzUpdateStatus()):(o>0&&1>e||t)&&(this.set("ffz_banned",!1),s._roomv&&s._roomv.ffzUpdateStatus())},ffzUpdateWait:function(){var e=this.get("slowWait")||0;1>e||(this.set("slowWait",--e),e>0?setTimeout(this.ffzUpdateWait.bind(this),1e3):(this.set("ffz_banned",!1),s._roomv&&s._roomv.ffzUpdateStatus()))},ffzUpdateStatus:function(){s._roomv&&s._roomv.ffzUpdateStatus()}.observes("r9kMode","subsOnlyMode","slowMode","slowValue","ffz_banned"),init:function(){this._super();try{s.add_room(this.id,this),this.set("ffz_chatters",{})}catch(e){s.error("add_room: "+e)}},willDestroy:function(){this._super();try{s.remove_room(this.id)}catch(e){s.error("remove_room: "+e)}},clearMessages:function(e){var t=this;if(e){if(this.get("messages").forEach(function(o,n){o.from===e&&(t.set("messages."+n+".ffz_deleted",!0),s.settings.prevent_clear||t.set("messages."+n+".deleted",!0))}),s.settings.mod_card_history){var o=s.rooms&&s.rooms[t.get("id")],n=o&&o.user_history&&o.user_history[e];if(null!==n&&void 0!==n){var i=!1,a=n.length>0?n[n.length-1]:null;if(i=null!==a&&a.is_delete,!i)for(n.push({from:"jtv",is_delete:!0,style:"admin",cachedTokens:["User has been timed out."],date:new Date});n.length>20;)n.shift()}}}else if(s.settings.prevent_clear)this.addTmiMessage("A moderator's attempt to clear chat was ignored.");else{var r=t.get("messages");t.set("messages",[]),t.addMessage({style:"admin",message:i18n("Chat was cleared by a moderator"),ffz_old_messages:r})}},pushMessage:function(e){if(this.shouldShowMessage(e)){var t,s,o,n=this.get("messageBufferSize");for(this.get("messages").pushObject(e),t=this.get("messages.length"),s=t-n,o=0;s>o;o++)this.get("messages").removeAt(0);"admin"===e.style||"whisper"===e.style&&!this.ffz_whisper_room||this.incrementProperty("unreadCount",1)}},addMessage:function(e){try{if(e){var t="whisper"===e.style;if(s.settings.group_tabs&&s.settings.whisper_room&&(t&&!this.ffz_whisper_room||!t&&this.ffz_whisper_room))return;if(t||(e.room=this.get("id")),s.tokenize_chat_line(e),!t&&e.from&&"jtv"!==e.from&&"twitchnotify"!==e.from&&s.settings.mod_card_history){var o=s.rooms&&s.rooms[e.room];if(o){var n=(o.user_history=o.user_history||{},o.user_history[e.from]=o.user_history[e.from]||[]);for(n.push({from:e.tags&&e.tags["display-name"]||e.from,cachedTokens:e.cachedTokens,style:e.style,date:e.date});n.length>20;)n.shift()}}if(!t){var i=s.get_user();if(i&&i.login===e.from){var a=this.get("ffz_banned");this.set("ffz_banned",!1),this.get("isModeratorOrHigher")||!this.get("slowMode")?this.updateWait(0,a):this.get("slowMode")&&this.updateWait(this.get("slowValue"))}}}}catch(r){s.error("Room addMessage: "+r)}return this._super(e)},setHostMode:function(e){var t=App.__container__.lookup("controller:chat");if(t&&t.get("currentChannelRoom")===this)return this._super(e)},send:function(e){if(!(s.settings.group_tabs&&s.settings.whisper_room&&this.ffz_whisper_room)){try{if(e){var t=this.get("mru_list"),o=t.indexOf(e);-1!==o?t.splice(o,1):t.length>20&&t.pop(),t.unshift(e)}var n=e.split(" ",1)[0].toLowerCase();if("/ffz"===n)return this.set("messageToSend",""),void s.run_ffz_command(e.substr(5),this.get("id"));if("/"===n.charAt(0)&&s.run_command(e,this.get("id")))return void this.set("messageToSend","")}catch(i){s.error("send: "+i)}return this._super(e)}},ffzUpdateUnread:function(){if(s.settings.group_tabs){var e=App.__container__.lookup("controller:chat");e&&e.get("currentRoom")===this?this.resetUnreadCount():s._chatv&&s._chatv.ffzTabUnread(this.get("id"))}}.observes("unreadCount"),ffzInitChatterCount:function(){if(this.tmiRoom){var e=this;this.tmiRoom.list().done(function(t){var s={};t=t.data.chatters;for(var o=0;o<t.admins.length;o++)s[t.admins[o]]=!0;for(var o=0;o<t.global_mods.length;o++)s[t.global_mods[o]]=!0;for(var o=0;o<t.moderators.length;o++)s[t.moderators[o]]=!0;for(var o=0;o<t.staff.length;o++)s[t.staff[o]]=!0;for(var o=0;o<t.viewers.length;o++)s[t.viewers[o]]=!0;e.set("ffz_chatters",s),e.ffzUpdateChatters()})}},ffzUpdateChatters:function(t,o){var n=this.get("ffz_chatters")||{};if(t&&(n[t]=!0),o&&n[o]&&delete n[o],s.settings.chatter_count){s._cindex&&s._cindex.ffzUpdateChatters();try{e.parent&&e.parent.postMessage&&e.parent.postMessage({from_ffz:!0,command:"chatter_count",message:Object.keys(this.get("ffz_chatters")||{}).length},"http://www.twitch.tv/")}catch(i){}}},ffzPatchTMI:function(){if(!this.get("ffz_is_patched")&&this.get("tmiRoom")){s.settings.chatter_count&&this.ffzInitChatterCount();var e=this.get("tmiRoom"),t=this,o=e._roomConn._connection;o.ffz_cap_patched||(o.ffz_cap_patched=!0,o._send("CAP REQ :twitch.tv/membership"),o.on("opened",function(){this._send("CAP REQ :twitch.tv/membership")},o)),e.on("notice",function(e){if("msg_slowmode"===e.msgId){var o=/in (\d+) seconds/.exec(e.message);o&&t.updateWait(parseInt(o[1]))}if("msg_timedout"===e.msgId){var o=/for (\d+) more seconds/.exec(e.message);o&&(t.set("ffz_banned",!0),t.updateWait(parseInt(o[1])))}"msg_banned"===e.msgId&&(t.set("ffz_banned",!0),s._roomv&&s._roomv.ffzUpdateStatus())}),o.ffz_roomstate_patched||(o.ffz_roomstate_patched=!0,o._socket.off("data",o._onSocketDataReceived,o),o._socket.on("data",function(e){try{var t=n.splitIRCMessage(e.data);if("ROOMSTATE"===t.command)return t.tags=n.parseIRCTags(t.tags),t.target=t.params&&t.params[0],void this._trigger("roomstate",t)}catch(o){s.error("Connection onData: "+o)}return this._onSocketDataReceived(e)},o)),e.ffz_roomstate_patched||(e.ffz_roomstate_patched=!0,e._roomConn.on("roomstate",function(e){e.target===this.ircChannel&&this._trigger("roomstate",e.tags)},e)),e.on("roomstate",function(e){e.hasOwnProperty("slow")&&(t.set("slowMode",e.slow>0),t.set("slowValue",e.slow),t.get("slowMode")||t.updateWait(0)),e.hasOwnProperty("r9k")&&t.set("r9kMode",e.r9k),e.hasOwnProperty("subs-only")&&t.set("subsOnlyMode",e["subs-only"])}),e._roomConn._connection.off("message",e._roomConn._onIrcMessage,e._roomConn),e._roomConn._onIrcMessage=function(e){if(e.target==this.ircChannel)switch(e.command){case"JOIN":this._session&&this._session.nickname===e.sender?this._onIrcJoin(e):s.settings.chatter_count&&t.ffzUpdateChatters(e.sender);break;case"PART":this._session&&this._session.nickname===e.sender?(this._resetActiveState(),this._connection._exitedRoomConn(),this._trigger("exited")):s.settings.chatter_count&&t.ffzUpdateChatters(null,e.sender)}},e._roomConn._connection.on("message",e._roomConn._onIrcMessage,e._roomConn),this.set("ffz_is_patched",!0)}}.observes("tmiRoom")})}},{"../constants":3,"../utils":31}],11:[function(){var t=e.FrankerFaceZ;t.prototype.setup_viewers=function(){this.log("Hooking the Ember Viewers controller.");var e=App.__container__.resolve("controller:viewers");this._modify_viewers(e)},t.prototype._modify_viewers=function(e){var s=this;e.reopen({lines:function(){var e=this._super();try{var o=[],n={},i=null,a=App.__container__.lookup("controller:channel"),r=this.get("parentController.model.id"),d=a&&a.get("id");if(d){var u=a.get("display_name");u&&(t.capitalization[d]=[u,Date.now()])}r!=d&&(d=null);for(var c=0;c<e.length;c++){var l=e[c];if(l.category)i=l.category,o.push(i),n[i]=[];else{var h=l.chatter.toLowerCase();if(!h)continue;h==d?(o.unshift("Broadcaster"),n.Broadcaster=[h]):n.hasOwnProperty(i)&&n[i].push(h)}}e=[];for(var c=0;c<o.length;c++){var f=o[c],_=n[f];if(_&&_.length)for(e.push({category:f}),e.push({chatter:""}),_.sort();_.length;){var h=_.shift();h=t.get_capitalization(h),e.push({chatter:h})}}}catch(m){s.error("ViewersController lines: "+m)}return e}.property("content.chatters")})}},{}],12:[function(t){var s=e.FrankerFaceZ,o=t("./constants"),n=t("./utils"),i=function(e){var t=e.margins,s="";return t||(t=(e.height-18)/-2+"px 0"),(e.urls[2]||e.urls[4])&&(s='url("'+e.urls[1]+'") 1x',e.urls[2]&&(s+=', url("'+e.urls[2]+'") 2x'),e.urls[4]&&(s+=', url("'+e.urls[4]+'") 4x'),s="-webkit-image-set("+s+"); image-set("+s+");"),".ffz-emote-"+e.id+' { background-image: url("'+e.urls[1]+'"); height: '+e.height+"px; width: "+e.width+"px; margin: "+t+(s?"; "+s:"")+(e.css?"; "+e.css:"")+"}\n"},a=function(e){return e.margins||e.css?i(e)+'img[src="'+e.urls[1]+'"] { '+(e.margins?"margin: "+e.margins+";":"")+(e.css||"")+" }\n":i(e)},r=a,d=function(e){var t="string"==typeof e?parseInt(e,16):e;return 65536>t?String.fromCharCode(t):(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t)))};s.prototype.setup_emoticons=function(){this.log("Preparing emoticon system."),this.emoji_data={},this.emoji_names={},this.emote_sets={},this.global_sets=[],this.default_sets=[],this._last_emote_id=0,this.emote_usage={},this.log("Creating emoticon style element.");var e=this._emote_style=document.createElement("style");e.id="ffz-emoticon-css",document.head.appendChild(e),this.log("Loading global emote sets."),this.load_global_sets(),this.log("Loading emoji data."),this.load_emoji_data(),this.log("Watching Twitch emoticon parser to ensure it loads."),this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4)
|
||
},s.prototype.add_usage=function(e,t,s){var o=this.emote_usage[t]=this.emote_usage[t]||{};o[e]=(o[e]||0)+(s||1),this._emote_report_scheduled||(this._emote_report_scheduled=setTimeout(this._report_emotes.bind(this),3e4))},s.prototype._report_emotes=function(){this._emote_report_scheduled&&delete this._emote_report_scheduled;var e=this.emote_usage;this.emote_usage={},this.ws_send("emoticon_uses",[e],function(){},!0)},s.prototype.check_twitch_emotes=function(){this._twitch_emote_check&&(clearTimeout(this._twitch_emote_check),delete this._twitch_emote_check);var e;if(this.rooms)for(var t in this.rooms)if(this.rooms.hasOwnProperty(t)){e=this.rooms[t];break}if(!e||!e.room||!e.room.tmiSession)return void(this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4));var s=e.room.tmiSession._emotesParser,o=Object.keys(s.emoticonRegexToIds).length;if(!(o>0)){var n=s.emoticonSetIds;s.emoticonSetIds="",s.updateEmoticons(n),this._twitch_emote_check=setTimeout(this.check_twitch_emotes.bind(this),1e4)}},s.prototype.getEmotes=function(e,t){var s=this.users&&this.users[e],o=this.rooms&&this.rooms[t];return _.union(s&&s.sets||[],o&&o.set&&[o.set]||[],o&&o.extra_sets||[],this.default_sets)},s.ws_commands.reload_set=function(e){this.emote_sets.hasOwnProperty(e)&&this.load_set(e)},s.ws_commands.load_set=function(e){this.load_set(e)},s.prototype._emote_tooltip=function(e){if(!e)return null;if(e._tooltip)return e._tooltip;var t=this.emote_sets[e.set_id],s=e.owner,o=t&&t.title||"Global";return e._tooltip="Emoticon: "+(e.hidden?"???":e.name)+"\nFFZ "+o+(s?"\nBy: "+s.display_name:""),e._tooltip},s.prototype.load_emoji_data=function(e,t){var s=this;jQuery.getJSON(o.SERVER+"emoji/emoji.json").done(function(t){var n={},i={};for(var a in t){var r=t[a];a=a.toLowerCase(),r.code=a,n[a]=r,i[r.short_name]=a,r.raw=_.map(r.code.split("-"),d).join(""),r.src=o.SERVER+"emoji/"+a+"-1x.png",r.srcSet=r.src+" 1x, "+o.SERVER+"emoji/"+a+"-2x.png 2x, "+o.SERVER+"emoji/"+a+"-4x.png 4x",r.token={srcSet:r.srcSet,emoticonSrc:r.src+'" data-ffz-emoji="'+a+'" height="18px',ffzEmoji:a,altText:r.raw}}s.emoji_data=n,s.emoji_names=i,s.log("Loaded data on "+Object.keys(n).length+" emoji."),"function"==typeof e&&e(!0,t)}).fail(function(o){return 404===o.status?"function"==typeof e&&e(!1):(t=(t||0)+1,50>t?s.load_emoji(e,t):"function"==typeof e&&e(!1))})},s.prototype.load_global_sets=function(e,t){var s=this;jQuery.getJSON(o.API_SERVER+"v1/set/global").done(function(e){s.default_sets=e.default_sets;var t=s.global_sets=[],o=e.sets||{};for(var n in o)if(o.hasOwnProperty(n)){var i=o[n];t.push(n),s._load_set_json(n,void 0,i)}}).fail(function(o){return 404==o.status?"function"==typeof e&&e(!1):(t=t||0,t++,50>t?s.load_global_sets(e,t):"function"==typeof e&&e(!1))})},s.prototype.load_set=function(e,t,s){var n=this;jQuery.getJSON(o.API_SERVER+"v1/set/"+e).done(function(s){n._load_set_json(e,t,s&&s.set)}).fail(function(o){return 404==o.status?"function"==typeof t&&t(!1):(s=s||0,s++,10>s?n.load_set(e,t,s):"function"==typeof t&&t(!1))})},s.prototype.unload_set=function(e){var t=this.emote_sets[e];t&&(this.log("Unloading emoticons for set: "+e),n.update_css(this._emote_style,e,null),delete this.emote_sets[e])},s.prototype._load_set_json=function(e,t,s){if(!s)return"function"==typeof t&&t(!1);var o=this.emote_sets[e]&&this.emote_sets[e].users||[];this.emote_sets[e]=s,s.users=o,s.count=0;var i="",a=s.emoticons;s.emoticons={};for(var d=0;d<a.length;d++){var u=a[d];u.klass="ffz-emote-"+u.id,u.set_id=e,u.srcSet=u.urls[1]+" 1x",u.urls[2]&&(u.srcSet+=", "+u.urls[2]+" 2x"),u.urls[4]&&(u.srcSet+=", "+u.urls[4]+" 4x"),u.regex="!"===u.name[u.name.length-1]?new RegExp("(^|\\W|\\b)("+u.name+")(?=\\W|$)","g"):new RegExp("(^|\\W|\\b)("+u.name+")\\b","g"),i+=r(u),s.count++,s.emoticons[u.id]=u}n.update_css(this._emote_style,e,i+(s.css||"")),this.log("Updated emoticons for set #"+e+": "+s.title,s),this._cindex&&this._cindex.ffzFixTitle(),this.update_ui_link(),t&&t(!0,s)}},{"./constants":3,"./utils":31}],13:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils");s.prototype.find_bttv=function(t,s){return this.has_bttv=!1,e.BTTVLOADED?this.setup_bttv(s||0):void(s>=6e4?this.log("BetterTTV was not detected after 60 seconds."):setTimeout(this.find_bttv.bind(this,t,(s||0)+t),t))},s.prototype.setup_bttv=function(e){this.log("BetterTTV was detected after "+e+"ms. Hooking."),this.has_bttv=!0,document.body.classList.remove("ffz-dark"),this._dark_style&&(this._dark_style.parentElement.removeChild(this._dark_style),delete this._dark_style),this.settings.group_tabs&&this._chatv&&this._chatv.ffzDisableTabs(),this._roomv&&(this.settings.chat_hover_pause&&this._roomv.ffzDisableFreeze(),this.settings.room_status&&this._roomv.ffzUpdateStatus()),document.body.classList.remove("ffz-chat-colors"),document.body.classList.remove("ffz-chat-background"),document.body.classList.remove("ffz-sidebar-swap"),document.body.classList.remove("ffz-transparent-badges"),this.is_dashboard&&this._update_subscribers(),document.body.classList.add("ffz-bttv");var t=BetterTTV.chat.helpers.sendMessage,s=this;BetterTTV.chat.helpers.sendMessage=function(e){var o=e.split(" ",1)[0].toLowerCase();return"/ffz"!==o?t(e):void s.run_ffz_command(e.substr(5),BetterTTV.chat.store.currentRoom)};var i,a=BetterTTV.chat.handlers.onPrivmsg;BetterTTV.chat.handlers.onPrivmsg=function(e,t){i=e;var s=a(e,t);return i=null,s};var r=BetterTTV.chat.templates.privmsg;BetterTTV.chat.templates.privmsg=function(e,t,o,n,a){try{return s.bttv_badges(a),'<div class="chat-line'+(e?" highlight":"")+(t?" action":"")+(o?" admin":"")+'" data-sender="'+(a.sender||"").toLowerCase()+'" data-room="'+i+'">'+BetterTTV.chat.templates.timestamp(a.time)+" "+(n?BetterTTV.chat.templates.modicons():"")+" "+BetterTTV.chat.templates.badges(a.badges)+BetterTTV.chat.templates.from(a.nickname,a.color)+BetterTTV.chat.templates.message(a.sender,a.message,a.emotes,t?a.color:!1)+"</div>"}catch(d){return s.log("Error: ",d),r(e,t,o,n,a)}};var d=BetterTTV.chat.templates.whisper;BetterTTV.chat.templates.whisper=function(e){try{return s.bttv_badges(e),'<div class="chat-line whisper" data-sender="'+e.sender+'">'+BetterTTV.chat.templates.timestamp(e.time)+" "+(e.badges&&e.badges.length?BetterTTV.chat.templates.badges(e.badges):"")+BetterTTV.chat.templates.whisperName(e.sender,e.receiver,e.from,e.to,e.fromColor,e.toColor)+BetterTTV.chat.templates.message(e.sender,e.message,e.emotes,!1)+"</div>"}catch(t){return s.log("Error: ",t),d(e)}};var u,c=BetterTTV.chat.templates.message;BetterTTV.chat.templates.message=function(e,t,o,n){try{n=n||!1;var i=encodeURIComponent(t);if("jtv"!==e){u=e;var a=BetterTTV.chat.templates.emoticonize(t,o);u=null;for(var r=0;r<a.length;r++)a[r]="string"==typeof a[r]?BetterTTV.chat.templates.bttvMessageTokenize(e,a[r]):a[r][0];t=a.join(" ")}return'<span class="message" '+(n?'style="color: '+n+'" ':"")+'data-raw="'+i+'" data-emotes="'+(o?encodeURIComponent(JSON.stringify(o)):"false")+'">'+t+"</span>"}catch(d){return s.log("Error: ",d),c(e,t,o,n)}};var l=BetterTTV.chat.templates.emoticonize;BetterTTV.chat.templates.emoticonize=function(e,t){var a=l(e,t),r=i||BetterTTV.getChannel(),d=r&&r.toLowerCase(),c=u&&u.toLowerCase(),h=s.getEmotes(c,d),t=[],f=s.get_user(),m=f&&f.login===c;if(_.each(h,function(e){var o=s.emote_sets[e];o&&_.each(o.emoticons,function(e){_.any(a,function(t){return _.isString(t)&&t.match(e.regex)})&&t.push(e)})}),t.length&&_.each(t,function(e){var t=s._emote_tooltip(e),o=['<img class="emoticon" srcset="'+(e.srcSet||"")+'" src="'+e.urls[1]+'" alt="'+t+'" title="'+t+'" />'],n=a;a=[];for(var i=0;i<n.length;i++){var r=n[i];if("string"==typeof r)for(var u=r.split(e.regex);u.length;){var c=u.shift();u.length?(c+=u.shift(),c&&a.push(c),u.shift(),a.push(o),m&&d&&s.add_usage(d,e.id)):a.push(c)}else a.push(r)}}),s.settings.parse_emoji&&s.emoji_data){var p=a;a=[];for(var g=0;g<p.length;g++){var v=p[g];if("string"==typeof v)for(var b=v.split(o.EMOJI_REGEX);b.length;){var y=b.shift();if(y&&a.push(y),b.length){var w=b.shift(),z=b.shift();if("︎"===z)bits.push(w);else{var k=n.emoji_to_codepoint(w,z),E=s.emoji_data[k];a.push(E?['<img class="emoticon" height="18px" srcset="'+(E.srcSet||"")+'" src="'+E.src+'" alt="'+alt+'" title="Emoji: '+E.raw+"\nName: :"+E.short_name+':">']:w+(z||""))}}}else a.push(v)}}return a},this.update_ui_link()}},{"../constants":3,"../utils":31}],14:[function(){var t=e.FrankerFaceZ;t.prototype.find_emote_menu=function(t,s){return this.has_emote_menu=!1,e.emoteMenu&&emoteMenu.registerEmoteGetter?this.setup_emote_menu(s||0):void(s>=6e4?this.log("Emote Menu for Twitch was not detected after 60 seconds."):setTimeout(this.find_emote_menu.bind(this,t,(s||0)+t),t))},t.prototype.setup_emote_menu=function(e){this.log("Emote Menu for Twitch was detected after "+e+"ms. Registering emote enumerator."),emoteMenu.registerEmoteGetter("FrankerFaceZ",this._emote_menu_enumerator.bind(this))},t.prototype._emote_menu_enumerator=function(){for(var e=this.get_user(),s=e?e.login:null,o=App.__container__.lookup("controller:chat"),n=o?o.get("currentRoom.id"):null,i=this.getEmotes(s,n),a=[],r=0;r<i.length;r++){var d=this.emote_sets[i[r]];if(d&&d.emoticons)for(var u in d.emoticons)if(d.emoticons.hasOwnProperty(u)){var c=d.emoticons[u];if(!c.hidden){var l=d.title,h=d.icon||null;l=l?"FrankerFaceZ: "+l:"global"==d.id?"FrankerFaceZ Global Emotes":"globalevent"==d.id?"FrankerFaceZ Event Emotes":this.feature_friday&&d.id==this.feature_friday.set?"FrankerFaceZ "+this.feature_friday.title+": "+this.feature_friday.display_name:"FrankerFaceZ Set: "+t.get_capitalization(d.id),a.push({text:c.name,url:c.urls[1],hidden:!1,channel:l,badge:h})}}}return a}},{}],15:[function(t){var s=e.FrankerFaceZ=function(){s.instance=this,this._log_data=[],this.initialize()};s.get=function(){return s.instance};var o=s.version_info={major:3,minor:4,revision:11,toString:function(){return[o.major,o.minor,o.revision].join(".")+(o.extra||"")}};s.prototype.log=function(e,t,s,o){e="FFZ: "+e+(s?" -- "+JSON.stringify(t):""),this._log_data.push(e+(!s&&o?" -- "+JSON.stringify(t):"")),void 0!==t&&console.groupCollapsed&&console.dir?(console.groupCollapsed(e),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(t):console.dir(t),console.groupEnd(e)):console.log(e)},s.prototype.error=function(e,t,s){e="FFZ Error: "+e+(s?" -- "+JSON.stringify(t):""),this._log_data.push(e),void 0!==t&&console.groupCollapsed&&console.dir?(console.groupCollapsed(e),-1!==navigator.userAgent.indexOf("Firefox/")?console.log(t):console.dir(t),console.groupEnd(e)):console.assert(!1,e)},s.prototype.paste_logs=function(){this._pastebin(this._log_data.join("\n"),function(e){return e?void console.log("FFZ: Your FrankerFaceZ log has been pasted to: "+e):console.log("FFZ Error: Unable to upload log to pastebin.")})},s.prototype._pastebin=function(e,t){jQuery.ajax({url:"http://putco.de/",type:"PUT",data:e,context:this}).success(function(e){t.bind(this)(e.trim()+".log")}).fail(function(){t.bind(this)(null)})},s.prototype.get_user=function(){if(e.PP&&PP.login)return PP;if(e.App){var t=App.__container__.lookup("controller:login");return t?t.get("userData"):void 0}},t("./ui/menu"),t("./settings"),t("./socket"),t("./emoticons"),t("./badges"),t("./tokenize"),t("./ember/channel"),t("./ember/room"),t("./ember/line"),t("./ember/chatview"),t("./ember/viewers"),t("./ember/moderation-card"),t("./ember/chat-input"),t("./debug"),t("./ext/betterttv"),t("./ext/emote_menu"),t("./featurefriday"),t("./ui/styles"),t("./ui/dark"),t("./ui/notifications"),t("./ui/viewer_count"),t("./ui/sub_count"),t("./ui/menu_button"),t("./ui/following"),t("./ui/races"),t("./ui/my_emotes"),t("./ui/about_page"),t("./commands"),s.prototype.initialize=function(t,s){if(/^\/(?:$|user\/|p\/|settings|m\/|messages?\/)/.test(location.pathname))return void this.setup_normal(s);if(/\/[^\/]+\/dashboard/.test(location.pathname)&&!/bookmarks$/.test(location.pathname))return void this.setup_dashboard(s);var o=void 0!=e.App&&void 0!=App.__container__&&void 0!=App.__container__.resolve("model:room");return o?void this.setup_ember(s):(t=t||10,void(s>=6e4?this.log('Twitch application not detected in "'+location.toString()+'". Aborting.'):setTimeout(this.initialize.bind(this,t,(s||0)+t),t)))},s.prototype.setup_normal=function(t){var o=e.performance&&performance.now?performance.now():Date.now();this.log("Found non-Ember Twitch after "+(t||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+s.version_info),this.users={},this.is_dashboard=!1;try{this.embed_in_dash=e.top!==e&&/\/[^\/]+\/dashboard/.test(e.top.location.pathname)&&!/bookmarks$/.test(e.top.location.pathname)}catch(n){this.embed_in_dash=!1}this.load_settings(),this.setup_dark(),this.ws_create(),this.setup_emoticons(),this.setup_badges(),this.setup_notifications(),this.setup_css(),this.setup_menu(),this.find_bttv(10);var i=e.performance&&performance.now?performance.now():Date.now(),a=i-o;this.log("Initialization complete in "+a+"ms")},s.prototype.is_dashboard=!1,s.prototype.setup_dashboard=function(t){var o=e.performance&&performance.now?performance.now():Date.now();this.log("Found Twitch Dashboard after "+(t||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+s.version_info),this.users={},this.is_dashboard=!0,this.embed_in_dash=!1,this.load_settings(),this.setup_dark(),this.ws_create(),this.setup_emoticons(),this.setup_badges(),this.setup_notifications(),this.setup_css(),this._update_subscribers(),this.setup_message_event(),this.find_bttv(10);var n=e.performance&&performance.now?performance.now():Date.now(),i=n-o;this.log("Initialization complete in "+i+"ms")},s.prototype.setup_ember=function(t){var o=e.performance&&performance.now?performance.now():Date.now();this.log("Found Twitch application after "+(t||0)+' ms in "'+location+'". Initializing FrankerFaceZ version '+s.version_info),this.users={},this.is_dashboard=!1;try{this.embed_in_dash=e.top!==e&&/\/[^\/]+\/dashboard/.test(e.top.location.pathname)&&!/bookmarks$/.test(e.top.location.pathname)}catch(n){this.embed_in_dash=!1}this.load_settings(),this.setup_dark(),this.ws_create(),this.setup_emoticons(),this.setup_badges(),this.setup_channel(),this.setup_room(),this.setup_line(),this.setup_chatview(),this.setup_viewers(),this.setup_mod_card(),this.setup_chat_input(),this.setup_notifications(),this.setup_css(),this.setup_menu(),this.setup_my_emotes(),this.setup_following(),this.setup_races(),this.connect_extra_chat(),this.find_bttv(10),this.find_emote_menu(10),this.check_ff();var i=e.performance&&performance.now?performance.now():Date.now(),a=i-o;this.log("Initialization complete in "+a+"ms")},s.prototype.setup_message_event=function(){this.log("Listening for Window Messages."),e.addEventListener("message",this._on_window_message.bind(this),!1)},s.prototype._on_window_message=function(e){if(e.data&&e.data.from_ffz){e.data}}},{"./badges":1,"./commands":2,"./debug":4,"./ember/channel":5,"./ember/chat-input":6,"./ember/chatview":7,"./ember/line":8,"./ember/moderation-card":9,"./ember/room":10,"./ember/viewers":11,"./emoticons":12,"./ext/betterttv":13,"./ext/emote_menu":14,"./featurefriday":16,"./settings":17,"./socket":18,"./tokenize":19,"./ui/about_page":20,"./ui/dark":21,"./ui/following":22,"./ui/menu":23,"./ui/menu_button":24,"./ui/my_emotes":25,"./ui/notifications":26,"./ui/races":27,"./ui/styles":28,"./ui/sub_count":29,"./ui/viewer_count":30}],16:[function(t){var s=e.FrankerFaceZ,o=t("./constants");s.prototype.feature_friday=null,s.prototype.check_ff=function(e){e||this.log("Checking for Feature Friday data..."),jQuery.ajax(o.SERVER+"script/event.json",{cache:!1,dataType:"json",context:this}).done(function(e){return this._load_ff(e)}).fail(function(t){return 404==t.status?this._load_ff(null):(e=e||0,e++,10>e?setTimeout(this.check_ff.bind(this,e),250):this._load_ff(null))})},s.ws_commands.reload_ff=function(){this.check_ff()},s.prototype._feature_friday_ui=function(e,t,s){if(this.feature_friday&&this.feature_friday.channel!=e){this._emotes_for_sets(t,s,[this.feature_friday.set],this.feature_friday.title,this.feature_friday.icon,"FrankerFaceZ");var o=App.__container__.lookup("controller:channel");if(!o||o.get("id")!=this.feature_friday.channel){var n=this.feature_friday,i=document.createElement("div"),a=document.createElement("a");i.className="chat-menu-content",i.style.textAlign="center";var r=n.display_name+(n.live?" is live now!":"");a.className="button primary",a.classList.toggle("live",n.live),a.classList.toggle("blue",this.has_bttv&&BetterTTV.settings.get("showBlueButtons")),a.href="http://www.twitch.tv/"+n.channel,a.title=r,a.target="_new",a.innerHTML="<span>"+r+"</span>",i.appendChild(a),t.appendChild(i)}}},s.prototype._load_ff=function(e){this.feature_friday&&(this.global_sets.removeObject(this.feature_friday.set),this.default_sets.removeObject(this.feature_friday.set),this.feature_friday=null,this.update_ui_link()),e&&e.set&&e.channel&&(this.feature_friday={set:e.set,channel:e.channel,live:!1,title:e.title||"Feature Friday",display_name:s.get_capitalization(e.channel,this._update_ff_name.bind(this))},this.global_sets.push(e.set),this.default_sets.push(e.set),this.load_set(e.set),this._update_ff_live())},s.prototype._update_ff_live=function(){if(this.feature_friday){var e=this;Twitch.api.get("streams/"+this.feature_friday.channel).done(function(t){e.feature_friday.live=null!=t.stream,e.update_ui_link()}).always(function(){e.feature_friday.timer=setTimeout(e._update_ff_live.bind(e),12e4)})}},s.prototype._update_ff_name=function(e){this.feature_friday&&(this.feature_friday.display_name=e)}},{"./constants":3}],17:[function(t){var s=e.FrankerFaceZ,o=t("./constants");make_ls=function(e){return"ffz_setting_"+e},toggle_setting=function(e,t){var s=!this.settings.get(t);this.settings.set(t,s),e.classList.toggle("active",s)},s.settings_info={},s.prototype.load_settings=function(){this.log("Loading settings."),this.settings={};for(var t in s.settings_info)if(s.settings_info.hasOwnProperty(t)){var o=s.settings_info[t],n=o.storage_key||make_ls(t),i=o.hasOwnProperty("value")?o.value:void 0;if(localStorage.hasOwnProperty(n))try{i=JSON.parse(localStorage.getItem(n))}catch(a){this.log('Error loading value for "'+t+'": '+a)}this.settings[t]=i}this.settings.get=this._setting_get.bind(this),this.settings.set=this._setting_set.bind(this),this.settings.del=this._setting_del.bind(this),e.addEventListener("storage",this._setting_update.bind(this),!1)},s.settings_info.replace_twitch_menu={type:"boolean",value:!1,name:"Replace Twitch Emoticon Menu",help:"Completely replace the default Twitch emoticon menu.",on_update:function(e){document.body.classList.toggle("ffz-menu-replace",e)}},s.menu_pages.settings={render:function(e,t){var o={},n=[];for(var i in s.settings_info)if(s.settings_info.hasOwnProperty(i)){var a=s.settings_info[i],r=a.category||"Miscellaneous",d=o[r];if(void 0!==a.visible&&null!==a.visible){var u=a.visible;if("function"==typeof a.visible&&(u=a.visible.bind(this)()),!u)continue}d||(n.push(r),d=o[r]=[]),d.push([i,a])}n.sort(function(e,t){var e=e.toLowerCase(),t=t.toLowerCase();return"debugging"===e&&(e="zzz"+e),"debugging"===t&&(t="zzz"+t),t>e?-1:e>t?1:0});for(var c=0;c<n.length;c++){var l=n[c],h=o[l],f=document.createElement("div"),_=document.createElement("div");_.className="heading",f.className="chat-menu-content",_.innerHTML=l,f.appendChild(_),h.sort(function(e,t){var e=e[1],t=t[1],s=e.type,o=t.type,n=e.name.toLowerCase(),i=t.name.toLowerCase();return o>s?-1:s>o?1:i>n?-1:n>i?1:0});for(var m=0;m<h.length;m++){var i=h[m][0],a=h[m][1],p=document.createElement("p"),g=this.settings.get(i);if(p.className="clearfix",this.has_bttv&&a.no_bttv){var v=document.createElement("span"),b=document.createElement("span");v.className="switch-label",v.innerHTML=a.name,b=document.createElement("span"),b.className="help",b.innerHTML="Disabled due to incompatibility with BetterTTV.",p.classList.add("disabled"),p.appendChild(v),p.appendChild(b)}else{if("boolean"==a.type){var y=document.createElement("a"),v=document.createElement("span");y.className="switch",y.classList.toggle("active",g),y.innerHTML="<span></span>",v.className="switch-label",v.innerHTML=a.name,p.appendChild(y),p.appendChild(v),y.addEventListener("click",toggle_setting.bind(this,y,i))}else{p.classList.add("option");var w=document.createElement("a");w.innerHTML=a.name,w.href="#",p.appendChild(w),w.addEventListener("click",a.method.bind(this))}if(a.help){var b=document.createElement("span");b.className="help",b.innerHTML=a.help,p.appendChild(b)}}f.appendChild(p)}t.appendChild(f)}},name:"Settings",icon:o.GEAR,sort_order:99999,wide:!0},s.prototype._setting_update=function(t){if(t||(t=e.event),t.key&&"ffz_setting_"===t.key.substr(0,12)){var o=t.key,n=o.substr(12),i=void 0,a=s.settings_info[n];if(!a){for(n in s.settings_info)if(s.settings_info.hasOwnProperty(n)&&(a=s.settings_info[n],a.storage_key==o))break;if(a.storage_key!=o)return}this.log("Updated Setting: "+n);try{i=JSON.parse(t.newValue)}catch(r){this.log('Error loading new value for "'+n+'": '+r),i=a.value||void 0}if(this.settings[n]=i,a.on_update)try{a.on_update.bind(this)(i,!1)}catch(r){this.log('Error running updater for setting "'+n+'": '+r)}}},s.prototype._setting_get=function(e){return this.settings[e]},s.prototype._setting_set=function(e,t){var o=s.settings_info[e],n=o.storage_key||make_ls(e),i=JSON.stringify(t);if(this.settings[e]=t,localStorage.setItem(n,i),this.log('Changed Setting "'+e+'" to: '+i),o.on_update)try{o.on_update.bind(this)(t,!0)}catch(a){this.log('Error running updater for setting "'+e+'": '+a)}},s.prototype._setting_del=function(e){var t=s.settings_info[e],o=t.storage_key||make_ls(e),n=void 0;if(localStorage.hasOwnProperty(o)&&localStorage.removeItem(o),delete this.settings[e],t&&(n=this.settings[e]=t.hasOwnProperty("value")?t.value:void 0),t.on_update)try{t.on_update.bind(this)(n,!0)}catch(i){this.log('Error running updater for setting "'+e+'": '+i)}}},{"./constants":3}],18:[function(){var t=e.FrankerFaceZ;t.prototype._ws_open=!1,t.prototype._ws_delay=0,t.ws_commands={},t.ws_on_close=[],t.prototype.ws_create=function(){var s,o=this;this._ws_last_req=0,this._ws_callbacks={},this._ws_pending=this._ws_pending||[];try{s=this._ws_sock=new WebSocket("ws://catbag.frankerfacez.com/")}catch(n){return this._ws_exists=!1,this.log("Error Creating WebSocket: "+n)}this._ws_exists=!0,s.onopen=function(){o._ws_open=!0,o._ws_delay=0,o.log("Socket connected.");var s=e.RequestFileSystem||e.webkitRequestFileSystem;s?s(e.TEMPORARY,100,o.ws_send.bind(o,"hello",["ffz_"+t.version_info,localStorage.ffzClientId],o._ws_on_hello.bind(o)),o.log.bind(o,"Operating in Incognito Mode.")):o.ws_send("hello",["ffz_"+t.version_info,localStorage.ffzClientId],o._ws_on_hello.bind(o));var n=o.get_user();if(n&&o.ws_send("setuser",n.login),o.is_dashboard){var i=location.pathname.match(/\/([^\/]+)/);i&&(o.ws_send("sub",i[1]),o.ws_send("sub_channel",i[1]))}for(var a in o.rooms)o.rooms.hasOwnProperty(a)&&o.rooms[a]&&(o.ws_send("sub",a),o.rooms[a].needs_history&&(o.rooms[a].needs_history=!1,!o.has_bttv&&o.settings.chat_history&&o.ws_send("chat_history",[a,25],o._load_history.bind(o,a))));if(o._cindex){var r=o._cindex.get("controller.id"),d=o._cindex.get("controller.hostModeTarget.id");r&&o.ws_send("sub_channel",r),d&&o.ws_send("sub_channel",d)}var u=o._ws_pending;o._ws_pending=[];for(var c=0;c<u.length;c++){var l=u[c];o.ws_send(l[0],l[1],l[2])}},s.onclose=function(e){o.log("Socket closed. (Code: "+e.code+", Reason: "+e.reason+")"),o._ws_open=!1;for(var s=0;s<t.ws_on_close.length;s++)try{t.ws_on_close[s].bind(o)()}catch(n){o.log("Error on Socket Close Callback: "+n)}o._ws_delay<6e4?o._ws_delay+=1e3*(Math.floor(10*Math.random())+5):o._ws_delay=1e3*(Math.floor(60*Math.random())+30),setTimeout(o.ws_create.bind(o),o._ws_delay)},s.onmessage=function(e){var s,n,i=e.data.indexOf(" "),a=e.data.substr(i+1),r=parseInt(e.data.slice(0,i));if(i=a.indexOf(" "),-1===i&&(i=a.length),s=a.slice(0,i),a=a.substr(i+1),a&&(n=JSON.parse(a)),-1===r){var d=t.ws_commands[s];d?d.bind(o)(n):o.log("Invalid command: "+s,n,!1,!0)}else{var u="True"===s,c=o._ws_callbacks.hasOwnProperty(r);if(c)try{o._ws_callbacks[r](u,n)}catch(l){o.error("Callback for "+r+": "+l)}else o.log("Socket Reply to "+r+" - "+(u?"SUCCESS":"FAIL"),n,!1,!0)}}},t.prototype.ws_send=function(e,t,s,o){if(!this._ws_open){if(o){var n=this._ws_pending=this._ws_pending||[];return n.push([e,t,s]),!0}return!1}var i=++this._ws_last_req;return t=void 0!==t?" "+JSON.stringify(t):"",s&&(this._ws_callbacks[i]=s),this._ws_sock.send(i+" "+e+t),i},t.prototype._ws_on_hello=function(e,s){if(!e)return this.log("Error Saying Hello: "+s);localStorage.ffzClientId=s,this.log("Client ID: "+s);var o={},n=o.settings={};for(var i in t.settings_info)n[i]=this.settings[i];n.keywords=this.settings.keywords.length,n.banned_words=this.settings.banned_words.length,o.bttv=this.has_bttv||!!document.head.querySelector('script[src*="betterttv"]'),o["user-agent"]=navigator.userAgent,o.screen=[screen.width,screen.height],o.language=navigator.language,o.platform=navigator.platform,this.ws_send("survey",[o])},t.ws_commands.do_authorize=function(e){var s;for(var o in this.rooms)if(this.rooms.hasOwnProperty(o)){var n=this.rooms[o];if(n&&n.room&&!n.room.get("roomProperties.eventchat")&&!n.room.get("isGroupRoom")&&n.room.tmiRoom){var i=n.room.tmiRoom._getConnection();if(i.isConnected){s=i;break}}}s?s._send("PRIVMSG #frankerfacezauthorizer :AUTH "+e):setTimeout(t.ws_commands.do_authorize.bind(this,e),5e3)}},{}],19:[function(t){{var s,o=e.FrankerFaceZ,n=t("./utils"),i=t("./constants"),a="http://static-cdn.jtvnw.net/emoticons/v1/",r=function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},d="[\\s`~<>!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]";new RegExp(d+"*,"+d+"*")}try{s=e.require&&e.require("ember-twitch-chat/helpers/chat-line-helpers")}catch(u){}o.SRC_IDS={},o.src_to_id=function(e){if(o.SRC_IDS.hasOwnProperty(e))return o.SRC_IDS[e];var t=/\/emoticons\/v1\/(\d+)\/1\.0/.exec(e),s=t?parseInt(t[1]):null;return 0/0===s&&(s=null),o.SRC_IDS[e]=s,s},o.prototype.tokenize_chat_line=function(t,n){if(t.cachedTokens)return t.cachedTokens;var i=t.message,a=this.get_user(),r=t.room,d=a&&t.from===a.login,u=t.tags&&t.tags.emotes,c=[i];c=s.linkifyMessage(c),a&&a.login&&(c=s.mentionizeMessage(c,a.login,d)),c=s.emoticonizeMessage(c,u),this.settings.replace_bad_emotes&&(c=this.tokenize_replace_emotes(c)),c=this._remove_banned(c),c=this.tokenize_emotes(t.from,r,c,d),this.settings.parse_emoji&&(c=this.tokenize_emoji(c));var l=t.tags&&t.tags["display-name"];if(l&&l.length&&(o.capitalization[t.from]=[l.trim(),Date.now()]),!d){c=this.tokenize_mentions(c);for(var h=0;h<c.length;h++){var f=c[h];if("whisper"===t.style||!_.isString(f)&&f.mentionedUser&&!f.own){if(t.ffz_has_mention=!0,r&&!this.has_bttv&&this.settings.group_tabs&&this._chatv&&this._chatv._ffz_tabs){var m=this._chatv._ffz_tabs.querySelector('.ffz-chat-tab[data-room="'+r+'"]');m&&!m.classList.contains("active")&&m.classList.add("tab-mentioned")}if(this._chatv&&this.settings.highlight_notifications&&!this.embed_in_dash&&!document.hasFocus()&&!n){var p,g=this.rooms[r]&&this.rooms[r].room;p=g&&g.get("isGroupRoom")?g.get("tmiRoom.displayName"):o.get_capitalization(r),l=l||Twitch.display.capitalize(t.from),i="action"===t.style?"* "+l+" "+i:l+": "+i;"whisper"===t.style?this.show_notification(i,"Twitch Chat Whisper","ffz_whisper_notice",6e4,function(){e.focus()}):this.show_notification(i,"Twitch Chat Mention in "+p,r,6e4,function(){e.focus();var t=App.__container__.lookup("controller:chat");g&&t&&t.focusRoom(g)})}break}}}return t.cachedTokens=c,c},o.prototype.tokenize_line=function(e,t,o,n,i){if("string"==typeof o&&(o=[o]),s&&s.linkifyMessage&&(o=s.linkifyMessage(o)),s&&s.mentionizeMessage){var a=this.get_user();a&&a.login&&(o=s.mentionizeMessage(o,a.login,e===a.login))}return n||(o=this.tokenize_emotes(e,t,o),this.settings.replace_bad_emotes&&(o=this.tokenize_replace_emotes(o))),this.settings.parse_emoji&&!i&&(o=this.tokenize_emoji(o)),o},o.prototype.render_tokens=function(e,t){var s=this;return _.map(e,function(e){if(e.emoticonSrc){var i;if(e.ffzEmote){var a=s.emote_sets&&s.emote_sets[e.ffzEmoteSet],r=a&&a.emoticons&&a.emoticons[e.ffzEmote];i=r?n.sanitize(s._emote_tooltip(r)):e.altText}else if(e.ffzEmoji){var d=e.ffzEmoji,u=s.emoji_data&&s.emoji_data[d];i=u?"Emoji: "+e.altText+"\nName: :"+u.short_name+":":e.altText}else{var c=o.src_to_id(e.emoticonSrc),l=c&&s._twitch_emotes&&s._twitch_emotes[c];i=l&&l.tooltip?l.tooltip:e.altText}return'<img class="emoticon tooltip" src="'+e.emoticonSrc+'" '+(e.srcSet?'srcset="'+e.srcSet+'" ':"")+'alt="'+e.altText+'" title="'+i+'">'}if(e.isLink){if(!t&&void 0!==t)return e.href;var h=e.href;if(h.indexOf("@")>-1&&(-1===h.indexOf("/")||h.indexOf("@")<h.indexOf("/")))return'<a href="mailto:'+h+'">'+h+"</a>";var f=(h.match(/^https?:\/\//)?"":"http://")+h,l=s._link_data&&s._link_data[f]||{};return'<a href="'+f+'" class="'+(l.unsafe?"unsafe-link":"")+'" title="'+n.sanitize(l.tooltip||"")+'" target="_blank">'+h+"</a>"}return e.mentionedUser?'<span class="'+(e.own?"mentioning":"mentioned")+'">'+e.mentionedUser+"</span>":n.sanitize(e.deletedLink?e.text:e)}).join("")},o.prototype.tokenize_replace_emotes=function(e){_.isString(e)&&(e=[e]);for(var t=0;t<e.length;t++){var s=e[t];if(s&&s.emoticonSrc&&!s.ffzEmote){var n=o.src_to_id(s.emoticonSrc);i.EMOTE_REPLACEMENTS.hasOwnProperty(n)&&(s.emoticonSrc=i.EMOTE_REPLACEMENT_BASE+i.EMOTE_REPLACEMENTS[n]+'" data-twitch-emote="'+n)}}return e},o.prototype.tokenize_title_emotes=function(e){var t=this,s=App.__container__.lookup("controller:channel"),o=s&&s.get("product.emoticons"),n=[];return _.isString(e)&&(e=[e]),_.each(_.union(t.__twitch_global_emotes||[],o),function(t){if(t&&"inactive"!==t.state){var s=new RegExp("\\b"+t.regex+"\\b");_.any(e,function(e){return _.isString(e)&&e.match(s)})&&n.push(t)}}),(void 0===t.__twitch_global_emotes||null===t.__twitch_global_emotes)&&(t.__twitch_global_emotes=!1,Twitch.api.get("chat/emoticon_images",{emotesets:"0,42"}).done(function(e){if(!e||!e.emoticon_sets||!e.emoticon_sets[0])return void(t.__twitch_global_emotes=[]);var s=t.__twitch_global_emotes=[];e=e.emoticon_sets[0];for(var o=0;o<e.length;o++){var n=e[o];s.push({regex:n.code,url:a+n.id+"/1.0"})}t._cindex&&t._cindex.ffzFixTitle()}).fail(function(){setTimeout(function(){t.__twitch_global_emotes=null},5e3)})),n.length?("string"==typeof e&&(e=[e]),_.each(n,function(t){var s={isEmoticon:!0,srcSet:t.url+" 1x",emoticonSrc:t.url,altText:t.regex},o=new RegExp("\\b"+t.regex+"\\b");e=_.compact(_.flatten(_.map(e,function(e){if(_.isObject(e))return e;
|
||
var t=e.split(o),n=[];return t.forEach(function(e,o){n.push(e),o!==t.length-1&&n.push(s)}),n})))}),e):e},o.prototype.tokenize_emotes=function(e,t,s,o){var n=this,i=this.getEmotes(e,t),a=[];return _.each(i,function(e){var t=n.emote_sets[e];t&&_.each(t.emoticons,function(e){_.any(s,function(t){return _.isString(t)&&t.match(e.regex)})&&a.push(e)})}),a.length?("string"==typeof s&&(s=[s]),_.each(a,function(e){var i={srcSet:e.srcSet,emoticonSrc:e.urls[1]+'" data-ffz-emote="'+encodeURIComponent(JSON.stringify([e.id,e.set_id])),ffzEmote:e.id,ffzEmoteSet:e.set_id,altText:e.hidden?"???":e.name};s=_.compact(_.flatten(_.map(s,function(s){if(_.isObject(s))return s;for(var a=s.split(e.regex),r=[];a.length;){var d=a.shift();a.length?(d+=a.shift(),d&&r.push(d),a.shift(),r.push(i),o&&t&&n.add_usage(t,e.id)):r.push(d)}return r})))}),s):s},o.prototype.tokenize_emoji=function(e){if("string"==typeof e&&(e=[e]),!this.emoji_data)return e;var t=this;return _.compact(_.flatten(_.map(e,function(e){if(_.isObject(e))return e;for(var s=e.split(i.EMOJI_REGEX),o=[];s.length;){var a=s.shift();if(a&&o.push(a),s.length){var r=s.shift(),d=s.shift();if("︎"===d)o.push(r);else{var u=n.emoji_to_codepoint(r,d),c=t.emoji_data[u];o.push(c?c.token:r+(d||""))}}}return o})))},o._regex_cache={},o._get_regex=function(e){return o._regex_cache[e]=o._regex_cache[e]||RegExp("\\b"+r(e)+"\\b","ig")},o._words_to_regex=function(e){var t=o._regex_cache[e];if(!t){for(var s="",n=0;n<e.length;n++)e[n]&&(s+=(s?"|":"")+r(e[n]));t=o._regex_cache[e]=new RegExp("(^|.*?"+d+")("+s+")(?=$|"+d+")","ig")}return t},o.prototype.tokenize_mentions=function(e){var t=this.settings.keywords;if(!t||!t.length)return e;"string"==typeof e&&(e=[e]);for(var s=o._words_to_regex(t),n=[],i=0;i<e.length;i++){var a=e[i];_.isString(a)&&a.match(s)?(a=a.replace(s,function(e,t,s){return n.push(t),n.push({mentionedUser:s,own:!1}),""}),a&&n.push(a)):n.push(a)}return n},o.prototype._deleted_link_click=function(e){if(!this.classList.contains("deleted-link"))return!0;var t=this.getAttribute("data-url"),s=t,o=FrankerFaceZ.get();this.classList.remove("deleted-link"),this.removeAttribute("data-url"),this.removeAttribute("title"),this.removeAttribute("original-title"),t.indexOf("@")>-1&&(-1===t.indexOf("/")||t.indexOf("@")<t.indexOf("/"))?t="mailto:"+t:t.match(/^https?:\/\//)||(t="http://"+t),this.href=t,this.target="_new",this.textContent=s;var n=o._link_data[s];n&&"boolean"!=typeof n&&(this.title=n.tooltip,n.unsafe&&this.classList.add("unsafe-link")),e.preventDefault()}},{"./constants":3,"./utils":31}],20:[function(t){var s=e.FrankerFaceZ,o=t("../constants");s.menu_pages.about={name:"About",icon:o.HEART,sort_order:1e5,render:function(e,t){var o=this.rooms[e.get("context.currentRoom.id")],n=!1,i=this;if(o&&o.set){var a=this.emote_sets[o.set];a&&a.count>0&&(n=!0)}var r=document.createElement("div"),d="";d+="<h1>FrankerFaceZ</h1>",d+='<div class="ffz-about-subheading">new ways to woof</div>',r.className="chat-menu-content center",r.innerHTML=d,t.appendChild(r);var u=0,c=r.querySelector("h1");c&&c.addEventListener("click",function(){if(c.style.cursor="pointer",u++,u>=3){u=0;var e=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");e&&e.classList.toggle("ffz-flip")}setTimeout(function(){u=0,c.style.cursor=""},2e3)});var l=document.createElement("div"),h=document.createElement("a"),f="To use custom emoticons in "+(n?"this channel":"tons of channels")+", get FrankerFaceZ from http://www.frankerfacez.com";h.className="button primary",h.innerHTML="Advertise in Chat",h.addEventListener("click",this._add_emote.bind(this,e,f)),l.appendChild(h);var _=document.createElement("a");_.className="button ffz-donate",_.href="https://www.frankerfacez.com/donate",_.target="_new",_.innerHTML="Donate",l.appendChild(_),l.className="chat-menu-content center",t.appendChild(l);var m=document.createElement("div");d='<table class="ffz-about-table">',d+='<tr><th colspan="4">Developers</th></tr>',d+='<tr><td>Dan Salvato</td><td><a class="twitch" href="http://www.twitch.tv/dansalvato" title="Twitch" target="_new"> </a></td><td><a class="twitter" href="https://twitter.com/dansalvato1" title="Twitter" target="_new"> </a></td><td><a class="youtube" href="https://www.youtube.com/user/dansalvato1" title="YouTube" target="_new"> </a></td></tr>',d+='<tr><td>Stendec</td><td><a class="twitch" href="http://www.twitch.tv/sirstendec" title="Twitch" target="_new"> </a></td><td><a class="twitter" href="https://twitter.com/SirStendec" title="Twitter" target="_new"> </a></td><td><a class="youtube" href="https://www.youtube.com/channel/UCnxuvmK1DCPCXSJ-mXIh4KQ" title="YouTube" target="_new"> </a></td></tr>',d+='<tr class="debug"><td>Version '+s.version_info+'</td><td colspan="3"><a href="#" id="ffz-debug-logs">Logs</a></td></tr>',m.className="chat-menu-content center",m.innerHTML=d;var p=!1;m.querySelector("#ffz-debug-logs").addEventListener("click",function(){p||(p=!0,i._pastebin(i._log_data.join("\n"),function(e){p=!1,e?prompt("Your FrankerFaceZ logs have been uploaded to the URL:",e):alert("There was an error uploading the FrankerFaceZ logs.")}))}),t.appendChild(m)}}},{"../constants":3}],21:[function(t){var s=e.FrankerFaceZ,o=t("../constants");s.settings_info.twitch_chat_dark={type:"boolean",value:!1,visible:!1},s.settings_info.dark_twitch={type:"boolean",value:!1,no_bttv:!0,name:"Dark Twitch",help:"Apply a dark background to channels and other related pages for easier viewing.",on_update:function(t){if(!this.has_bttv){document.body.classList.toggle("ffz-dark",t);var s=e.App?App.__container__.lookup("controller:settings").get("model"):void 0;t?(this._load_dark_css(),s&&this.settings.set("twitch_chat_dark",s.get("darkMode")),s&&s.set("darkMode",!0)):s&&s.set("darkMode",this.settings.twitch_chat_dark)}}},s.prototype.setup_dark=function(){this.has_bttv||(document.body.classList.toggle("ffz-dark",this.settings.dark_twitch),this.settings.dark_twitch&&(e.App&&App.__container__.lookup("controller:settings").set("model.darkMode",!0),this._load_dark_css()))},s.prototype._load_dark_css=function(){if(!this._dark_style){this.log("Injecting FrankerFaceZ Dark Twitch CSS.");var e=this._dark_style=document.createElement("link");e.id="ffz-dark-css",e.setAttribute("rel","stylesheet"),e.setAttribute("href",o.SERVER+"script/dark.css?_="+(o.DEBUG?Date.now():s.version_info)),document.head.appendChild(e)}}},{"../constants":3}],22:[function(t){{var s=e.FrankerFaceZ;t("../utils")}s.prototype.setup_following=function(){this.log("Initializing following support."),this.follow_data={},this.follow_sets={}},s.settings_info.follow_buttons={type:"boolean",value:!0,category:"Channel Metadata",name:"Relevant Follow Buttons",help:"Display additional Follow buttons for channels relevant to the stream, such as people participating in co-operative gameplay.",on_update:function(){this.rebuild_following_ui()}},s.ffz_commands.following=function(e,t){t=t.join(" ").trim().split(/\s*,+\s*/),t.length&&""===t[0]&&t.shift(),t.length&&""===t[t.length-1]&&t.pop();var s=this.get_user(),o=this;return!s||s.login!==e.id&&"sirstendec"!==s.login&&"dansalvato"!==s.login?"You must be logged in as the broadcaster to use this command.":this.ws_send("update_follow_buttons",[e.id,t],function(t,s){return t?void(s?o.room_message(e,"The following buttons have been updated."):o.room_message(e,"The following buttons have been disabled.")):void o.room_message(e,"There was an error updating the following buttons.")})?void 0:"There was an error communicating with the server."},s.ws_on_close.push(function(){var t=e.App&&App.__container__.lookup("controller:channel"),s=t&&t.get("id"),o=t&&t.get("hostModeTarget.id"),n=!1;if(this.follow_sets={},t){for(var i in this.follow_data)if(delete this.follow_data[i],(i===s||i===o)&&(n=!0),this.rooms&&this.rooms[i]&&this.rooms[i].extra_sets){var a=this.rooms[i].extra_sets;delete this.rooms[i].extra_sets;for(var r=0;r<a.length;r++){var d=this.emote_sets[a[r]];d&&(d.users.removeObject(i),this.global_sets.contains(a[r])||d.users.length||this.unload_set(a[r]))}}n&&this.rebuild_following_ui()}}),s.ws_commands.follow_buttons=function(t){var s=e.App&&App.__container__.lookup("controller:channel"),o=s&&s.get("id"),n=s&&s.get("hostModeTarget.id"),i=!1;this.follow_data=this.follow_data||{};for(var a in t)this.follow_data[a]=t[a],(a===o||a===n)&&(i=!0);i&&this.rebuild_following_ui()},s.ws_commands.follow_sets=function(e){{var t=App.__container__.lookup("controller:channel");t&&t.get("id"),t&&t.get("hostModeTarget.id")}this.follow_sets=this.follow_sets||{};for(var s in e)if(this.rooms&&this.rooms.hasOwnProperty(s)){for(var o=this.rooms[s].extra_sets||[],n=this.rooms[s].extra_sets=e[s],i=0;i<o.length;i++){var a=o[i];if(-1===n.indexOf(a)){var r=this.emote_sets&&this.emote_sets[a];r&&(r.users.removeObject(s),this.global_sets.contains(a)||r.users.length||this.unload_set(a))}}for(var i=0;i<n.length;i++){var a=n[i],r=this.emote_sets&&this.emote_sets[a];r?-1===r.users.indexOf(s)&&r.users.push(s):this.load_set(a,function(e,t){e&&t.users.push(s)})}}else this.follow_sets[s]=e[s]},s.prototype.rebuild_following_ui=function(){var e=App.__container__.lookup("controller:channel"),t=e&&e.get("id"),s=e&&e.get("hostModeTarget.id");if(this._cindex){if(t){var o=this.follow_data&&this.follow_data[t],n=this._cindex.get("element"),i=n&&n.querySelector(".stats-and-actions .channel-actions"),a=i&&i.querySelector("#ffz-ui-following");if(i&&this.settings.follow_buttons&&o&&o.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r=i.querySelector(":scope > span");r?i.insertBefore(a,r):i.appendChild(a)}for(var d=0;d<o.length;d++)this._build_following_button(a,o[d])}else a&&a.parentElement.removeChild(a)}if(s){var o=this.follow_data&&this.follow_data[s],n=this._cindex.get("element"),i=n&&n.querySelector("#hostmode .channel-actions"),a=i&&i.querySelector("#ffz-ui-following");if(i&&this.settings.follow_buttons&&o&&o.length){if(a)a.innerHTML="";else{a=document.createElement("span"),a.id="ffz-ui-following";var r=i.querySelector(":scope > span");r?i.insertBefore(a,r):i.appendChild(a)}for(var d=0;d<o.length;d++)this._build_following_button(a,o[d])}else a&&a.parentElement.removeChild(a)}}},s.prototype._build_following_button=function(e,t){var o,n=document.createElement("a"),i=this,a=document.createElement("div"),r=document.createElement("a"),d=document.createElement("div"),u=!1,c=!1,l=function(){a.classList.toggle("is-following",u),n.title=(u?"Unf":"F")+"ollow "+o,n.innerHTML=(u?"":"Follow ")+o,d.classList.toggle("hidden",!u)},h=function(){var e=i.get_user();return e&&e.login?void Twitch.api.get("users/"+e.login+"/follows/channels/"+t).done(function(e){u=!0,c=e.notifications,a.classList.add("is-initialized"),l()}).fail(function(){u=!1,c=!1,a.classList.add("is-initialized"),l()}):(u=!1,notification=!1,a.classList.add("is-initialized"),l())},f=function(e){e!==!1&&(e=!0);var s=i.get_user();return s&&s.login?(c=e,Twitch.api.put("users/:login/follows/channels/"+t,{notifications:c}).fail(h)):null},_=function(e){o=e||t,l()};a.className="ember-follow follow-button",a.appendChild(n),r.className="toggle-notification-menu js-toggle-notification-menu",r.href="#",d.className="notification-controls v2 hidden",d.appendChild(r),n.addEventListener("click",function(){var e=i.get_user();return e&&e.login?(u=!u,l(),i.ws_send("track_follow",[t,u]),u?f():Twitch.api.del("users/:login/follows/channels/"+t).done(h),!1):Ember.$.login({mpSourceAction:"follow-button",follow:t})}),r.addEventListener("click",function(){var e=i._build_following_popup(d,t,c);return e&&e.addEventListener("click",function(){var t=!c;return e.classList.toggle("active",t),f(t),!1}),!1}),o=s.get_capitalization(t,_),l(),h(),e.appendChild(a),e.appendChild(d)},s.prototype._build_following_popup=function(e,t,o){var n=this._popup,i="",a=e.offsetLeft+e.offsetWidth;return n&&(n.parentElement.removeChild(n),delete this._popup,this._popup_kill&&this._popup_kill(),delete this._popup_kill,"ffz-following-popup"==n.id&&n.getAttribute("data-channel")===t)?null:(n=this._popup=document.createElement("div"),n.id="ffz-following-popup",n.setAttribute("data-channel",t),n.className=(a>=300?"right":"left")+" dropmenu notify-menu js-notify",i='<div class="header">You are following '+s.get_capitalization(t)+"</div>",i+='<p class="clearfix">',i+='<a class="switch'+(o?" active":"")+'"><span></span></a>',i+='<span class="switch-label">Notify me when the broadcaster goes live</span>',i+="</p>",n.innerHTML=i,e.appendChild(n),n.querySelector("a.switch"))}},{"../utils":31}],23:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils"),i="http://static-cdn.jtvnw.net/emoticons/v1/";s.prototype.setup_menu=function(){this.log("Installing mouse-up event to auto-close menus.");var e=this;jQuery(document).mouseup(function(t){var s,o=e._popup;o&&(o=jQuery(o),s=o.parent(),s.is(t.target)||0!==s.has(t.target).length||(o.remove(),delete e._popup,e._popup_kill&&e._popup_kill(),delete e._popup_kill))}),document.body.classList.toggle("ffz-menu-replace",this.settings.replace_twitch_menu),this.log("Hooking the Ember Chat Settings view.");var t=App.__container__.resolve("view:settings");if(t){t.reopen({didInsertElement:function(){this._super();try{this.ffzInit()}catch(t){e.error("ChatSettings didInsertElement: "+t)}},willClearRender:function(){try{this.ffzTeardown()}catch(t){e.error("ChatSettings willClearRender: "+t)}this._super()},ffzInit:function(){var t=this,s=this.get("element"),o=s&&s.querySelector(".dropmenu");if(o){var n,i,a,r=document.createElement("div"),d=document.createElement("div");r.className="list-header",r.innerHTML="FrankerFaceZ",d.className="chat-menu-content",n=document.createElement("p"),n.className="no-bttv",i=document.createElement("input"),i.type="checkbox",i.className="ember-checkbox ffz-setting-dark-twitch",i.checked=e.settings.dark_twitch,n.appendChild(i),n.appendChild(document.createTextNode("Dark Twitch")),d.appendChild(n),i.addEventListener("change",function(){e.settings.set("dark_twitch",this.checked)}),n=document.createElement("p"),a=document.createElement("a"),a.href="#",a.innerHTML="More Settings",n.appendChild(a),d.appendChild(n),a.addEventListener("click",function(s){return t.set("controller.model.hidden",!0),e._last_page="settings",e.build_ui_popup(e._chatv),s.stopPropagation(),!1}),o.appendChild(r),o.appendChild(d)}},ffzTeardown:function(){}});try{t.create().destroy()}catch(s){}for(var o in Ember.View.views)if(Ember.View.views.hasOwnProperty(o)){var n=Ember.View.views[o];if(n instanceof t){this.log("Manually updating existing Chat Settings view.",n);try{n.ffzInit()}catch(s){this.error("setup: ChatSettings ffzInit: "+s)}}}}},s.menu_pages={},s.prototype.build_ui_popup=function(e){var t=this._popup;if(t)return t.parentElement.removeChild(t),delete this._popup,this._popup_kill&&this._popup_kill(),void delete this._popup_kill;var n=document.createElement("div"),i=document.createElement("div"),a=document.createElement("ul"),r=this.has_bttv?BetterTTV.settings.get("darkenedMode"):!1;n.className="emoticon-selector chat-menu ffz-ui-popup",i.className="emoticon-selector-box dropmenu",n.appendChild(i),n.classList.toggle("dark",r);var d=document.createElement("div");d.className="ffz-ui-menu-page",i.appendChild(d),a.className="menu clearfix",i.appendChild(a);var u=document.createElement("li");u.className="title",u.innerHTML="<span>"+(o.DEBUG?"[DEV] ":"")+"FrankerFaceZ</span>",a.appendChild(u);var c=[];for(var l in s.menu_pages)if(s.menu_pages.hasOwnProperty(l)){var h=s.menu_pages[l];try{if(!h||h.hasOwnProperty("visible")&&(!h.visible||"function"==typeof h.visible&&!h.visible.bind(this)(e)))continue}catch(f){this.error("menu_pages "+l+" visible: "+f);continue}c.push([h.sort_order||0,l,h])}c.sort(function(e,t){if(e[0]<t[0])return 1;if(e[0]>t[0])return-1;var s=e[1].toLowerCase(),o=t[1].toLowerCase();return o>s?1:s>o?-1:0});for(var _=0;_<c.length;_++){var l=c[_][1],h=c[_][2],m=document.createElement("li"),p=document.createElement("a");m.className="item",m.id="ffz-menu-page-"+l,p.title=h.name,p.innerHTML=h.icon,jQuery(p).tipsy(),p.addEventListener("click",this._ui_change_page.bind(this,e,i,a,d,l)),m.appendChild(p),a.appendChild(m)}this._ui_change_page(e,i,a,d,this._last_page||"channel"),this._popup=n,d.style.maxHeight=Math.max(200,e.$().height()-172)+"px",e.$(".chat-interface").append(n)},s.prototype._ui_change_page=function(e,t,o,n,i){this._last_page=i,n.innerHTML="",n.setAttribute("data-page",i);var a=document.querySelector(".app-main")||document.querySelector(".ember-chat-container");t.style.maxWidth=!s.menu_pages[i].wide||"function"==typeof s.menu_pages[i].wide&&!s.menu_pages[i].wide.bind(this)()?"":(a.offsetWidth<640?a.offsetWidth-40:600)+"px";for(var r=o.querySelectorAll("li.active"),d=0;d<r.length;d++)r[d].classList.remove("active");var u=o.querySelector("#ffz-menu-page-"+i);u?u.classList.add("active"):this.log("No matching page: "+i),s.menu_pages[i].render.bind(this)(e,n)},s.menu_pages.channel={render:function(e,t){var o=e.get("controller.currentRoom.id"),a=this.rooms[o],r=!1;if(this.settings.replace_twitch_menu){var d=a.room.get("product");if(d&&!d.get("error")){r=!0;var u=App.__container__.resolve("model:ticket").find("user",{channel:o}),c=u?u.get("content"):!1,l=u?u.get("isLoaded"):!1,h=a.room.get("badgeSet.subscriber.image"),f=document.createElement("div"),_=document.createElement("div"),m=0;if(c=c&&c.length>0,u&&!c&&!l){var p=this;u.addObserver("isLoaded",function(){setTimeout(function(){"channel"===t.getAttribute("data-page")&&(t.innerHTML="",s.menu_pages.channel.render.bind(p)(e,t))},0)}),u.load()}f.className="emoticon-grid",_.className="heading",h&&(_.style.backgroundImage='url("'+h+'")'),_.innerHTML='<span class="right">Twitch</span>Subscriber Emoticons',f.appendChild(_);for(var g=d.get("emoticons")||[],v=0;v<g.length;v++){var b=g[v];if("active"===b.state){var y=document.createElement("span"),w=c||!b.subscriber_only,z='image-set(url("'+i+b.id+'/1.0") 1x, url("'+i+b.id+'/2.0") 2x, url("'+i+b.id+'/3.0") 4x)';y.className="emoticon tooltip"+(w?"":" locked"),y.style.backgroundImage='url("'+i+b.id+'/1.0")',y.style.backgroundImage="-webkit-"+z,y.style.backgroundImage="-moz-"+z,y.style.backgroundImage="-ms-"+z,y.style.backgroundImage=z,y.style.width=b.width+"px",y.style.height=b.height+"px",y.title=b.regex,w&&y.addEventListener("click",this._add_emote.bind(this,e,b.regex)),f.appendChild(y),m++}}if(m>0&&t.appendChild(f),m>0&&!c){var k=document.createElement("div"),E=document.createElement("div"),C=document.createElement("span"),T=document.createElement("a");k.className="subscribe-message",E.className="non-subscriber-message",k.appendChild(E),C.className="unlock-text",C.innerHTML="Subscribe to unlock Emoticons",E.appendChild(C),T.className="action subscribe-button button primary",T.href=d.get("product_url"),T.innerHTML='<span class="subscribe-text">Subscribe</span><span class="subscribe-price">'+d.get("price")+"</span>",E.appendChild(T),t.appendChild(k)}else if(m>0){var x=u.get("content");if(x=x.length>0?x[x.length-1]:void 0,x&&x.purchase_profile&&!x.purchase_profile.will_renew){var F=n.parse_date(x.access_end||"");k=document.createElement("div"),E=document.createElement("div"),C=document.createElement("span"),end_time=F?Math.floor((F.getTime()-Date.now())/1e3):null,k.className="subscribe-message",E.className="non-subscriber-message",k.appendChild(E),C.className="unlock-text",C.innerHTML="Subscription expires in "+n.time_to_string(end_time,!0,!0),E.appendChild(C),t.appendChild(k)}}}}var S=a&&a.extra_sets||[];this._emotes_for_sets(t,e,a&&a.set&&[a.set]||[],this.feature_friday||r||S.length?"Channel Emoticons":null,"http://cdn.frankerfacez.com/script/devicon.png","FrankerFaceZ");for(var v=0;v<S.length;v++){var L=this.emote_sets[S[v]],A=L?"Featured "+L.title:"Featured Channel";this._emotes_for_sets(t,e,[S[v]],A,"http://cdn.frankerfacez.com/script/devicon.png","FrankerFaceZ")}this._feature_friday_ui(o,t,e)},name:"Channel",icon:o.ZREKNARF},s.prototype._emotes_for_sets=function(e,t,s,o,n,i){var a=document.createElement("div"),r=0;if(a.className="emoticon-grid",null!=o){var d=document.createElement("div");if(d.className="heading",i){var u=document.createElement("span");u.className="right",u.appendChild(document.createTextNode(i)),d.appendChild(u)}d.appendChild(document.createTextNode(o)),n&&(d.style.backgroundImage='url("'+n+'")'),a.appendChild(d)}for(var c=[],l=0;l<s.length;l++){var h=this.emote_sets[s[l]];if(h&&h.emoticons)for(var f in h.emoticons)h.emoticons.hasOwnProperty(f)&&!h.emoticons[f].hidden&&c.push(h.emoticons[f])}c.sort(function(e,t){var s=e.name.toLowerCase(),o=t.name.toLowerCase();return o>s?-1:s>o?1:0});for(var l=0;l<c.length;l++){var _=c[l],m=null;(_.urls[2]||_.urls[4])&&(m='url("'+_.urls[1]+'") 1x',_.urls[2]&&(m+=', url("'+_.urls[2]+'") 2x'),_.urls[4]&&(m+=', url("'+_.urls[4]+'") 4x')),r++;var u=document.createElement("span");if(u.className="emoticon tooltip",u.style.backgroundImage='url("'+_.urls[1]+'")',m){var p="image-set("+m+")";u.style.backgroundImage="-webkit-"+p,u.style.backgroundImage="-moz-"+p,u.style.backgroundImage="-ms-"+p,u.style.backgroundImage=p}u.style.width=_.width+"px",u.style.height=_.height+"px",u.title=this._emote_tooltip(_),u.addEventListener("click",this._add_emote.bind(this,t,_.name)),a.appendChild(u)}r||(a.innerHTML+="This channel has no emoticons.",a.className="emoticon-grid ffz-no-emotes center"),e.appendChild(a)},s.prototype._add_emote=function(e,t){var s,o,n;this.has_bttv?(s=e.get("element").querySelector("textarea"),o=s.value):(n=e.get("controller.currentRoom"),o=n.get("messageToSend")||""),o+=(o&&" "!==o.substr(-1)?" ":"")+(t.name||t),s?s.value=o:n.set("messageToSend",o)}},{"../constants":3,"../utils":31}],24:[function(t){var s=e.FrankerFaceZ,o=t("../constants");s.prototype.build_ui_link=function(e){var t=document.createElement("a");return t.className="ffz-ui-toggle",t.innerHTML=o.CHAT_BUTTON,t.addEventListener("click",this.build_ui_popup.bind(this,e)),this.update_ui_link(t),t},s.prototype.update_ui_link=function(t){var s=e.App&&App.__container__.lookup("controller:chat");if(t=t||document.querySelector("a.ffz-ui-toggle"),t&&s){var o=s.get("currentRoom.id"),n=this.rooms[o],i=!1,a=this.has_bttv?BetterTTV.settings.get("darkenedMode"):!1,r=this.has_bttv?BetterTTV.settings.get("showBlueButtons"):!1,d=this.feature_friday&&this.feature_friday.live;if(n&&n.set){var u=this.emote_sets[n.set];u&&u.count>0&&(i=!0)}t.classList.toggle("no-emotes",!i),t.classList.toggle("live",d),t.classList.toggle("dark",a),t.classList.toggle("blue",r)}}},{"../constants":3}],25:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils"),i="http://static-cdn.jtvnw.net/emoticons/v1/";s.settings_info.global_emotes_in_menu={type:"boolean",value:!1,name:"Display Global Emotes in My Emotes",help:"Display the global Twitch emotes in the My Emoticons menu."},s.settings_info.emoji_in_menu={type:"boolean",value:!1,name:"Display Emoji in My Emotes",help:"Display the supported emoji images in the My Emoticons menu."},s.prototype.setup_my_emotes=function(){if(this._twitch_set_to_channel={},this._twitch_badges={},localStorage.ffzTwitchSets)try{this._twitch_set_to_channel=JSON.parse(localStorage.ffzTwitchSets),this._twitch_badges=JSON.parse(localStorage.ffzTwitchBadges)}catch(e){}this._twitch_set_to_channel[0]="global",this._twitch_set_to_channel[33]="turbo_faces",this._twitch_set_to_channel[42]="turbo_faces",this._twitch_badges.global="//cdn.frankerfacez.com/script/twitch_logo.png",this._twitch_badges.turbo_faces=this._twitch_badges.turbo="//cdn.frankerfacez.com/script/turbo_badge.png"},s.menu_pages.my_emotes={name:"My Emoticons",icon:o.EMOTE,visible:function(e){var t=this.get_user(),s=e.get("controller.currentRoom.tmiSession"),o=t&&this.users[t.login]&&this.users[t.login].sets||[],n=(s&&s.getEmotes()||{emoticon_sets:{}}).emoticon_sets;return o.length||n&&Object.keys(n).length},render:function(e,t){var o=e.get("controller.currentRoom.tmiSession"),n=(o&&o.getEmotes()||{emoticon_sets:{}}).emoticon_sets,i=[];for(var a in n)n.hasOwnProperty(a)&&!this._twitch_set_to_channel.hasOwnProperty(a)&&i.push(a);if(!i.length)return s.menu_pages.my_emotes.draw_menu.bind(this)(e,t,n);var r=this,d=function(){if(i.length){i=[];var o={};for(var a in n)r._twitch_set_to_channel[a]&&(o[a]=n[a]);return s.menu_pages.my_emotes.draw_menu.bind(r)(e,t,o)}};this.ws_send("twitch_sets",i,function(o,a){if(i.length){if(i=[],o){for(var u in a)a.hasOwnProperty(u)&&(r._twitch_set_to_channel[u]=a[u]);return localStorage.ffzTwitchSets=JSON.stringify(r._twitch_set_to_channel),s.menu_pages.my_emotes.draw_menu.bind(r)(e,t,n)}d()}})?setTimeout(d,2e3):d()},draw_emoji:function(e){var t=document.createElement("div"),s=document.createElement("div");t.className="heading",t.innerHTML='<span class="right">FrankerFaceZ</span>Emoji',s.className="emoticon-grid",s.appendChild(t);var n=[];for(var i in this.emoji_data)n.push(this.emoji_data[i]);n.sort(function(e,t){var s=e.short_name.toLowerCase(),o=t.short_name.toLowerCase();return o>s?-1:s>o?1:e.raw<t.raw?-1:e.raw>t.raw?1:0});for(var a=0;a<n.length;a++){var r=n[a],d=document.createElement("span"),u='image-set(url("'+r.src+'") 1x, url("'+o.SERVER+"emoji/"+r.code+'-2x.png") 2x, url("'+o.SERVER+"emoji/"+r.code+'-4x.png") 4x)';d.className="emoticon tooltip",d.title="Emoji: "+r.raw+"\nName: :"+r.short_name+":",d.addEventListener("click",this._add_emote.bind(this,e,r.raw)),d.style.backgroundImage='url("'+r.src+'")',d.style.backgroundImage="-webkit-"+u,d.style.backgroundImage="-moz-"+u,d.style.backgroundImage="-ms-"+u,d.style.backgroudnImage=u,s.appendChild(d)}return s},draw_twitch_set:function(e,t,a){var r,d=document.createElement("div"),u=document.createElement("div"),c=this._twitch_set_to_channel[t];if(r="global"===c?"Global Emoticons":"turbo"===c||"turbo_faces"===c?"Twitch Turbo":s.get_capitalization(c,function(e){d.innerHTML='<span class="right">Twitch</span>'+n.sanitize(e)}),d.className="heading",d.innerHTML='<span class="right">Twitch</span>'+n.sanitize(r),this._twitch_badges[c])d.style.backgroundImage='url("'+this._twitch_badges[c]+'")';else{var l=this;Twitch.api.get("chat/"+c+"/badges",null,{version:3}).done(function(e){e.subscriber&&e.subscriber.image&&(l._twitch_badges[c]=e.subscriber.image,localStorage.ffzTwitchBadges=JSON.stringify(l._twitch_badges),d.style.backgroundImage='url("'+e.subscriber.image+'")')})}u.className="emoticon-grid",u.appendChild(d),a.sort(function(e,t){var s=e.code.toLowerCase(),o=t.code.toLowerCase();return o>s?-1:s>o?1:e.id<t.id?-1:e.id>t.id?1:0});for(var h=0;h<a.length;h++){var f=a[h],_=o.KNOWN_CODES[f.code]||f.code,m=document.createElement("span"),p='image-set(url("'+i+f.id+'/1.0") 1x, url("'+i+f.id+'/2.0") 2x, url("'+i+f.id+'/3.0") 4x)';m.className="emoticon tooltip",this.settings.replace_bad_emotes&&o.EMOTE_REPLACEMENTS[f.id]?m.style.backgroundImage='url("'+o.EMOTE_REPLACEMENT_BASE+o.EMOTE_REPLACEMENTS[f.id]+'")':(m.style.backgroundImage='url("'+i+f.id+'/1.0")',m.style.backgroundImage="-webkit-"+p,m.style.backgroundImage="-moz-"+p,m.style.backgroundImage="-ms-"+p,m.style.backgroudnImage=p),m.title=_,m.addEventListener("click",this._add_emote.bind(this,e,_)),u.appendChild(m)}return u},draw_ffz_set:function(e,t){var s=document.createElement("div"),o=document.createElement("div"),n=[];s.className="heading",s.innerHTML='<span class="right">FrankerFaceZ</span>'+t.title,s.style.backgroundImage='url("'+(t.icon||"//cdn.frankerfacez.com/script/devicon.png")+'")',o.className="emoticon-grid",o.appendChild(s);for(var i in t.emoticons)t.emoticons.hasOwnProperty(i)&&!t.emoticons[i].hidden&&n.push(t.emoticons[i]);n.sort(function(e,t){var s=e.name.toLowerCase(),o=t.name.toLowerCase();return o>s?-1:s>o?1:e.id<t.id?-1:e.id>t.id?1:0});for(var a=0;a<n.length;a++){var r=n[a],d=document.createElement("span"),u='image-set(url("'+r.urls[1]+'") 1x';r.urls[2]&&(u+=', url("'+r.urls[2]+'") 2x'),r.urls[4]&&(u+=', url("'+r.urls[4]+'") 4x'),u+=")",d.className="emoticon tooltip",d.style.backgroundImage='url("'+r.urls[1]+'")',d.style.backgroundImage="-webkit-"+u,d.style.backgroundImage="-moz-"+u,d.style.backgroundImage="-ms-"+u,d.style.backgroudnImage=u,r.height&&(d.style.height=r.height+"px"),r.width&&(d.style.width=r.width+"px"),d.title=this._emote_tooltip(r),d.addEventListener("click",this._add_emote.bind(this,e,r.name)),o.appendChild(d)}return o},draw_menu:function(e,t,o){if("my_emotes"===t.getAttribute("data-page")){t.innerHTML="";try{var n=this.get_user(),i=this.getEmotes(n&&n.login,null),a=[];for(var r in o)if(o.hasOwnProperty(r)&&(this.settings.global_emotes_in_menu||"0"!==r)){var d=o[r];d.length&&a.push([this._twitch_set_to_channel[r],s.menu_pages.my_emotes.draw_twitch_set.bind(this)(e,r,d)])}this.settings.emoji_in_menu&&a.push(["emoji",s.menu_pages.my_emotes.draw_emoji.bind(this)(e)]);for(var u=0;u<i.length;u++){var r=i[u],d=this.emote_sets[r];d&&d.count&&(this.settings.global_emotes_in_menu||-1===this.default_sets.indexOf(r))&&a.push([d.title.toLowerCase(),s.menu_pages.my_emotes.draw_ffz_set.bind(this)(e,d)])}a.sort(function(e,t){var s=e[0],o=t[0];return"turbo"===s||"turbo_faces"===s?s="zza|"+s:("global"===s||"global emoticons"===s)&&(s="zzz|"+s),"turbo"===o||"turbo_faces"===o?o="zza|"+o:("global"===o||"global emoticons"===o)&&(o="zzz|"+o),o>s?-1:s>o?1:0});for(var u=0;u<a.length;u++)t.appendChild(a[u][1])}catch(c){this.error("my_emotes draw_menu: "+c),t.innerHTML="";var l=document.createElement("div"),h=document.createElement("div"),f=document.createElement("p");h.className="heading",h.innerHTML="Error Loading Menu",l.appendChild(h),f.className="clearfix",f.textContent=c,l.appendChild(f),l.className="chat-menu-content",t.appendChild(l)}}}}},{"../constants":3,"../utils":31}],26:[function(){var t=e.FrankerFaceZ;t.prototype.setup_notifications=function(){this.log("Adding event handler for window focus."),e.addEventListener("focus",this.clear_notifications.bind(this))},t.settings_info.highlight_notifications={type:"boolean",value:!1,category:"Chat",no_bttv:!0,name:"Highlight Notifications",help:"Display notifications when a highlighted word appears in chat in an unfocused tab. This is automatically disabled on the dashboard.",on_update:function(e,t){if(e&&t){if("denied"===Notification.permission)return this.log("Notifications have been denied by the user."),void this.settings.set("highlight_notifications",!1);if("granted"!==Notification.permission){var s=this;Notification.requestPermission(function(e){"denied"===e&&(s.log("Notifications have been denied by the user."),s.settings.set("highlight_notifications",!1))})}}}},t.ws_commands.message=function(e){this.show_message(e)},t._notifications={},t._last_notification=0,t.prototype.clear_notifications=function(){for(var e in t._notifications){var s=t._notifications[e];if(s)try{s.close()}catch(o){}}t._notifications={},t._last_notification=0},t.prototype.show_notification=function(e,s,o,n,i,a){var r=Notification.permission;if("denied "===r)return!1;if("granted"===r){s=s||"FrankerFaceZ",n=n||1e4;var d={lang:"en-US",dir:"ltr",body:e,tag:o||"FrankerFaceZ",icon:"http://cdn.frankerfacez.com/icon32.png"},u=this,c=new Notification(s,d),l=t._last_notification++;return t._notifications[l]=c,c.addEventListener("click",function(){delete t._notifications[l],i&&i.bind(u)()}),c.addEventListener("close",function(){delete t._notifications[l],a&&a.bind(u)()}),void("number"==typeof n&&c.addEventListener("show",function(){setTimeout(function(){delete t._notifications[l],c.close()},n)}))}var u=this;Notification.requestPermission(function(){u.show_notification(e,s,o)})},t.prototype.show_message=function(t){e.noty({text:t,theme:"ffzTheme",layout:"bottomCenter",closeWith:["button"]}).show()}},{}],27:[function(t){var s=e.FrankerFaceZ,o=t("../utils");s.prototype.setup_races=function(){this.log("Initializing race support."),this.srl_races={}},s.settings_info.srl_races={type:"boolean",value:!0,category:"Channel Metadata",name:"SRL Race Information",help:'Display information about <a href="http://www.speedrunslive.com/" target="_new">SpeedRunsLive</a> races under channels.',on_update:function(){this.rebuild_race_ui()
|
||
}},s.ws_on_close.push(function(){var t=e.App&&App.__container__.lookup("controller:channel"),s=t&&t.get("id"),o=t&&t.get("hostModeTarget.id"),n=!1;if(t){for(var i in this.srl_races)delete this.srl_races[i],(i===s||i===o)&&(n=!0);n&&this.rebuild_race_ui()}}),s.ws_commands.srl_race=function(e){var t=App.__container__.lookup("controller:channel"),s=t&&t.get("id"),o=t&&t.get("hostModeTarget.id"),n=!1;this.srl_races=this.srl_races||{};for(var i=0;i<e[0].length;i++){var a=e[0][i];this.srl_races[a]=e[1],(a===s||a===o)&&(n=!0)}if(e[1]){var r=e[1],d=r.twitch_entrants={};for(var u in r.entrants)r.entrants.hasOwnProperty(u)&&(r.entrants[u].channel&&(d[r.entrants[u].channel]=u),r.entrants[u].name=u)}n&&this.rebuild_race_ui()},s.prototype.rebuild_race_ui=function(){var e=App.__container__.lookup("controller:channel"),t=e&&e.get("id"),s=e&&e.get("hostModeTarget.id");if(this._cindex){if(t){var o=this.srl_races&&this.srl_races[t],n=this._cindex.get("element"),i=n&&n.querySelector(".stats-and-actions .channel-actions"),a=i&&i.querySelector("#ffz-ui-race");if(i&&this.settings.srl_races&&o){if(!a){a=document.createElement("span"),a.id="ffz-ui-race",a.setAttribute("data-channel",t);var r=document.createElement("span");r.className="button drop action",r.title="SpeedRunsLive Race",r.innerHTML='<span class="logo"></span>',r.addEventListener("click",this._build_race_popup.bind(this,a,t)),a.appendChild(r),i.appendChild(a)}this._update_race(a,!0)}else a&&a.parentElement.removeChild(a)}if(s){var o=this.srl_races&&this.srl_races[s],n=this._cindex.get("element"),i=n&&n.querySelector("#hostmode .channel-actions"),a=i&&i.querySelector("#ffz-ui-race");if(i&&this.settings.srl_races&&o){if(!a){a=document.createElement("span"),a.id="ffz-ui-race",a.setAttribute("data-channel",s);var r=document.createElement("span");r.className="button drop action",r.title="SpeedRunsLive Race",r.innerHTML='<span class="logo"></span>',r.addEventListener("click",this._build_race_popup.bind(this,a,s)),a.appendChild(r),i.appendChild(a)}this._update_race(a,!0)}else a&&a.parentElement.removeChild(a)}}},s.prototype._race_kill=function(){this._race_timer&&(clearTimeout(this._race_timer),delete this._race_timer),delete this._race_game,delete this._race_goal},s.prototype._build_race_popup=function(e,t){var o=this._popup;if((!o||(o.parentElement.removeChild(o),delete this._popup,this._popup_kill&&this._popup_kill(),delete this._popup_kill,"ffz-race-popup"!==o.id||o.getAttribute("data-channel")!==t))&&e){var n=e.querySelector(".button"),i=n.offsetLeft+n.offsetWidth,a=this.srl_races[t],o=document.createElement("div"),r="";o.id="ffz-race-popup",o.setAttribute("data-channel",t),o.className=(i>=300?"right":"left")+" share dropmenu",this._popup_kill=this._race_kill.bind(this),this._popup=o;var d="http://kadgar.net/live",u=!1;for(var c in a.entrants){var l=a.entrants[c].state;a.entrants.hasOwnProperty(c)&&a.entrants[c].channel&&("racing"==l||"entered"==l)&&(d+="/"+a.entrants[c].channel,u=!0)}var h=document.querySelector(".app-main.theatre")?document.body.clientHeight-300:e.parentElement.offsetTop-175,f=App.__container__.lookup("controller:channel"),_=f?f.get("display_name"):s.get_capitalization(t),m=encodeURIComponent("I'm watching "+_+" race "+a.goal+" in "+a.game+" on SpeedRunsLive!");r='<div class="heading"><div></div><span></span></div>',r+='<div class="table" style="max-height:'+h+'px"><table><thead><tr><th>#</th><th>Entrant</th><th> </th><th>Time</th></tr></thead>',r+="<tbody></tbody></table></div>",r+='<div class="divider"></div>',r+='<iframe class="twitter_share_button" style="width:130px; height:25px" src="https://platform.twitter.com/widgets/tweet_button.html?text='+m+"%20Watch%20at&via=Twitch&url=http://www.twitch.tv/"+t+'"></iframe>',r+='<p class="right"><a target="_new" href="http://www.speedrunslive.com/race/?id='+a.id+'">SRL</a>',u&&(r+=' <a target="_new" href="'+d+'">Multitwitch</a>'),r+="</p>",o.innerHTML=r,e.appendChild(o),this._update_race(e,!0)}},s.prototype._update_race=function(e,t){if(this._race_timer&&t&&(clearTimeout(this._race_timer),delete this._race_timer),e){var s=e.getAttribute("data-channel"),n=this.srl_races[s];if(!n)return e.parentElement.removeChild(e),void(this._popup&&"ffz-race-popup"===this._popup.id&&this._popup.getAttribute("data-channel")===s&&(this._popup_kill&&this._popup_kill(),this._popup&&(delete this._popup,delete this._popup_kill)));var i=n.twitch_entrants[s],a=n.entrants[i],r=e.querySelector("#ffz-race-popup"),d=Date.now()/1e3,u=Math.floor(d-n.time);if(e.querySelector(".logo").innerHTML=o.placement(a),r){var c=r.querySelector("tbody"),l=r.querySelector(".heading span"),h=r.querySelector(".heading div");c.innerHTML="";var f=[],_=!0;for(var m in n.entrants)n.entrants.hasOwnProperty(m)&&("racing"==n.entrants[m].state&&(_=!1),f.push(n.entrants[m]));f.sort(function(e,t){var s=e.place||9999,o=t.place||9999,n=e.time||u,i=t.time||u;return("forfeit"==e.state||"dq"==e.state)&&(s=1e4),("forfeit"==t.state||"dq"==t.state)&&(o=1e4),o>s?-1:s>o?1:e.name<t.name?-1:e.name>t.name?1:i>n?-1:n>i?1:void 0});for(var p=0;p<f.length;p++){var m=f[p],g='<a target="_new" href="http://www.speedrunslive.com/profiles/#!/'+o.sanitize(m.name)+'">'+m.display_name+"</a>",v=m.channel?'<a target="_new" class="twitch" href="http://www.twitch.tv/'+o.sanitize(m.channel)+'"></a>':"",b=m.hitbox?'<a target="_new" class="hitbox" href="http://www.hitbox.tv/'+o.sanitize(m.hitbox)+'"></a>':"",y=u?o.time_to_string(m.time||u):"",w=o.place_string(m.place),z=m.comment?o.sanitize(m.comment):"";c.innerHTML+="<tr"+(z?' title="'+z+'"':"")+' class="'+m.state+'"><td>'+w+"</td><td>"+g+"</td><td>"+v+b+'</td><td class="time">'+("forfeit"==m.state?"Forfeit":y)+"</td></tr>"}if(this._race_game!=n.game||this._race_goal!=n.goal){this._race_game=n.game,this._race_goal=n.goal;var k=o.sanitize(n.game),E=o.sanitize(n.goal);h.innerHTML='<h2 title="'+k+'">'+k+"</h2><b>Goal: </b>"+E}u?_?l.innerHTML="Done":(l.innerHTML=o.time_to_string(u),this._race_timer=setTimeout(this._update_race.bind(this,e),1e3)):l.innerHTML="Entry Open"}}}},{"../utils":31}],28:[function(t){var s=e.FrankerFaceZ,o=t("../constants");s.prototype.setup_css=function(){this.log("Injecting main FrankerFaceZ CSS.");var e=this._main_style=document.createElement("link");e.id="ffz-ui-css",e.setAttribute("rel","stylesheet"),e.setAttribute("href",o.SERVER+"script/style.css?_="+(o.DEBUG?Date.now():s.version_info)),document.head.appendChild(e),jQuery.noty.themes.ffzTheme={name:"ffzTheme",style:function(){this.$bar.removeClass().addClass("noty_bar").addClass("ffz-noty").addClass(this.options.type)},callback:{onShow:function(){},onClose:function(){}}}}},{"../constants":3}],29:[function(t){{var s=e.FrankerFaceZ,o=t("../constants");t("../utils")}s.prototype._update_subscribers=function(){this._update_subscribers_timer&&(clearTimeout(this._update_subscribers_timer),delete this._update_subscribers_timer),this._update_subscribers_timer=setTimeout(this._update_subscribers.bind(this),6e4);var e=this.get_user(),t=this,s=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0,n=this.is_dashboard&&s&&s[1];if(this.has_bttv||!n||n!==e.login){var i=document.querySelector("#ffz-sub-display");return void(i&&i.parentElement.removeChild(i))}jQuery.ajax({url:"/broadcast/dashboard/partnership"}).done(function(e){try{var s,i=document.createElement("span");i.innerHTML=e,s=i.querySelector("#dash_main");var a=s&&s.textContent.match(/([\d,\.]+) total active subscribers/),r=a&&a[1];if(!r){var d=document.querySelector("#ffz-sub-display");return d&&d.parentElement.removeChild(d),void(t._update_subscribers_timer&&(clearTimeout(t._update_subscribers_timer),delete t._update_subscribers_timer))}var d=document.querySelector("#ffz-sub-display span");if(!d){var u=document.querySelector(t.is_dashboard?"#stats":"#channel .stats-and-actions .channel-stats");if(!u)return;var c=document.createElement("span");c.className="ffz stat",c.id="ffz-sub-display",c.title="Active Channel Subscribers",c.innerHTML=o.STAR+" ",d=document.createElement("span"),c.appendChild(d),Twitch.api.get("chat/"+n+"/badges",null,{version:3}).done(function(e){e.subscriber&&e.subscriber.image&&(c.innerHTML="",c.appendChild(d),c.style.backgroundImage='url("'+e.subscriber.image+'")',c.style.backgroundRepeat="no-repeat",c.style.paddingLeft="23px",c.style.backgroundPosition="0 50%")}),u.appendChild(c),jQuery(c).tipsy(t.is_dashboard?{gravity:"s"}:void 0)}d.innerHTML=r}catch(l){t.error("_update_subscribers: "+l)}}).fail(function(){var e=document.querySelector("#ffz-sub-display");e&&e.parentElement.removeChild(e)})}},{"../constants":3,"../utils":31}],30:[function(t){var s=e.FrankerFaceZ,o=t("../constants"),n=t("../utils");s.ws_commands.chatters=function(t){{var s=t[0],o=t[1],n=e.App&&App.__container__.lookup("controller:channel"),i=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0;this.is_dashboard?i&&i[1]:n&&n.get&&n.get("id")}if(!this.is_dashboard){var a=this.rooms&&this.rooms[s];return void(a&&(a.ffz_chatters=o,this._cindex&&this._cindex.ffzUpdateChatters()))}this._dash_chatters=o},s.ws_commands.viewers=function(t){var s=t[0],i=t[1],a=e.App&&App.__container__.lookup("controller:channel"),r=this.is_dashboard?location.pathname.match(/\/([^\/]+)/):void 0,d=this.is_dashboard?r&&r[1]:a&&a.get&&a.get("id");if(!this.is_dashboard){var u=this.rooms&&this.rooms[s];return void(u&&(u.ffz_viewers=i,this._cindex&&this._cindex.ffzUpdateChatters()))}if(this._dash_viewers=i,this.settings.chatter_count&&d===s){var c=document.querySelector("#ffz-ffzchatter-display"),l=o.ZREKNARF+" "+n.number_commas(i)+("number"==typeof this._dash_chatters?" ("+n.number_commas(this._dash_chatters)+")":"");if(c)c.innerHTML=l;else{var h=document.querySelector("#stats");if(!h)return;c=document.createElement("span"),c.id="ffz-ffzchatter-display",c.className="ffz stat",c.title="Viewers (In Chat) with FrankerFaceZ",c.innerHTML=l,h.appendChild(c),jQuery(c).tipsy(this.is_dashboard?{gravity:"s"}:void 0)}}}},{"../constants":3,"../utils":31}],31:[function(t,s){var o=(e.FrankerFaceZ,t("./constants"),{}),n=document.createElement("span"),i=function(e,t,s){return s=s||"s",t=t||"",1===e?t:s},a=function(e){return 1==e?"1st":2==e?"2nd":3==e?"3rd":null==e?"---":e+"th"},r=function(e,t){t=0===t?0:t||1,t=Math.round(255*-(t/100));var s=Math.max(0,Math.min(255,e[0]-t)),o=Math.max(0,Math.min(255,e[1]-t)),n=Math.max(0,Math.min(255,e[2]-t));return[s,o,n]},d=function(e){return"rgb("+e[0]+", "+e[1]+", "+e[2]+")"},u=function(e,t){return t=0===t?0:t||1,r(e,-t)},c=function(e){e=[e[0]/255,e[1]/255,e[2]/255];for(var t=0;t<e.length;t++)e[t]=e[t]<=.03928?e[t]/12.92:Math.pow((e[t]+.055)/1.055,2.4);return.2126*e[0]+.7152*e[1]+.0722*e[2]},l=/^(\d{4}|\+\d{6})(?:-?(\d{2})(?:-?(\d{2})(?:T(\d{2})(?::?(\d{2})(?::?(\d{2})(?:(?:\.|,)(\d{1,}))?)?)?(Z|([\-+])(\d{2})(?::?(\d{2}))?)?)?)?)?$/,h=function(e){var t=e.match(l);if(!t)return null;t[7]=t[7]&&t[7].length?t[7].substr(0,3):0;var s=Date.UTC(t[1],t[2]-1,t[3],t[4],t[5],t[6],t[7]);if(t[9]){var o=6e4*("-"==t[9]?1:-1)*(60*t[10]+1*t[11]);s+=o}return new Date(s)},f=function(e){e=$.trim(e);var t={raw:e},s=-1;"@"===e.charAt(0)&&(s=e.indexOf(" "),t.tags=e.substr(1,s-1));var o=s+1,n=-1;":"===e.charAt(o)&&(n=e.indexOf(" ",o),t.prefix=e.substr(o+1,n-(o+1)));var i=e.indexOf(" :",o);i>=0?t.trailing=e.substr(i+2):i=e.length;var a=e.substr(n+1,i-n-1).split(" ");return t.command=a[0],a.length>1&&(t.params=a.slice(1)),t},_={":":";",s:" ",r:"\r",n:"\n","\\":"\\"},m=function(e){for(var t="",s=0;s<e.length;s++){var o=e.charAt(s);if("\\"===o){if(s===e.length-1)throw"Improperly escaped tag";if(o=_[e.charAt(s+1)],void 0===o)throw"Improperly escaped tag";s++}t+=o}return t},p=function(e,t){switch(e){case"slow":try{return parseInt(t)}catch(s){return 0}case"subs-only":case"r9k":case"subscriber":case"turbo":return"1"===t;default:try{return m(t)}catch(s){return""}}},g=function(e){for(var t={},s=e.split(";"),o=0;o<s.length;++o){var n=s[o].split("=");2===n.length&&(t[n[0]]=p(n[0],n[1]))}return t},v={},b=function(e,t){if(v[e]&&v[e][t])return v[e][t];for(var s="️"===t?e.slice(0,-1):3===e.length&&"️"===e.charAt(1)?e.charAt(0)+e.charAt(2):e,o=[],n=0,i=0,a=0;a<s.length;)n=s.charCodeAt(a++),i?(o.push((65536+(i-55296<<10)+(n-56320)).toString(16)),i=0):n>=55296&&56319>=n?i=n:o.push(n.toString(16));var r=v[e]=v[e]||{},d=r[t]=o.join("-");return d};s.exports={update_css:function(e,t,s){var o=e.innerHTML,n="/*BEGIN "+t+"*/",i="/*END "+t+"*/",a=o.indexOf(n),r=o.indexOf(i),d=-1!==a&&-1!==r&&r>a;(d||s)&&(d&&(o=o.substr(0,a)+o.substr(r+i.length)),s&&(o+=n+s+i),e.innerHTML=o)},splitIRCMessage:f,parseIRCTags:g,emoji_to_codepoint:b,get_luminance:c,brighten:r,darken:u,rgb_to_css:d,parse_date:h,number_commas:function(e){var t=e.toString().split(".");return t[0]=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),t.join(".")},place_string:a,placement:function(e){return"forfeit"==e.state?"Forfeit":"dq"==e.state?"DQed":e.place?a(e.place):""},sanitize:function(e){var t=o[e];return t||(n.textContent=e,t=o[e]=n.innerHTML,n.innerHTML=""),t},date_string:function(e){return e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate()},pluralize:i,human_time:function(e){e=Math.floor(e);var t=Math.floor(e/31536e3);if(t)return t+" year"+i(t);var s=Math.floor((e%=31536e3)/86400);if(s)return s+" day"+i(s);var o=Math.floor((e%=86400)/3600);if(o)return o+" hour"+i(o);var n=Math.floor((e%=3600)/60);if(n)return n+" minute"+i(n);var a=e%60;return a?a+" second"+i(a):"less than a second"},time_to_string:function(e,t,s,o){var n=e%60,i=Math.floor(e/60),a=Math.floor(i/60),r="";if(i%=60,t){if(r=Math.floor(a/24),a%=24,s&&r>0)return r+" days";r=r>0?r+" days, ":""}return r+(!o||r||a?(10>a?"0":"")+a+":":"")+(10>i?"0":"")+i+":"+(10>n?"0":"")+n}}},{"./constants":3}]},{},[15]),e.ffz=new FrankerFaceZ}(window); |