From 5f61b7a39084d6357b15320c917953f648c9056a Mon Sep 17 00:00:00 2001 From: Tyler Vigario Date: Mon, 1 Jun 2020 20:43:11 -0700 Subject: [PATCH] Add linting --- static/js/main.js | 8 +- templates/index.html | 2 +- web/.editorconfig | 12 + web/.eslintrc.json | 36 + web/package-lock.json | 1136 +++++++++++++++++++++++ web/package.json | 8 + web/src/js/app.mjs | 30 +- web/src/js/index.mjs | 18 - web/src/js/main.mjs | 1642 +++++++++++++++++----------------- web/src/js/theme.mjs | 32 +- web/src/js/util.js | 17 + web/src/templates/index.html | 5 +- 12 files changed, 2077 insertions(+), 869 deletions(-) create mode 100644 web/.editorconfig create mode 100644 web/.eslintrc.json delete mode 100644 web/src/js/index.mjs create mode 100644 web/src/js/util.js diff --git a/static/js/main.js b/static/js/main.js index 6d930c7..0132396 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1,4 +1,4 @@ -!function(e){var c={};function t(n){if(c[n])return c[n].exports;var a=c[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=c,t.d=function(e,c,n){t.o(e,c)||Object.defineProperty(e,c,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,c){if(1&c&&(e=t(e)),8&c)return e;if(4&c&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&c&&"string"!=typeof e)for(var a in e)t.d(n,a,function(c){return e[c]}.bind(null,a));return n},t.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(c,"a",c),c},t.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},t.p="",t(t.s=152)}([function(e,c,t){var n; +!function(e){var c={};function t(n){if(c[n])return c[n].exports;var a=c[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=c,t.d=function(e,c,n){t.o(e,c)||Object.defineProperty(e,c,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,c){if(1&c&&(e=t(e)),8&c)return e;if(4&c&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&c&&"string"!=typeof e)for(var a in e)t.d(n,a,function(c){return e[c]}.bind(null,a));return n},t.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(c,"a",c),c},t.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},t.p="",t(t.s=156)}([function(e,c,t){var n; /*! * jQuery JavaScript Library v3.5.1 * https://jquery.com/ @@ -22,7 +22,7 @@ * * Date: 2020-03-14 */ -function(e){var c,t,n,a,i,r,o,l,s,f,h,u,m,v,p,d,z,g,M,y="sizzle"+1*new Date,x=e.document,C=0,b=0,H=le(),V=le(),L=le(),N=le(),w=function(e,c){return e===c&&(h=!0),0},S={}.hasOwnProperty,A=[],T=A.pop,k=A.push,_=A.push,E=A.slice,j=function(e,c){for(var t=0,n=e.length;t+~]|"+O+")"+O+"*"),Q=new RegExp(O+"|>"),W=new RegExp(I),$=new RegExp("^"+P+"$"),U={ID:new RegExp("^#("+P+")"),CLASS:new RegExp("^\\.("+P+")"),TAG:new RegExp("^("+P+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^"+O+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,ce=new RegExp("\\\\[\\da-fA-F]{1,6}"+O+"?|\\\\([^\\r\\n\\f])","g"),te=function(e,c){var t="0x"+e.slice(1)-65536;return c||(t<0?String.fromCharCode(t+65536):String.fromCharCode(t>>10|55296,1023&t|56320))},ne=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ae=function(e,c){return c?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){u()},re=ye((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{_.apply(A=E.call(x.childNodes),x.childNodes),A[x.childNodes.length].nodeType}catch(e){_={apply:A.length?function(e,c){k.apply(e,E.call(c))}:function(e,c){for(var t=e.length,n=0;e[t++]=c[n++];);e.length=t-1}}}function oe(e,c,n,a){var i,o,s,f,h,v,z,g=c&&c.ownerDocument,x=c?c.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return n;if(!a&&(u(c),c=c||m,p)){if(11!==x&&(h=J.exec(e)))if(i=h[1]){if(9===x){if(!(s=c.getElementById(i)))return n;if(s.id===i)return n.push(s),n}else if(g&&(s=g.getElementById(i))&&M(c,s)&&s.id===i)return n.push(s),n}else{if(h[2])return _.apply(n,c.getElementsByTagName(e)),n;if((i=h[3])&&t.getElementsByClassName&&c.getElementsByClassName)return _.apply(n,c.getElementsByClassName(i)),n}if(t.qsa&&!N[e+" "]&&(!d||!d.test(e))&&(1!==x||"object"!==c.nodeName.toLowerCase())){if(z=e,g=c,1===x&&(Q.test(e)||Z.test(e))){for((g=ee.test(e)&&ze(c.parentNode)||c)===c&&t.scope||((f=c.getAttribute("id"))?f=f.replace(ne,ae):c.setAttribute("id",f=y)),o=(v=r(e)).length;o--;)v[o]=(f?"#"+f:":scope")+" "+Me(v[o]);z=v.join(",")}try{return _.apply(n,g.querySelectorAll(z)),n}catch(c){N(e,!0)}finally{f===y&&c.removeAttribute("id")}}}return l(e.replace(F,"$1"),c,n,a)}function le(){var e=[];return function c(t,a){return e.push(t+" ")>n.cacheLength&&delete c[e.shift()],c[t+" "]=a}}function se(e){return e[y]=!0,e}function fe(e){var c=m.createElement("fieldset");try{return!!e(c)}catch(e){return!1}finally{c.parentNode&&c.parentNode.removeChild(c),c=null}}function he(e,c){for(var t=e.split("|"),a=t.length;a--;)n.attrHandle[t[a]]=c}function ue(e,c){var t=c&&e,n=t&&1===e.nodeType&&1===c.nodeType&&e.sourceIndex-c.sourceIndex;if(n)return n;if(t)for(;t=t.nextSibling;)if(t===c)return-1;return e?1:-1}function me(e){return function(c){return"input"===c.nodeName.toLowerCase()&&c.type===e}}function ve(e){return function(c){var t=c.nodeName.toLowerCase();return("input"===t||"button"===t)&&c.type===e}}function pe(e){return function(c){return"form"in c?c.parentNode&&!1===c.disabled?"label"in c?"label"in c.parentNode?c.parentNode.disabled===e:c.disabled===e:c.isDisabled===e||c.isDisabled!==!e&&re(c)===e:c.disabled===e:"label"in c&&c.disabled===e}}function de(e){return se((function(c){return c=+c,se((function(t,n){for(var a,i=e([],t.length,c),r=i.length;r--;)t[a=i[r]]&&(t[a]=!(n[a]=t[a]))}))}))}function ze(e){return e&&void 0!==e.getElementsByTagName&&e}for(c in t=oe.support={},i=oe.isXML=function(e){var c=e.namespaceURI,t=(e.ownerDocument||e).documentElement;return!G.test(c||t&&t.nodeName||"HTML")},u=oe.setDocument=function(e){var c,a,r=e?e.ownerDocument||e:x;return r!=m&&9===r.nodeType&&r.documentElement?(v=(m=r).documentElement,p=!i(m),x!=m&&(a=m.defaultView)&&a.top!==a&&(a.addEventListener?a.addEventListener("unload",ie,!1):a.attachEvent&&a.attachEvent("onunload",ie)),t.scope=fe((function(e){return v.appendChild(e).appendChild(m.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),t.attributes=fe((function(e){return e.className="i",!e.getAttribute("className")})),t.getElementsByTagName=fe((function(e){return e.appendChild(m.createComment("")),!e.getElementsByTagName("*").length})),t.getElementsByClassName=K.test(m.getElementsByClassName),t.getById=fe((function(e){return v.appendChild(e).id=y,!m.getElementsByName||!m.getElementsByName(y).length})),t.getById?(n.filter.ID=function(e){var c=e.replace(ce,te);return function(e){return e.getAttribute("id")===c}},n.find.ID=function(e,c){if(void 0!==c.getElementById&&p){var t=c.getElementById(e);return t?[t]:[]}}):(n.filter.ID=function(e){var c=e.replace(ce,te);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===c}},n.find.ID=function(e,c){if(void 0!==c.getElementById&&p){var t,n,a,i=c.getElementById(e);if(i){if((t=i.getAttributeNode("id"))&&t.value===e)return[i];for(a=c.getElementsByName(e),n=0;i=a[n++];)if((t=i.getAttributeNode("id"))&&t.value===e)return[i]}return[]}}),n.find.TAG=t.getElementsByTagName?function(e,c){return void 0!==c.getElementsByTagName?c.getElementsByTagName(e):t.qsa?c.querySelectorAll(e):void 0}:function(e,c){var t,n=[],a=0,i=c.getElementsByTagName(e);if("*"===e){for(;t=i[a++];)1===t.nodeType&&n.push(t);return n}return i},n.find.CLASS=t.getElementsByClassName&&function(e,c){if(void 0!==c.getElementsByClassName&&p)return c.getElementsByClassName(e)},z=[],d=[],(t.qsa=K.test(m.querySelectorAll))&&(fe((function(e){var c;v.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&d.push("[*^$]="+O+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||d.push("\\["+O+"*(?:value|"+D+")"),e.querySelectorAll("[id~="+y+"-]").length||d.push("~="),(c=m.createElement("input")).setAttribute("name",""),e.appendChild(c),e.querySelectorAll("[name='']").length||d.push("\\["+O+"*name"+O+"*="+O+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||d.push(":checked"),e.querySelectorAll("a#"+y+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll("\\\f"),d.push("[\\r\\n\\f]")})),fe((function(e){e.innerHTML="";var c=m.createElement("input");c.setAttribute("type","hidden"),e.appendChild(c).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&d.push("name"+O+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&d.push(":enabled",":disabled"),v.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")}))),(t.matchesSelector=K.test(g=v.matches||v.webkitMatchesSelector||v.mozMatchesSelector||v.oMatchesSelector||v.msMatchesSelector))&&fe((function(e){t.disconnectedMatch=g.call(e,"*"),g.call(e,"[s!='']:x"),z.push("!=",I)})),d=d.length&&new RegExp(d.join("|")),z=z.length&&new RegExp(z.join("|")),c=K.test(v.compareDocumentPosition),M=c||K.test(v.contains)?function(e,c){var t=9===e.nodeType?e.documentElement:e,n=c&&c.parentNode;return e===n||!(!n||1!==n.nodeType||!(t.contains?t.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))}:function(e,c){if(c)for(;c=c.parentNode;)if(c===e)return!0;return!1},w=c?function(e,c){if(e===c)return h=!0,0;var n=!e.compareDocumentPosition-!c.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(c.ownerDocument||c)?e.compareDocumentPosition(c):1)||!t.sortDetached&&c.compareDocumentPosition(e)===n?e==m||e.ownerDocument==x&&M(x,e)?-1:c==m||c.ownerDocument==x&&M(x,c)?1:f?j(f,e)-j(f,c):0:4&n?-1:1)}:function(e,c){if(e===c)return h=!0,0;var t,n=0,a=e.parentNode,i=c.parentNode,r=[e],o=[c];if(!a||!i)return e==m?-1:c==m?1:a?-1:i?1:f?j(f,e)-j(f,c):0;if(a===i)return ue(e,c);for(t=e;t=t.parentNode;)r.unshift(t);for(t=c;t=t.parentNode;)o.unshift(t);for(;r[n]===o[n];)n++;return n?ue(r[n],o[n]):r[n]==x?-1:o[n]==x?1:0},m):m},oe.matches=function(e,c){return oe(e,null,null,c)},oe.matchesSelector=function(e,c){if(u(e),t.matchesSelector&&p&&!N[c+" "]&&(!z||!z.test(c))&&(!d||!d.test(c)))try{var n=g.call(e,c);if(n||t.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(c,!0)}return oe(c,m,null,[e]).length>0},oe.contains=function(e,c){return(e.ownerDocument||e)!=m&&u(e),M(e,c)},oe.attr=function(e,c){(e.ownerDocument||e)!=m&&u(e);var a=n.attrHandle[c.toLowerCase()],i=a&&S.call(n.attrHandle,c.toLowerCase())?a(e,c,!p):void 0;return void 0!==i?i:t.attributes||!p?e.getAttribute(c):(i=e.getAttributeNode(c))&&i.specified?i.value:null},oe.escape=function(e){return(e+"").replace(ne,ae)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var c,n=[],a=0,i=0;if(h=!t.detectDuplicates,f=!t.sortStable&&e.slice(0),e.sort(w),h){for(;c=e[i++];)c===e[i]&&(a=n.push(i));for(;a--;)e.splice(n[a],1)}return f=null,e},a=oe.getText=function(e){var c,t="",n=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)t+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;c=e[n++];)t+=a(c);return t},(n=oe.selectors={cacheLength:50,createPseudo:se,match:U,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ce,te),e[3]=(e[3]||e[4]||e[5]||"").replace(ce,te),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var c,t=!e[6]&&e[2];return U.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":t&&W.test(t)&&(c=r(t,!0))&&(c=t.indexOf(")",t.length-c)-t.length)&&(e[0]=e[0].slice(0,c),e[2]=t.slice(0,c)),e.slice(0,3))}},filter:{TAG:function(e){var c=e.replace(ce,te).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===c}},CLASS:function(e){var c=H[e+" "];return c||(c=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&H(e,(function(e){return c.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,c,t){return function(n){var a=oe.attr(n,e);return null==a?"!="===c:!c||(a+="","="===c?a===t:"!="===c?a!==t:"^="===c?t&&0===a.indexOf(t):"*="===c?t&&a.indexOf(t)>-1:"$="===c?t&&a.slice(-t.length)===t:"~="===c?(" "+a.replace(R," ")+" ").indexOf(t)>-1:"|="===c&&(a===t||a.slice(0,t.length+1)===t+"-"))}},CHILD:function(e,c,t,n,a){var i="nth"!==e.slice(0,3),r="last"!==e.slice(-4),o="of-type"===c;return 1===n&&0===a?function(e){return!!e.parentNode}:function(c,t,l){var s,f,h,u,m,v,p=i!==r?"nextSibling":"previousSibling",d=c.parentNode,z=o&&c.nodeName.toLowerCase(),g=!l&&!o,M=!1;if(d){if(i){for(;p;){for(u=c;u=u[p];)if(o?u.nodeName.toLowerCase()===z:1===u.nodeType)return!1;v=p="only"===e&&!v&&"nextSibling"}return!0}if(v=[r?d.firstChild:d.lastChild],r&&g){for(M=(m=(s=(f=(h=(u=d)[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]||[])[0]===C&&s[1])&&s[2],u=m&&d.childNodes[m];u=++m&&u&&u[p]||(M=m=0)||v.pop();)if(1===u.nodeType&&++M&&u===c){f[e]=[C,m,M];break}}else if(g&&(M=m=(s=(f=(h=(u=c)[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]||[])[0]===C&&s[1]),!1===M)for(;(u=++m&&u&&u[p]||(M=m=0)||v.pop())&&((o?u.nodeName.toLowerCase()!==z:1!==u.nodeType)||!++M||(g&&((f=(h=u[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]=[C,M]),u!==c)););return(M-=a)===n||M%n==0&&M/n>=0}}},PSEUDO:function(e,c){var t,a=n.pseudos[e]||n.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return a[y]?a(c):a.length>1?(t=[e,e,"",c],n.setFilters.hasOwnProperty(e.toLowerCase())?se((function(e,t){for(var n,i=a(e,c),r=i.length;r--;)e[n=j(e,i[r])]=!(t[n]=i[r])})):function(e){return a(e,0,t)}):a}},pseudos:{not:se((function(e){var c=[],t=[],n=o(e.replace(F,"$1"));return n[y]?se((function(e,c,t,a){for(var i,r=n(e,null,a,[]),o=e.length;o--;)(i=r[o])&&(e[o]=!(c[o]=i))})):function(e,a,i){return c[0]=e,n(c,null,i,t),c[0]=null,!t.pop()}})),has:se((function(e){return function(c){return oe(e,c).length>0}})),contains:se((function(e){return e=e.replace(ce,te),function(c){return(c.textContent||a(c)).indexOf(e)>-1}})),lang:se((function(e){return $.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(ce,te).toLowerCase(),function(c){var t;do{if(t=p?c.lang:c.getAttribute("xml:lang")||c.getAttribute("lang"))return(t=t.toLowerCase())===e||0===t.indexOf(e+"-")}while((c=c.parentNode)&&1===c.nodeType);return!1}})),target:function(c){var t=e.location&&e.location.hash;return t&&t.slice(1)===c.id},root:function(e){return e===v},focus:function(e){return e===m.activeElement&&(!m.hasFocus||m.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var c=e.nodeName.toLowerCase();return"input"===c&&!!e.checked||"option"===c&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!n.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return X.test(e.nodeName)},button:function(e){var c=e.nodeName.toLowerCase();return"input"===c&&"button"===e.type||"button"===c},text:function(e){var c;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(c=e.getAttribute("type"))||"text"===c.toLowerCase())},first:de((function(){return[0]})),last:de((function(e,c){return[c-1]})),eq:de((function(e,c,t){return[t<0?t+c:t]})),even:de((function(e,c){for(var t=0;tc?c:t;--n>=0;)e.push(n);return e})),gt:de((function(e,c,t){for(var n=t<0?t+c:t;++n1?function(c,t,n){for(var a=e.length;a--;)if(!e[a](c,t,n))return!1;return!0}:e[0]}function Ce(e,c,t,n,a){for(var i,r=[],o=0,l=e.length,s=null!=c;o-1&&(i[s]=!(r[s]=h))}}else z=Ce(z===r?z.splice(v,z.length):z),a?a(null,r,z,l):_.apply(r,z)}))}function He(e){for(var c,t,a,i=e.length,r=n.relative[e[0].type],o=r||n.relative[" "],l=r?1:0,f=ye((function(e){return e===c}),o,!0),h=ye((function(e){return j(c,e)>-1}),o,!0),u=[function(e,t,n){var a=!r&&(n||t!==s)||((c=t).nodeType?f(e,t,n):h(e,t,n));return c=null,a}];l1&&xe(u),l>1&&Me(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(F,"$1"),t,l0,a=e.length>0,i=function(i,r,o,l,f){var h,v,d,z=0,g="0",M=i&&[],y=[],x=s,b=i||a&&n.find.TAG("*",f),H=C+=null==x?1:Math.random()||.1,V=b.length;for(f&&(s=r==m||r||f);g!==V&&null!=(h=b[g]);g++){if(a&&h){for(v=0,r||h.ownerDocument==m||(u(h),o=!p);d=e[v++];)if(d(h,r||m,o)){l.push(h);break}f&&(C=H)}t&&((h=!d&&h)&&z--,i&&M.push(h))}if(z+=g,t&&g!==z){for(v=0;d=c[v++];)d(M,y,r,o);if(i){if(z>0)for(;g--;)M[g]||y[g]||(y[g]=T.call(l));y=Ce(y)}_.apply(l,y),f&&!i&&y.length>0&&z+c.length>1&&oe.uniqueSort(l)}return f&&(C=H,s=x),M};return t?se(i):i}(i,a))).selector=e}return o},l=oe.select=function(e,c,t,a){var i,l,s,f,h,u="function"==typeof e&&e,m=!a&&r(e=u.selector||e);if(t=t||[],1===m.length){if((l=m[0]=m[0].slice(0)).length>2&&"ID"===(s=l[0]).type&&9===c.nodeType&&p&&n.relative[l[1].type]){if(!(c=(n.find.ID(s.matches[0].replace(ce,te),c)||[])[0]))return t;u&&(c=c.parentNode),e=e.slice(l.shift().value.length)}for(i=U.needsContext.test(e)?0:l.length;i--&&(s=l[i],!n.relative[f=s.type]);)if((h=n.find[f])&&(a=h(s.matches[0].replace(ce,te),ee.test(l[0].type)&&ze(c.parentNode)||c))){if(l.splice(i,1),!(e=a.length&&Me(l)))return _.apply(t,a),t;break}}return(u||o(e,m))(a,c,!p,t,!c||ee.test(e)&&ze(c.parentNode)||c),t},t.sortStable=y.split("").sort(w).join("")===y,t.detectDuplicates=!!h,u(),t.sortDetached=fe((function(e){return 1&e.compareDocumentPosition(m.createElement("fieldset"))})),fe((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||he("type|href|height|width",(function(e,c,t){if(!t)return e.getAttribute(c,"type"===c.toLowerCase()?1:2)})),t.attributes&&fe((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||he("value",(function(e,c,t){if(!t&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),fe((function(e){return null==e.getAttribute("disabled")}))||he(D,(function(e,c,t){var n;if(!t)return!0===e[c]?c.toLowerCase():(n=e.getAttributeNode(c))&&n.specified?n.value:null})),oe}(t);b.find=V,b.expr=V.selectors,b.expr[":"]=b.expr.pseudos,b.uniqueSort=b.unique=V.uniqueSort,b.text=V.getText,b.isXMLDoc=V.isXML,b.contains=V.contains,b.escapeSelector=V.escape;var L=function(e,c,t){for(var n=[],a=void 0!==t;(e=e[c])&&9!==e.nodeType;)if(1===e.nodeType){if(a&&b(e).is(t))break;n.push(e)}return n},N=function(e,c){for(var t=[];e;e=e.nextSibling)1===e.nodeType&&e!==c&&t.push(e);return t},w=b.expr.match.needsContext;function S(e,c){return e.nodeName&&e.nodeName.toLowerCase()===c.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,c,t){return z(c)?b.grep(e,(function(e,n){return!!c.call(e,n,e)!==t})):c.nodeType?b.grep(e,(function(e){return e===c!==t})):"string"!=typeof c?b.grep(e,(function(e){return f.call(c,e)>-1!==t})):b.filter(c,e,t)}b.filter=function(e,c,t){var n=c[0];return t&&(e=":not("+e+")"),1===c.length&&1===n.nodeType?b.find.matchesSelector(n,e)?[n]:[]:b.find.matches(e,b.grep(c,(function(e){return 1===e.nodeType})))},b.fn.extend({find:function(e){var c,t,n=this.length,a=this;if("string"!=typeof e)return this.pushStack(b(e).filter((function(){for(c=0;c1?b.uniqueSort(t):t},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&w.test(e)?b(e):e||[],!1).length}});var k,_=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(b.fn.init=function(e,c,t){var n,a;if(!e)return this;if(t=t||k,"string"==typeof e){if(!(n="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:_.exec(e))||!n[1]&&c)return!c||c.jquery?(c||t).find(e):this.constructor(c).find(e);if(n[1]){if(c=c instanceof b?c[0]:c,b.merge(this,b.parseHTML(n[1],c&&c.nodeType?c.ownerDocument||c:M,!0)),A.test(n[1])&&b.isPlainObject(c))for(n in c)z(this[n])?this[n](c[n]):this.attr(n,c[n]);return this}return(a=M.getElementById(n[2]))&&(this[0]=a,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):z(e)?void 0!==t.ready?t.ready(e):e(b):b.makeArray(e,this)}).prototype=b.fn,k=b(M);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function D(e,c){for(;(e=e[c])&&1!==e.nodeType;);return e}b.fn.extend({has:function(e){var c=b(e,this),t=c.length;return this.filter((function(){for(var e=0;e-1:1===t.nodeType&&b.find.matchesSelector(t,e))){i.push(t);break}return this.pushStack(i.length>1?b.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?f.call(b(e),this[0]):f.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,c){return this.pushStack(b.uniqueSort(b.merge(this.get(),b(e,c))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.each({parent:function(e){var c=e.parentNode;return c&&11!==c.nodeType?c:null},parents:function(e){return L(e,"parentNode")},parentsUntil:function(e,c,t){return L(e,"parentNode",t)},next:function(e){return D(e,"nextSibling")},prev:function(e){return D(e,"previousSibling")},nextAll:function(e){return L(e,"nextSibling")},prevAll:function(e){return L(e,"previousSibling")},nextUntil:function(e,c,t){return L(e,"nextSibling",t)},prevUntil:function(e,c,t){return L(e,"previousSibling",t)},siblings:function(e){return N((e.parentNode||{}).firstChild,e)},children:function(e){return N(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(S(e,"template")&&(e=e.content||e),b.merge([],e.childNodes))}},(function(e,c){b.fn[e]=function(t,n){var a=b.map(this,c,t);return"Until"!==e.slice(-5)&&(n=t),n&&"string"==typeof n&&(a=b.filter(n,a)),this.length>1&&(j[e]||b.uniqueSort(a),E.test(e)&&a.reverse()),this.pushStack(a)}}));var O=/[^\x20\t\r\n\f]+/g;function P(e){return e}function q(e){throw e}function I(e,c,t,n){var a;try{e&&z(a=e.promise)?a.call(e).done(c).fail(t):e&&z(a=e.then)?a.call(e,c,t):c.apply(void 0,[e].slice(n))}catch(e){t.apply(void 0,[e])}}b.Callbacks=function(e){e="string"==typeof e?function(e){var c={};return b.each(e.match(O)||[],(function(e,t){c[t]=!0})),c}(e):b.extend({},e);var c,t,n,a,i=[],r=[],o=-1,l=function(){for(a=a||e.once,n=c=!0;r.length;o=-1)for(t=r.shift();++o-1;)i.splice(t,1),t<=o&&o--})),this},has:function(e){return e?b.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return a=r=[],i=t="",this},disabled:function(){return!i},lock:function(){return a=r=[],t||c||(i=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],r.push(t),c||l()),this},fire:function(){return s.fireWith(this,arguments),this},fired:function(){return!!n}};return s},b.extend({Deferred:function(e){var c=[["notify","progress",b.Callbacks("memory"),b.Callbacks("memory"),2],["resolve","done",b.Callbacks("once memory"),b.Callbacks("once memory"),0,"resolved"],["reject","fail",b.Callbacks("once memory"),b.Callbacks("once memory"),1,"rejected"]],n="pending",a={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return a.then(null,e)},pipe:function(){var e=arguments;return b.Deferred((function(t){b.each(c,(function(c,n){var a=z(e[n[4]])&&e[n[4]];i[n[1]]((function(){var e=a&&a.apply(this,arguments);e&&z(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[n[0]+"With"](this,a?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,a){var i=0;function r(e,c,n,a){return function(){var o=this,l=arguments,s=function(){var t,s;if(!(e=i&&(n!==q&&(o=void 0,l=[t]),c.rejectWith(o,l))}};e?f():(b.Deferred.getStackHook&&(f.stackTrace=b.Deferred.getStackHook()),t.setTimeout(f))}}return b.Deferred((function(t){c[0][3].add(r(0,t,z(a)?a:P,t.notifyWith)),c[1][3].add(r(0,t,z(e)?e:P)),c[2][3].add(r(0,t,z(n)?n:q))})).promise()},promise:function(e){return null!=e?b.extend(e,a):a}},i={};return b.each(c,(function(e,t){var r=t[2],o=t[5];a[t[1]]=r.add,o&&r.add((function(){n=o}),c[3-e][2].disable,c[3-e][3].disable,c[0][2].lock,c[0][3].lock),r.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=r.fireWith})),a.promise(i),e&&e.call(i,i),i},when:function(e){var c=arguments.length,t=c,n=Array(t),a=o.call(arguments),i=b.Deferred(),r=function(e){return function(t){n[e]=this,a[e]=arguments.length>1?o.call(arguments):t,--c||i.resolveWith(n,a)}};if(c<=1&&(I(e,i.done(r(t)).resolve,i.reject,!c),"pending"===i.state()||z(a[t]&&a[t].then)))return i.then();for(;t--;)I(a[t],r(t),i.reject);return i.promise()}});var R=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;b.Deferred.exceptionHook=function(e,c){t.console&&t.console.warn&&e&&R.test(e.name)&&t.console.warn("jQuery.Deferred exception: "+e.message,e.stack,c)},b.readyException=function(e){t.setTimeout((function(){throw e}))};var F=b.Deferred();function B(){M.removeEventListener("DOMContentLoaded",B),t.removeEventListener("load",B),b.ready()}b.fn.ready=function(e){return F.then(e).catch((function(e){b.readyException(e)})),this},b.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--b.readyWait:b.isReady)||(b.isReady=!0,!0!==e&&--b.readyWait>0||F.resolveWith(M,[b]))}}),b.ready.then=F.then,"complete"===M.readyState||"loading"!==M.readyState&&!M.documentElement.doScroll?t.setTimeout(b.ready):(M.addEventListener("DOMContentLoaded",B),t.addEventListener("load",B));var Z=function(e,c,t,n,a,i,r){var o=0,l=e.length,s=null==t;if("object"===C(t))for(o in a=!0,t)Z(e,c,o,t[o],!0,i,r);else if(void 0!==n&&(a=!0,z(n)||(r=!0),s&&(r?(c.call(e,n),c=null):(s=c,c=function(e,c,t){return s.call(b(e),t)})),c))for(;o1,null,!0)},removeData:function(e){return this.each((function(){K.remove(this,e)}))}}),b.extend({queue:function(e,c,t){var n;if(e)return c=(c||"fx")+"queue",n=Y.get(e,c),t&&(!n||Array.isArray(t)?n=Y.access(e,c,b.makeArray(t)):n.push(t)),n||[]},dequeue:function(e,c){c=c||"fx";var t=b.queue(e,c),n=t.length,a=t.shift(),i=b._queueHooks(e,c);"inprogress"===a&&(a=t.shift(),n--),a&&("fx"===c&&t.unshift("inprogress"),delete i.stop,a.call(e,(function(){b.dequeue(e,c)}),i)),!n&&i&&i.empty.fire()},_queueHooks:function(e,c){var t=c+"queueHooks";return Y.get(e,t)||Y.access(e,t,{empty:b.Callbacks("once memory").add((function(){Y.remove(e,[c+"queue",t])}))})}}),b.fn.extend({queue:function(e,c){var t=2;return"string"!=typeof e&&(c=e,e="fx",t--),arguments.length\x20\t\r\n\f]*)/i,ze=/^$|^module$|\/(?:java|ecma)script/i;me=M.createDocumentFragment().appendChild(M.createElement("div")),(ve=M.createElement("input")).setAttribute("type","radio"),ve.setAttribute("checked","checked"),ve.setAttribute("name","t"),me.appendChild(ve),d.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="",d.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue,me.innerHTML="",d.option=!!me.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Me(e,c){var t;return t=void 0!==e.getElementsByTagName?e.getElementsByTagName(c||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(c||"*"):[],void 0===c||c&&S(e,c)?b.merge([e],t):t}function ye(e,c){for(var t=0,n=e.length;t",""]);var xe=/<|&#?\w+;/;function Ce(e,c,t,n,a){for(var i,r,o,l,s,f,h=c.createDocumentFragment(),u=[],m=0,v=e.length;m-1)a&&a.push(i);else if(s=re(i),r=Me(h.appendChild(i),"script"),s&&ye(r),t)for(f=0;i=r[f++];)ze.test(i.type||"")&&t.push(i);return h}var be=/^key/,He=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ve=/^([^.]*)(?:\.(.+)|)/;function Le(){return!0}function Ne(){return!1}function we(e,c){return e===function(){try{return M.activeElement}catch(e){}}()==("focus"===c)}function Se(e,c,t,n,a,i){var r,o;if("object"==typeof c){for(o in"string"!=typeof t&&(n=n||t,t=void 0),c)Se(e,o,t,n,c[o],i);return e}if(null==n&&null==a?(a=t,n=t=void 0):null==a&&("string"==typeof t?(a=n,n=void 0):(a=n,n=t,t=void 0)),!1===a)a=Ne;else if(!a)return e;return 1===i&&(r=a,(a=function(e){return b().off(e),r.apply(this,arguments)}).guid=r.guid||(r.guid=b.guid++)),e.each((function(){b.event.add(this,c,a,n,t)}))}function Ae(e,c,t){t?(Y.set(e,c,!1),b.event.add(e,c,{namespace:!1,handler:function(e){var n,a,i=Y.get(this,c);if(1&e.isTrigger&&this[c]){if(i.length)(b.event.special[c]||{}).delegateType&&e.stopPropagation();else if(i=o.call(arguments),Y.set(this,c,i),n=t(this,c),this[c](),i!==(a=Y.get(this,c))||n?Y.set(this,c,!1):a={},i!==a)return e.stopImmediatePropagation(),e.preventDefault(),a.value}else i.length&&(Y.set(this,c,{value:b.event.trigger(b.extend(i[0],b.Event.prototype),i.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,c)&&b.event.add(e,c,Le)}b.event={global:{},add:function(e,c,t,n,a){var i,r,o,l,s,f,h,u,m,v,p,d=Y.get(e);if(G(e))for(t.handler&&(t=(i=t).handler,a=i.selector),a&&b.find.matchesSelector(ie,a),t.guid||(t.guid=b.guid++),(l=d.events)||(l=d.events=Object.create(null)),(r=d.handle)||(r=d.handle=function(c){return void 0!==b&&b.event.triggered!==c.type?b.event.dispatch.apply(e,arguments):void 0}),s=(c=(c||"").match(O)||[""]).length;s--;)m=p=(o=Ve.exec(c[s])||[])[1],v=(o[2]||"").split(".").sort(),m&&(h=b.event.special[m]||{},m=(a?h.delegateType:h.bindType)||m,h=b.event.special[m]||{},f=b.extend({type:m,origType:p,data:n,handler:t,guid:t.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:v.join(".")},i),(u=l[m])||((u=l[m]=[]).delegateCount=0,h.setup&&!1!==h.setup.call(e,n,v,r)||e.addEventListener&&e.addEventListener(m,r)),h.add&&(h.add.call(e,f),f.handler.guid||(f.handler.guid=t.guid)),a?u.splice(u.delegateCount++,0,f):u.push(f),b.event.global[m]=!0)},remove:function(e,c,t,n,a){var i,r,o,l,s,f,h,u,m,v,p,d=Y.hasData(e)&&Y.get(e);if(d&&(l=d.events)){for(s=(c=(c||"").match(O)||[""]).length;s--;)if(m=p=(o=Ve.exec(c[s])||[])[1],v=(o[2]||"").split(".").sort(),m){for(h=b.event.special[m]||{},u=l[m=(n?h.delegateType:h.bindType)||m]||[],o=o[2]&&new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"),r=i=u.length;i--;)f=u[i],!a&&p!==f.origType||t&&t.guid!==f.guid||o&&!o.test(f.namespace)||n&&n!==f.selector&&("**"!==n||!f.selector)||(u.splice(i,1),f.selector&&u.delegateCount--,h.remove&&h.remove.call(e,f));r&&!u.length&&(h.teardown&&!1!==h.teardown.call(e,v,d.handle)||b.removeEvent(e,m,d.handle),delete l[m])}else for(m in l)b.event.remove(e,m+c[s],t,n,!0);b.isEmptyObject(l)&&Y.remove(e,"handle events")}},dispatch:function(e){var c,t,n,a,i,r,o=new Array(arguments.length),l=b.event.fix(e),s=(Y.get(this,"events")||Object.create(null))[l.type]||[],f=b.event.special[l.type]||{};for(o[0]=l,c=1;c=1))for(;s!==this;s=s.parentNode||this)if(1===s.nodeType&&("click"!==e.type||!0!==s.disabled)){for(i=[],r={},t=0;t-1:b.find(a,this,null,[s]).length),r[a]&&i.push(n);i.length&&o.push({elem:s,handlers:i})}return s=this,l\s*$/g;function Ee(e,c){return S(e,"table")&&S(11!==c.nodeType?c:c.firstChild,"tr")&&b(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function De(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,c){var t,n,a,i,r,o;if(1===c.nodeType){if(Y.hasData(e)&&(o=Y.get(e).events))for(a in Y.remove(c,"handle events"),o)for(t=0,n=o[a].length;t1&&"string"==typeof v&&!d.checkClone&&ke.test(v))return e.each((function(a){var i=e.eq(a);p&&(c[0]=v.call(this,a,i.html())),qe(i,c,t,n)}));if(u&&(i=(a=Ce(c,e[0].ownerDocument,!1,e,n)).firstChild,1===a.childNodes.length&&(a=i),i||n)){for(o=(r=b.map(Me(a,"script"),je)).length;h0&&ye(r,!l&&Me(e,"script")),o},cleanData:function(e){for(var c,t,n,a=b.event.special,i=0;void 0!==(t=e[i]);i++)if(G(t)){if(c=t[Y.expando]){if(c.events)for(n in c.events)a[n]?b.event.remove(t,n):b.removeEvent(t,n,c.handle);t[Y.expando]=void 0}t[K.expando]&&(t[K.expando]=void 0)}}}),b.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return Z(this,(function(e){return void 0===e?b.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return qe(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ee(this,e).appendChild(e)}))},prepend:function(){return qe(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var c=Ee(this,e);c.insertBefore(e,c.firstChild)}}))},before:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,c=0;null!=(e=this[c]);c++)1===e.nodeType&&(b.cleanData(Me(e,!1)),e.textContent="");return this},clone:function(e,c){return e=null!=e&&e,c=null==c?e:c,this.map((function(){return b.clone(this,e,c)}))},html:function(e){return Z(this,(function(e){var c=this[0]||{},t=0,n=this.length;if(void 0===e&&1===c.nodeType)return c.innerHTML;if("string"==typeof e&&!Te.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=b.htmlPrefilter(e);try{for(;t3,ie.removeChild(e)),o}}))}();var $e=["Webkit","Moz","ms"],Ue=M.createElement("div").style,Ge={};function Xe(e){var c=b.cssProps[e]||Ge[e];return c||(e in Ue?e:Ge[e]=function(e){for(var c=e[0].toUpperCase()+e.slice(1),t=$e.length;t--;)if((e=$e[t]+c)in Ue)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Ke=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},ec={letterSpacing:"0",fontWeight:"400"};function cc(e,c,t){var n=ne.exec(c);return n?Math.max(0,n[2]-(t||0))+(n[3]||"px"):c}function tc(e,c,t,n,a,i){var r="width"===c?1:0,o=0,l=0;if(t===(n?"border":"content"))return 0;for(;r<4;r+=2)"margin"===t&&(l+=b.css(e,t+ae[r],!0,a)),n?("content"===t&&(l-=b.css(e,"padding"+ae[r],!0,a)),"margin"!==t&&(l-=b.css(e,"border"+ae[r]+"Width",!0,a))):(l+=b.css(e,"padding"+ae[r],!0,a),"padding"!==t?l+=b.css(e,"border"+ae[r]+"Width",!0,a):o+=b.css(e,"border"+ae[r]+"Width",!0,a));return!n&&i>=0&&(l+=Math.max(0,Math.ceil(e["offset"+c[0].toUpperCase()+c.slice(1)]-i-l-o-.5))||0),l}function nc(e,c,t){var n=Fe(e),a=(!d.boxSizingReliable()||t)&&"border-box"===b.css(e,"boxSizing",!1,n),i=a,r=Qe(e,c,n),o="offset"+c[0].toUpperCase()+c.slice(1);if(Re.test(r)){if(!t)return r;r="auto"}return(!d.boxSizingReliable()&&a||!d.reliableTrDimensions()&&S(e,"tr")||"auto"===r||!parseFloat(r)&&"inline"===b.css(e,"display",!1,n))&&e.getClientRects().length&&(a="border-box"===b.css(e,"boxSizing",!1,n),(i=o in e)&&(r=e[o])),(r=parseFloat(r)||0)+tc(e,c,t||(a?"border":"content"),i,n,r)+"px"}function ac(e,c,t,n,a){return new ac.prototype.init(e,c,t,n,a)}b.extend({cssHooks:{opacity:{get:function(e,c){if(c){var t=Qe(e,"opacity");return""===t?"1":t}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,c,t,n){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var a,i,r,o=U(c),l=Ke.test(c),s=e.style;if(l||(c=Xe(o)),r=b.cssHooks[c]||b.cssHooks[o],void 0===t)return r&&"get"in r&&void 0!==(a=r.get(e,!1,n))?a:s[c];"string"===(i=typeof t)&&(a=ne.exec(t))&&a[1]&&(t=se(e,c,a),i="number"),null!=t&&t==t&&("number"!==i||l||(t+=a&&a[3]||(b.cssNumber[o]?"":"px")),d.clearCloneStyle||""!==t||0!==c.indexOf("background")||(s[c]="inherit"),r&&"set"in r&&void 0===(t=r.set(e,t,n))||(l?s.setProperty(c,t):s[c]=t))}},css:function(e,c,t,n){var a,i,r,o=U(c);return Ke.test(c)||(c=Xe(o)),(r=b.cssHooks[c]||b.cssHooks[o])&&"get"in r&&(a=r.get(e,!0,t)),void 0===a&&(a=Qe(e,c,n)),"normal"===a&&c in ec&&(a=ec[c]),""===t||t?(i=parseFloat(a),!0===t||isFinite(i)?i||0:a):a}}),b.each(["height","width"],(function(e,c){b.cssHooks[c]={get:function(e,t,n){if(t)return!Ye.test(b.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?nc(e,c,n):Be(e,Je,(function(){return nc(e,c,n)}))},set:function(e,t,n){var a,i=Fe(e),r=!d.scrollboxSize()&&"absolute"===i.position,o=(r||n)&&"border-box"===b.css(e,"boxSizing",!1,i),l=n?tc(e,c,n,o,i):0;return o&&r&&(l-=Math.ceil(e["offset"+c[0].toUpperCase()+c.slice(1)]-parseFloat(i[c])-tc(e,c,"border",!1,i)-.5)),l&&(a=ne.exec(t))&&"px"!==(a[3]||"px")&&(e.style[c]=t,t=b.css(e,c)),cc(0,t,l)}}})),b.cssHooks.marginLeft=We(d.reliableMarginLeft,(function(e,c){if(c)return(parseFloat(Qe(e,"marginLeft"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),b.each({margin:"",padding:"",border:"Width"},(function(e,c){b.cssHooks[e+c]={expand:function(t){for(var n=0,a={},i="string"==typeof t?t.split(" "):[t];n<4;n++)a[e+ae[n]+c]=i[n]||i[n-2]||i[0];return a}},"margin"!==e&&(b.cssHooks[e+c].set=cc)})),b.fn.extend({css:function(e,c){return Z(this,(function(e,c,t){var n,a,i={},r=0;if(Array.isArray(c)){for(n=Fe(e),a=c.length;r1)}}),b.Tween=ac,ac.prototype={constructor:ac,init:function(e,c,t,n,a,i){this.elem=e,this.prop=t,this.easing=a||b.easing._default,this.options=c,this.start=this.now=this.cur(),this.end=n,this.unit=i||(b.cssNumber[t]?"":"px")},cur:function(){var e=ac.propHooks[this.prop];return e&&e.get?e.get(this):ac.propHooks._default.get(this)},run:function(e){var c,t=ac.propHooks[this.prop];return this.options.duration?this.pos=c=b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=c=e,this.now=(this.end-this.start)*c+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),t&&t.set?t.set(this):ac.propHooks._default.set(this),this}},ac.prototype.init.prototype=ac.prototype,ac.propHooks={_default:{get:function(e){var c;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(c=b.css(e.elem,e.prop,""))&&"auto"!==c?c:0},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):1!==e.elem.nodeType||!b.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:b.style(e.elem,e.prop,e.now+e.unit)}}},ac.propHooks.scrollTop=ac.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},b.fx=ac.prototype.init,b.fx.step={};var ic,rc,oc=/^(?:toggle|show|hide)$/,lc=/queueHooks$/;function sc(){rc&&(!1===M.hidden&&t.requestAnimationFrame?t.requestAnimationFrame(sc):t.setTimeout(sc,b.fx.interval),b.fx.tick())}function fc(){return t.setTimeout((function(){ic=void 0})),ic=Date.now()}function hc(e,c){var t,n=0,a={height:e};for(c=c?1:0;n<4;n+=2-c)a["margin"+(t=ae[n])]=a["padding"+t]=e;return c&&(a.opacity=a.width=e),a}function uc(e,c,t){for(var n,a=(mc.tweeners[c]||[]).concat(mc.tweeners["*"]),i=0,r=a.length;i1)},removeAttr:function(e){return this.each((function(){b.removeAttr(this,e)}))}}),b.extend({attr:function(e,c,t){var n,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return void 0===e.getAttribute?b.prop(e,c,t):(1===i&&b.isXMLDoc(e)||(a=b.attrHooks[c.toLowerCase()]||(b.expr.match.bool.test(c)?vc:void 0)),void 0!==t?null===t?void b.removeAttr(e,c):a&&"set"in a&&void 0!==(n=a.set(e,t,c))?n:(e.setAttribute(c,t+""),t):a&&"get"in a&&null!==(n=a.get(e,c))?n:null==(n=b.find.attr(e,c))?void 0:n)},attrHooks:{type:{set:function(e,c){if(!d.radioValue&&"radio"===c&&S(e,"input")){var t=e.value;return e.setAttribute("type",c),t&&(e.value=t),c}}}},removeAttr:function(e,c){var t,n=0,a=c&&c.match(O);if(a&&1===e.nodeType)for(;t=a[n++];)e.removeAttribute(t)}}),vc={set:function(e,c,t){return!1===c?b.removeAttr(e,t):e.setAttribute(t,t),t}},b.each(b.expr.match.bool.source.match(/\w+/g),(function(e,c){var t=pc[c]||b.find.attr;pc[c]=function(e,c,n){var a,i,r=c.toLowerCase();return n||(i=pc[r],pc[r]=a,a=null!=t(e,c,n)?r:null,pc[r]=i),a}}));var dc=/^(?:input|select|textarea|button)$/i,zc=/^(?:a|area)$/i;function gc(e){return(e.match(O)||[]).join(" ")}function Mc(e){return e.getAttribute&&e.getAttribute("class")||""}function yc(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(O)||[]}b.fn.extend({prop:function(e,c){return Z(this,b.prop,e,c,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[b.propFix[e]||e]}))}}),b.extend({prop:function(e,c,t){var n,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&b.isXMLDoc(e)||(c=b.propFix[c]||c,a=b.propHooks[c]),void 0!==t?a&&"set"in a&&void 0!==(n=a.set(e,t,c))?n:e[c]=t:a&&"get"in a&&null!==(n=a.get(e,c))?n:e[c]},propHooks:{tabIndex:{get:function(e){var c=b.find.attr(e,"tabindex");return c?parseInt(c,10):dc.test(e.nodeName)||zc.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),d.optSelected||(b.propHooks.selected={get:function(e){var c=e.parentNode;return c&&c.parentNode&&c.parentNode.selectedIndex,null},set:function(e){var c=e.parentNode;c&&(c.selectedIndex,c.parentNode&&c.parentNode.selectedIndex)}}),b.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){b.propFix[this.toLowerCase()]=this})),b.fn.extend({addClass:function(e){var c,t,n,a,i,r,o,l=0;if(z(e))return this.each((function(c){b(this).addClass(e.call(this,c,Mc(this)))}));if((c=yc(e)).length)for(;t=this[l++];)if(a=Mc(t),n=1===t.nodeType&&" "+gc(a)+" "){for(r=0;i=c[r++];)n.indexOf(" "+i+" ")<0&&(n+=i+" ");a!==(o=gc(n))&&t.setAttribute("class",o)}return this},removeClass:function(e){var c,t,n,a,i,r,o,l=0;if(z(e))return this.each((function(c){b(this).removeClass(e.call(this,c,Mc(this)))}));if(!arguments.length)return this.attr("class","");if((c=yc(e)).length)for(;t=this[l++];)if(a=Mc(t),n=1===t.nodeType&&" "+gc(a)+" "){for(r=0;i=c[r++];)for(;n.indexOf(" "+i+" ")>-1;)n=n.replace(" "+i+" "," ");a!==(o=gc(n))&&t.setAttribute("class",o)}return this},toggleClass:function(e,c){var t=typeof e,n="string"===t||Array.isArray(e);return"boolean"==typeof c&&n?c?this.addClass(e):this.removeClass(e):z(e)?this.each((function(t){b(this).toggleClass(e.call(this,t,Mc(this),c),c)})):this.each((function(){var c,a,i,r;if(n)for(a=0,i=b(this),r=yc(e);c=r[a++];)i.hasClass(c)?i.removeClass(c):i.addClass(c);else void 0!==e&&"boolean"!==t||((c=Mc(this))&&Y.set(this,"__className__",c),this.setAttribute&&this.setAttribute("class",c||!1===e?"":Y.get(this,"__className__")||""))}))},hasClass:function(e){var c,t,n=0;for(c=" "+e+" ";t=this[n++];)if(1===t.nodeType&&(" "+gc(Mc(t))+" ").indexOf(c)>-1)return!0;return!1}});var xc=/\r/g;b.fn.extend({val:function(e){var c,t,n,a=this[0];return arguments.length?(n=z(e),this.each((function(t){var a;1===this.nodeType&&(null==(a=n?e.call(this,t,b(this).val()):e)?a="":"number"==typeof a?a+="":Array.isArray(a)&&(a=b.map(a,(function(e){return null==e?"":e+""}))),(c=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()])&&"set"in c&&void 0!==c.set(this,a,"value")||(this.value=a))}))):a?(c=b.valHooks[a.type]||b.valHooks[a.nodeName.toLowerCase()])&&"get"in c&&void 0!==(t=c.get(a,"value"))?t:"string"==typeof(t=a.value)?t.replace(xc,""):null==t?"":t:void 0}}),b.extend({valHooks:{option:{get:function(e){var c=b.find.attr(e,"value");return null!=c?c:gc(b.text(e))}},select:{get:function(e){var c,t,n,a=e.options,i=e.selectedIndex,r="select-one"===e.type,o=r?null:[],l=r?i+1:a.length;for(n=i<0?l:r?i:0;n-1)&&(t=!0);return t||(e.selectedIndex=-1),i}}}}),b.each(["radio","checkbox"],(function(){b.valHooks[this]={set:function(e,c){if(Array.isArray(c))return e.checked=b.inArray(b(e).val(),c)>-1}},d.checkOn||(b.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),d.focusin="onfocusin"in t;var Cc=/^(?:focusinfocus|focusoutblur)$/,bc=function(e){e.stopPropagation()};b.extend(b.event,{trigger:function(e,c,n,a){var i,r,o,l,s,f,h,u,v=[n||M],p=m.call(e,"type")?e.type:e,d=m.call(e,"namespace")?e.namespace.split("."):[];if(r=u=o=n=n||M,3!==n.nodeType&&8!==n.nodeType&&!Cc.test(p+b.event.triggered)&&(p.indexOf(".")>-1&&(d=p.split("."),p=d.shift(),d.sort()),s=p.indexOf(":")<0&&"on"+p,(e=e[b.expando]?e:new b.Event(p,"object"==typeof e&&e)).isTrigger=a?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),c=null==c?[e]:b.makeArray(c,[e]),h=b.event.special[p]||{},a||!h.trigger||!1!==h.trigger.apply(n,c))){if(!a&&!h.noBubble&&!g(n)){for(l=h.delegateType||p,Cc.test(l+p)||(r=r.parentNode);r;r=r.parentNode)v.push(r),o=r;o===(n.ownerDocument||M)&&v.push(o.defaultView||o.parentWindow||t)}for(i=0;(r=v[i++])&&!e.isPropagationStopped();)u=r,e.type=i>1?l:h.bindType||p,(f=(Y.get(r,"events")||Object.create(null))[e.type]&&Y.get(r,"handle"))&&f.apply(r,c),(f=s&&r[s])&&f.apply&&G(r)&&(e.result=f.apply(r,c),!1===e.result&&e.preventDefault());return e.type=p,a||e.isDefaultPrevented()||h._default&&!1!==h._default.apply(v.pop(),c)||!G(n)||s&&z(n[p])&&!g(n)&&((o=n[s])&&(n[s]=null),b.event.triggered=p,e.isPropagationStopped()&&u.addEventListener(p,bc),n[p](),e.isPropagationStopped()&&u.removeEventListener(p,bc),b.event.triggered=void 0,o&&(n[s]=o)),e.result}},simulate:function(e,c,t){var n=b.extend(new b.Event,t,{type:e,isSimulated:!0});b.event.trigger(n,null,c)}}),b.fn.extend({trigger:function(e,c){return this.each((function(){b.event.trigger(e,c,this)}))},triggerHandler:function(e,c){var t=this[0];if(t)return b.event.trigger(e,c,t,!0)}}),d.focusin||b.each({focus:"focusin",blur:"focusout"},(function(e,c){var t=function(e){b.event.simulate(c,e.target,b.event.fix(e))};b.event.special[c]={setup:function(){var n=this.ownerDocument||this.document||this,a=Y.access(n,c);a||n.addEventListener(e,t,!0),Y.access(n,c,(a||0)+1)},teardown:function(){var n=this.ownerDocument||this.document||this,a=Y.access(n,c)-1;a?Y.access(n,c,a):(n.removeEventListener(e,t,!0),Y.remove(n,c))}}}));var Hc=t.location,Vc={guid:Date.now()},Lc=/\?/;b.parseXML=function(e){var c;if(!e||"string"!=typeof e)return null;try{c=(new t.DOMParser).parseFromString(e,"text/xml")}catch(e){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+e),c};var Nc=/\[\]$/,wc=/\r?\n/g,Sc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Tc(e,c,t,n){var a;if(Array.isArray(c))b.each(c,(function(c,a){t||Nc.test(e)?n(e,a):Tc(e+"["+("object"==typeof a&&null!=a?c:"")+"]",a,t,n)}));else if(t||"object"!==C(c))n(e,c);else for(a in c)Tc(e+"["+a+"]",c[a],t,n)}b.param=function(e,c){var t,n=[],a=function(e,c){var t=z(c)?c():c;n[n.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==t?"":t)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,(function(){a(this.name,this.value)}));else for(t in e)Tc(t,e[t],c,a);return n.join("&")},b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&Ac.test(this.nodeName)&&!Sc.test(e)&&(this.checked||!pe.test(e))})).map((function(e,c){var t=b(this).val();return null==t?null:Array.isArray(t)?b.map(t,(function(e){return{name:c.name,value:e.replace(wc,"\r\n")}})):{name:c.name,value:t.replace(wc,"\r\n")}})).get()}});var kc=/%20/g,_c=/#.*$/,Ec=/([?&])_=[^&]*/,jc=/^(.*?):[ \t]*([^\r\n]*)$/gm,Dc=/^(?:GET|HEAD)$/,Oc=/^\/\//,Pc={},qc={},Ic="*/".concat("*"),Rc=M.createElement("a");function Fc(e){return function(c,t){"string"!=typeof c&&(t=c,c="*");var n,a=0,i=c.toLowerCase().match(O)||[];if(z(t))for(;n=i[a++];)"+"===n[0]?(n=n.slice(1)||"*",(e[n]=e[n]||[]).unshift(t)):(e[n]=e[n]||[]).push(t)}}function Bc(e,c,t,n){var a={},i=e===qc;function r(o){var l;return a[o]=!0,b.each(e[o]||[],(function(e,o){var s=o(c,t,n);return"string"!=typeof s||i||a[s]?i?!(l=s):void 0:(c.dataTypes.unshift(s),r(s),!1)})),l}return r(c.dataTypes[0])||!a["*"]&&r("*")}function Zc(e,c){var t,n,a=b.ajaxSettings.flatOptions||{};for(t in c)void 0!==c[t]&&((a[t]?e:n||(n={}))[t]=c[t]);return n&&b.extend(!0,e,n),e}Rc.href=Hc.href,b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Hc.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Hc.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ic,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,c){return c?Zc(Zc(e,b.ajaxSettings),c):Zc(b.ajaxSettings,e)},ajaxPrefilter:Fc(Pc),ajaxTransport:Fc(qc),ajax:function(e,c){"object"==typeof e&&(c=e,e=void 0),c=c||{};var n,a,i,r,o,l,s,f,h,u,m=b.ajaxSetup({},c),v=m.context||m,p=m.context&&(v.nodeType||v.jquery)?b(v):b.event,d=b.Deferred(),z=b.Callbacks("once memory"),g=m.statusCode||{},y={},x={},C="canceled",H={readyState:0,getResponseHeader:function(e){var c;if(s){if(!r)for(r={};c=jc.exec(i);)r[c[1].toLowerCase()+" "]=(r[c[1].toLowerCase()+" "]||[]).concat(c[2]);c=r[e.toLowerCase()+" "]}return null==c?null:c.join(", ")},getAllResponseHeaders:function(){return s?i:null},setRequestHeader:function(e,c){return null==s&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,y[e]=c),this},overrideMimeType:function(e){return null==s&&(m.mimeType=e),this},statusCode:function(e){var c;if(e)if(s)H.always(e[H.status]);else for(c in e)g[c]=[g[c],e[c]];return this},abort:function(e){var c=e||C;return n&&n.abort(c),V(0,c),this}};if(d.promise(H),m.url=((e||m.url||Hc.href)+"").replace(Oc,Hc.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=(m.dataType||"*").toLowerCase().match(O)||[""],null==m.crossDomain){l=M.createElement("a");try{l.href=m.url,l.href=l.href,m.crossDomain=Rc.protocol+"//"+Rc.host!=l.protocol+"//"+l.host}catch(e){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=b.param(m.data,m.traditional)),Bc(Pc,m,c,H),s)return H;for(h in(f=b.event&&m.global)&&0==b.active++&&b.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!Dc.test(m.type),a=m.url.replace(_c,""),m.hasContent?m.data&&m.processData&&0===(m.contentType||"").indexOf("application/x-www-form-urlencoded")&&(m.data=m.data.replace(kc,"+")):(u=m.url.slice(a.length),m.data&&(m.processData||"string"==typeof m.data)&&(a+=(Lc.test(a)?"&":"?")+m.data,delete m.data),!1===m.cache&&(a=a.replace(Ec,"$1"),u=(Lc.test(a)?"&":"?")+"_="+Vc.guid+++u),m.url=a+u),m.ifModified&&(b.lastModified[a]&&H.setRequestHeader("If-Modified-Since",b.lastModified[a]),b.etag[a]&&H.setRequestHeader("If-None-Match",b.etag[a])),(m.data&&m.hasContent&&!1!==m.contentType||c.contentType)&&H.setRequestHeader("Content-Type",m.contentType),H.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+Ic+"; q=0.01":""):m.accepts["*"]),m.headers)H.setRequestHeader(h,m.headers[h]);if(m.beforeSend&&(!1===m.beforeSend.call(v,H,m)||s))return H.abort();if(C="abort",z.add(m.complete),H.done(m.success),H.fail(m.error),n=Bc(qc,m,c,H)){if(H.readyState=1,f&&p.trigger("ajaxSend",[H,m]),s)return H;m.async&&m.timeout>0&&(o=t.setTimeout((function(){H.abort("timeout")}),m.timeout));try{s=!1,n.send(y,V)}catch(e){if(s)throw e;V(-1,e)}}else V(-1,"No Transport");function V(e,c,r,l){var h,u,M,y,x,C=c;s||(s=!0,o&&t.clearTimeout(o),n=void 0,i=l||"",H.readyState=e>0?4:0,h=e>=200&&e<300||304===e,r&&(y=function(e,c,t){for(var n,a,i,r,o=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===n&&(n=e.mimeType||c.getResponseHeader("Content-Type"));if(n)for(a in o)if(o[a]&&o[a].test(n)){l.unshift(a);break}if(l[0]in t)i=l[0];else{for(a in t){if(!l[0]||e.converters[a+" "+l[0]]){i=a;break}r||(r=a)}i=i||r}if(i)return i!==l[0]&&l.unshift(i),t[i]}(m,H,r)),!h&&b.inArray("script",m.dataTypes)>-1&&(m.converters["text script"]=function(){}),y=function(e,c,t,n){var a,i,r,o,l,s={},f=e.dataTypes.slice();if(f[1])for(r in e.converters)s[r.toLowerCase()]=e.converters[r];for(i=f.shift();i;)if(e.responseFields[i]&&(t[e.responseFields[i]]=c),!l&&n&&e.dataFilter&&(c=e.dataFilter(c,e.dataType)),l=i,i=f.shift())if("*"===i)i=l;else if("*"!==l&&l!==i){if(!(r=s[l+" "+i]||s["* "+i]))for(a in s)if((o=a.split(" "))[1]===i&&(r=s[l+" "+o[0]]||s["* "+o[0]])){!0===r?r=s[a]:!0!==s[a]&&(i=o[0],f.unshift(o[1]));break}if(!0!==r)if(r&&e.throws)c=r(c);else try{c=r(c)}catch(e){return{state:"parsererror",error:r?e:"No conversion from "+l+" to "+i}}}return{state:"success",data:c}}(m,y,H,h),h?(m.ifModified&&((x=H.getResponseHeader("Last-Modified"))&&(b.lastModified[a]=x),(x=H.getResponseHeader("etag"))&&(b.etag[a]=x)),204===e||"HEAD"===m.type?C="nocontent":304===e?C="notmodified":(C=y.state,u=y.data,h=!(M=y.error))):(M=C,!e&&C||(C="error",e<0&&(e=0))),H.status=e,H.statusText=(c||C)+"",h?d.resolveWith(v,[u,C,H]):d.rejectWith(v,[H,C,M]),H.statusCode(g),g=void 0,f&&p.trigger(h?"ajaxSuccess":"ajaxError",[H,m,h?u:M]),z.fireWith(v,[H,C]),f&&(p.trigger("ajaxComplete",[H,m]),--b.active||b.event.trigger("ajaxStop")))}return H},getJSON:function(e,c,t){return b.get(e,c,t,"json")},getScript:function(e,c){return b.get(e,void 0,c,"script")}}),b.each(["get","post"],(function(e,c){b[c]=function(e,t,n,a){return z(t)&&(a=a||n,n=t,t=void 0),b.ajax(b.extend({url:e,type:c,dataType:a,data:t,success:n},b.isPlainObject(e)&&e))}})),b.ajaxPrefilter((function(e){var c;for(c in e.headers)"content-type"===c.toLowerCase()&&(e.contentType=e.headers[c]||"")})),b._evalUrl=function(e,c,t){return b.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){b.globalEval(e,c,t)}})},b.fn.extend({wrapAll:function(e){var c;return this[0]&&(z(e)&&(e=e.call(this[0])),c=b(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&c.insertBefore(this[0]),c.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return z(e)?this.each((function(c){b(this).wrapInner(e.call(this,c))})):this.each((function(){var c=b(this),t=c.contents();t.length?t.wrapAll(e):c.append(e)}))},wrap:function(e){var c=z(e);return this.each((function(t){b(this).wrapAll(c?e.call(this,t):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){b(this).replaceWith(this.childNodes)})),this}}),b.expr.pseudos.hidden=function(e){return!b.expr.pseudos.visible(e)},b.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},b.ajaxSettings.xhr=function(){try{return new t.XMLHttpRequest}catch(e){}};var Qc={0:200,1223:204},Wc=b.ajaxSettings.xhr();d.cors=!!Wc&&"withCredentials"in Wc,d.ajax=Wc=!!Wc,b.ajaxTransport((function(e){var c,n;if(d.cors||Wc&&!e.crossDomain)return{send:function(a,i){var r,o=e.xhr();if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(r in e.xhrFields)o[r]=e.xhrFields[r];for(r in e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||a["X-Requested-With"]||(a["X-Requested-With"]="XMLHttpRequest"),a)o.setRequestHeader(r,a[r]);c=function(e){return function(){c&&(c=n=o.onload=o.onerror=o.onabort=o.ontimeout=o.onreadystatechange=null,"abort"===e?o.abort():"error"===e?"number"!=typeof o.status?i(0,"error"):i(o.status,o.statusText):i(Qc[o.status]||o.status,o.statusText,"text"!==(o.responseType||"text")||"string"!=typeof o.responseText?{binary:o.response}:{text:o.responseText},o.getAllResponseHeaders()))}},o.onload=c(),n=o.onerror=o.ontimeout=c("error"),void 0!==o.onabort?o.onabort=n:o.onreadystatechange=function(){4===o.readyState&&t.setTimeout((function(){c&&n()}))},c=c("abort");try{o.send(e.hasContent&&e.data||null)}catch(e){if(c)throw e}},abort:function(){c&&c()}}})),b.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),b.ajaxTransport("script",(function(e){var c,t;if(e.crossDomain||e.scriptAttrs)return{send:function(n,a){c=b(" \ No newline at end of file +botamusique web interface

Music Library

Filters

{% for tag in tags_color_lookup.keys() %} {{ tag }} {% endfor %}
{% if upload_enabled %}
{% else %}
Add URL
Add Radio
\ No newline at end of file diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..29a9bb0 --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +quote_type = single + +[*.json] +quote_type = double diff --git a/web/.eslintrc.json b/web/.eslintrc.json new file mode 100644 index 0000000..7836033 --- /dev/null +++ b/web/.eslintrc.json @@ -0,0 +1,36 @@ +{ + "env": { + "browser": true, + "es6": true, + "es2017": true, + "es2020": true, + "jquery": true + }, + "plugins": [ + "node", + "import", + "jsdoc" + ], + "extends": [ + "eslint:recommended", + "google", + "plugin:node/recommended-module", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:jsdoc/recommended" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parser": "babel-eslint", + "rules": { + "require-jsdoc": "off", + "valid-jsdoc": "off", + "jsdoc/require-jsdoc": "off", + "max-len": ["warn", { "code": 120 }], + "import/no-commonjs": "error", + "import/no-amd": "error", + "linebreak-style": "off" + } + } diff --git a/web/package-lock.json b/web/package-lock.json index 977eb92..c5cc088 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1105,6 +1105,12 @@ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/html-minifier-terser": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", @@ -1356,6 +1362,12 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -1380,6 +1392,23 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -1438,12 +1467,33 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -1496,6 +1546,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -1524,6 +1580,20 @@ "postcss-value-parser": "^4.1.0" } }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -1938,6 +2008,12 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", @@ -2046,6 +2122,21 @@ "source-map": "~0.6.0" } }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -2133,6 +2224,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "comment-parser": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz", + "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2175,6 +2272,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -2291,6 +2394,49 @@ "sha.js": "^2.4.8" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -2396,6 +2542,12 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2481,6 +2633,15 @@ } } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -2715,6 +2876,318 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", + "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^7.0.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-jsdoc": { + "version": "26.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-26.0.2.tgz", + "integrity": "sha512-KtZjqtM3Z8x84vQBFKGUyBbZRGXYHVWSJ2XyYSUTc8KhfFrvzQ/GXPp6f1M1/YCNzP3ImD5RuDNcr+OVvIZcBA==", + "dev": true, + "requires": { + "comment-parser": "^0.7.4", + "debug": "^4.1.1", + "jsdoctypeparser": "^6.1.0", + "lodash": "^4.17.15", + "regextras": "^0.7.1", + "semver": "^6.3.0", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -2725,12 +3198,63 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", @@ -2863,6 +3387,17 @@ } } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -2940,12 +3475,36 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3037,6 +3596,34 @@ "resolve-dir": "^1.0.1" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -3103,6 +3690,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -3319,6 +3912,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "html-minifier-terser": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", @@ -3418,6 +4017,15 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", @@ -3439,6 +4047,12 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -3517,6 +4131,94 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -3648,6 +4350,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -3707,6 +4415,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -3772,6 +4486,12 @@ "esprima": "^4.0.0" } }, + "jsdoctypeparser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz", + "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3790,6 +4510,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -3829,6 +4555,39 @@ "leven": "^3.1.0" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -4137,6 +4896,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4156,6 +4921,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -4213,6 +4984,18 @@ "integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==", "dev": true }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4350,6 +5133,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4359,6 +5154,29 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -4376,6 +5194,12 @@ "mem": "^4.0.0" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -4435,6 +5259,23 @@ "readable-stream": "^2.1.5" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", @@ -4539,6 +5380,15 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -4558,6 +5408,12 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -4750,6 +5606,12 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -4784,6 +5646,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -4898,6 +5766,27 @@ "safe-buffer": "^5.1.0" } }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4963,6 +5852,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "regexpu-core": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", @@ -4977,6 +5872,12 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -5103,6 +6004,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -5128,6 +6039,12 @@ "inherits": "^2.0.1" } }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -5137,6 +6054,15 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5152,6 +6078,12 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sass": { "version": "1.26.7", "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.7.tgz", @@ -5279,6 +6211,25 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -5450,6 +6401,38 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -5540,6 +6523,40 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "string.prototype.trimend": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", @@ -5600,12 +6617,24 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5615,6 +6644,52 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -5670,6 +6745,18 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -5689,6 +6776,15 @@ "setimmediate": "^1.0.4" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -5755,6 +6851,21 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -5956,6 +7067,16 @@ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -6320,6 +7441,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -6389,6 +7516,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/web/package.json b/web/package.json index a2e2973..9ea2105 100644 --- a/web/package.json +++ b/web/package.json @@ -5,6 +5,8 @@ "scripts": { "dev": "npm run development", "development": "webpack --mode=development --config webpack.config.cjs --progress", + "lint": "eslint --config .eslintrc.json src/js/ --ext .mjs", + "lint:fix": "npm run lint -- --fix", "prod": "npm run production", "production": "webpack --mode=production --config webpack.config.cjs --progress", "test": "echo \"Error: no test specified\" && exit 1" @@ -24,9 +26,15 @@ "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/preset-env": "^7.10.2", "autoprefixer": "^9.8.0", + "babel-eslint": "^10.1.0", "babel-loader": "^8.1.0", "core-js": "^3.6.5", "css-loader": "^3.5.3", + "eslint": "^7.1.0", + "eslint-config-google": "^0.14.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-jsdoc": "^26.0.2", + "eslint-plugin-node": "^11.1.0", "html-webpack-plugin": "^4.3.0", "mini-css-extract-plugin": "^0.9.0", "postcss-loader": "^3.0.0", diff --git a/web/src/js/app.mjs b/web/src/js/app.mjs index b659deb..d948595 100644 --- a/web/src/js/app.mjs +++ b/web/src/js/app.mjs @@ -1,17 +1,29 @@ -// jQuery 3.x +// eslint-disable-next-line no-unused-vars import {$, jQuery} from 'jquery/src/jquery'; - -// jQuery Migrate 3.x import 'jquery-migrate/src/migrate'; - -// Popper 1.x import 'popper.js'; - -// Boostrap 4.x import 'bootstrap/js/src/index'; // Old application code -import './main'; +import './main.mjs'; // New application code -import './index'; \ No newline at end of file +import Theme from './theme.mjs'; + +import {library, dom} from '@fortawesome/fontawesome-svg-core/index.es'; +import {fas} from '@fortawesome/free-solid-svg-icons/index.es'; +import {far} from '@fortawesome/free-regular-svg-icons/index.es'; +import {fab} from '@fortawesome/free-brands-svg-icons/index.es'; +library.add(fas, far, fab); + +document.addEventListener('DOMContentLoaded', () => { + Theme.init(); + + // This is required to seach DOM and convert i tags to SVG + dom.i2svg(); + + document.getElementById('theme-switch-btn').addEventListener('click', () => { + Theme.swap(); + }); +}); + diff --git a/web/src/js/index.mjs b/web/src/js/index.mjs deleted file mode 100644 index df95914..0000000 --- a/web/src/js/index.mjs +++ /dev/null @@ -1,18 +0,0 @@ -import Theme from './theme'; - -import { library, dom } from '@fortawesome/fontawesome-svg-core/index.es'; -import { fas } from '@fortawesome/free-solid-svg-icons/index.es'; -import { far } from '@fortawesome/free-regular-svg-icons/index.es'; -import { fab } from '@fortawesome/free-brands-svg-icons/index.es'; -library.add(fas, far, fab); - -document.addEventListener('DOMContentLoaded', () => { - Theme.init(); - - // FontAwesome - dom.i2svg(); - - document.getElementById('theme-switch-btn').addEventListener('click', () => { - Theme.swap(); - }); -}); \ No newline at end of file diff --git a/web/src/js/main.mjs b/web/src/js/main.mjs index d54b5d4..44af668 100644 --- a/web/src/js/main.mjs +++ b/web/src/js/main.mjs @@ -1,8 +1,10 @@ -$('#uploadSelectFile').on('change', function () { - //get the file name - let fileName = $(this).val().replace('C:\\fakepath\\', " "); - //replace the "Choose a file" label - $(this).next('.custom-file-label').html(fileName); +import {isOverflown, setProgressBar, secondsToStr} from './util'; + +$('#uploadSelectFile').on('change', function() { + // get the file name + const fileName = $(this).val().replace('C:\\fakepath\\', ' '); + // replace the "Choose a file" label + $(this).next('.custom-file-label').html(fileName); }); @@ -10,26 +12,26 @@ $('#uploadSelectFile').on('change', function () { // ------ Playlist ------ // ---------------------- -const pl_item_template = $(".playlist-item-template"); -const pl_id_element = $(".playlist-item-id"); -const pl_index_element = $(".playlist-item-index"); -const pl_title_element = $(".playlist-item-title"); -const pl_artist_element = $(".playlist-item-artist"); -const pl_thumb_element = $(".playlist-item-thumbnail"); -const pl_type_element = $(".playlist-item-type"); -const pl_path_element = $(".playlist-item-path"); +const pl_item_template = $('.playlist-item-template'); +const pl_id_element = $('.playlist-item-id'); +const pl_index_element = $('.playlist-item-index'); +const pl_title_element = $('.playlist-item-title'); +const pl_artist_element = $('.playlist-item-artist'); +const pl_thumb_element = $('.playlist-item-thumbnail'); +const pl_type_element = $('.playlist-item-type'); +const pl_path_element = $('.playlist-item-path'); -const pl_tag_edit_element = $(".playlist-item-edit"); +const pl_tag_edit_element = $('.playlist-item-edit'); -const notag_element = $(".library-item-notag"); // these elements are shared with library -const tag_element = $(".library-item-tag"); +const notag_element = $('.library-item-notag'); // these elements are shared with library +const tag_element = $('.library-item-tag'); -const add_tag_modal = $("#addTagModal"); +const add_tag_modal = $('#addTagModal'); -const playlist_loading = $("#playlist-loading"); -const playlist_table = $("#playlist-table"); -const playlist_empty = $("#playlist-empty"); -const playlist_expand = $(".playlist-expand"); +const playlist_loading = $('#playlist-loading'); +const playlist_table = $('#playlist-table'); +const playlist_empty = $('#playlist-empty'); +const playlist_expand = $('.playlist-expand'); let playlist_items = null; @@ -47,279 +49,279 @@ const playPauseBtn = $('#play-pause-btn'); const fastForwardBtn = $('#fast-forward-btn'); const playModeBtns = { - 'one-shot': $('#one-shot-mode-btn'), - random: $('#random-mode-btn'), - repeat: $('#repeat-mode-btn'), - autoplay: $('#autoplay-mode-btn') + 'one-shot': $('#one-shot-mode-btn'), + 'random': $('#random-mode-btn'), + 'repeat': $('#repeat-mode-btn'), + 'autoplay': $('#autoplay-mode-btn'), }; const playModeIcon = { - 'one-shot': 'fa-tasks', - random: 'fa-random', - repeat: 'fa-redo', - autoplay: 'fa-robot' + 'one-shot': 'fa-tasks', + 'random': 'fa-random', + 'repeat': 'fa-redo', + 'autoplay': 'fa-robot', }; function request(_url, _data, refresh = false) { - console.log(_data); - $.ajax({ - type: 'POST', - url: _url, - data: _data, - statusCode: { - 200: function (data) { - if (data.ver !== playlist_ver) { - checkForPlaylistUpdate(); - } - updateControls(data.empty, data.play, data.mode, data.volume); - updatePlayerPlayhead(data.playhead); - }, - 403: function (){ - location.reload(true); - } - }, - }); - if (refresh) { - location.reload(true) - } + console.log(_data); + $.ajax({ + type: 'POST', + url: _url, + data: _data, + statusCode: { + 200: function(data) { + if (data.ver !== playlist_ver) { + checkForPlaylistUpdate(); + } + updateControls(data.empty, data.play, data.mode, data.volume); + updatePlayerPlayhead(data.playhead); + }, + 403: function() { + location.reload(true); + }, + }, + }); + if (refresh) { + location.reload(true); + } } function addPlaylistItem(item) { - pl_id_element.val(item.id); - pl_index_element.html(item.index + 1); - pl_title_element.html(item.title); - pl_artist_element.html(item.artist); - pl_thumb_element.attr("src", item.thumbnail); - pl_type_element.html(item.type); - pl_path_element.html(item.path); + pl_id_element.val(item.id); + pl_index_element.html(item.index + 1); + pl_title_element.html(item.title); + pl_artist_element.html(item.artist); + pl_thumb_element.attr('src', item.thumbnail); + pl_type_element.html(item.type); + pl_path_element.html(item.path); - let item_copy = pl_item_template.clone(); - item_copy.attr("id", "playlist-item-" + item.index); - item_copy.addClass("playlist-item").removeClass("d-none"); + const item_copy = pl_item_template.clone(); + item_copy.attr('id', 'playlist-item-' + item.index); + item_copy.addClass('playlist-item').removeClass('d-none'); - let tags = item_copy.find(".playlist-item-tags"); - tags.empty(); + const tags = item_copy.find('.playlist-item-tags'); + tags.empty(); - let tag_edit_copy = pl_tag_edit_element.clone(); - tag_edit_copy.click(function () { - addTagModalShow(item.id, item.title, item.tags); + const tag_edit_copy = pl_tag_edit_element.clone(); + tag_edit_copy.click(function() { + addTagModalShow(item.id, item.title, item.tags); + }); + tag_edit_copy.appendTo(tags); + + if (item.tags.length > 0) { + item.tags.forEach(function(tag_tuple) { + const tag_copy = tag_element.clone(); + tag_copy.html(tag_tuple[0]); + tag_copy.addClass('badge-' + tag_tuple[1]); + tag_copy.appendTo(tags); }); - tag_edit_copy.appendTo(tags); + } else { + const tag_copy = notag_element.clone(); + tag_copy.appendTo(tags); + } - if (item.tags.length > 0) { - item.tags.forEach(function (tag_tuple) { - let tag_copy = tag_element.clone(); - tag_copy.html(tag_tuple[0]); - tag_copy.addClass("badge-" + tag_tuple[1]); - tag_copy.appendTo(tags); - }); - } else { - let tag_copy = notag_element.clone(); - tag_copy.appendTo(tags); - } - - item_copy.appendTo(playlist_table); + item_copy.appendTo(playlist_table); } function displayPlaylist(data) { - playlist_table.animate({ opacity: 0 }, 200, function () { - playlist_loading.hide(); - $(".playlist-item").remove(); - let items = data.items; - playlist_items = {}; - for (let i in items){ - playlist_items[items[i].index] = items[i] - } - let length = data.length; - let start_from = data.start_from; - playlist_range_from = start_from; - playlist_range_to = start_from + items.length - 1; + playlist_table.animate({opacity: 0}, 200, function() { + playlist_loading.hide(); + $('.playlist-item').remove(); + const items = data.items; + playlist_items = {}; + for (const i in items) { + playlist_items[items[i].index] = items[i]; + } + const length = data.length; + const start_from = data.start_from; + playlist_range_from = start_from; + playlist_range_to = start_from + items.length - 1; - if (items.length < length && start_from > 0) { - let _from = start_from - 5; - _from = _from > 0 ? _from : 0; - let _to = start_from - 1; - if (_to > 0) { - insertExpandPrompt(_from, start_from + length - 1, _from, _to, length); - } - } + if (items.length < length && start_from > 0) { + let _from = start_from - 5; + _from = _from > 0 ? _from : 0; + const _to = start_from - 1; + if (_to > 0) { + insertExpandPrompt(_from, start_from + length - 1, _from, _to, length); + } + } - items.forEach( - function (item) { - addPlaylistItem(item); - } - ); + items.forEach( + function(item) { + addPlaylistItem(item); + }, + ); - if (items.length < length && start_from + items.length < length) { - let _from = start_from + items.length; - let _to = start_from + items.length - 1 + 10; - _to = _to < length - 1 ? _to : length - 1; - if (start_from + items.length < _to) { - insertExpandPrompt(start_from, _to, _from, _to, length); - } - } + if (items.length < length && start_from + items.length < length) { + const _from = start_from + items.length; + let _to = start_from + items.length - 1 + 10; + _to = _to < length - 1 ? _to : length - 1; + if (start_from + items.length < _to) { + insertExpandPrompt(start_from, _to, _from, _to, length); + } + } - displayActiveItem(data.current_index); - updatePlayerInfo(playlist_items[data.current_index]); - bindPlaylistEvent(); - playlist_table.animate({ opacity: 1 }, 200); - }); + displayActiveItem(data.current_index); + updatePlayerInfo(playlist_items[data.current_index]); + bindPlaylistEvent(); + playlist_table.animate({opacity: 1}, 200); + }); } function displayActiveItem(current_index) { - $(".playlist-item").removeClass("table-active"); - $("#playlist-item-" + current_index).addClass("table-active"); + $('.playlist-item').removeClass('table-active'); + $('#playlist-item-' + current_index).addClass('table-active'); } function insertExpandPrompt(real_from, real_to, display_from, display_to, total_length) { - let expand_copy = playlist_expand.clone(); - expand_copy.addClass('playlist-item'); - expand_copy.removeClass('d-none'); - if (display_from !== display_to) { - expand_copy.find(".playlist-expand-item-range").html((display_from + 1) + "~" + (display_to + 1) - + " of " + (total_length) + " items"); - } else { - expand_copy.find(".playlist-expand-item-range").html(display_from + " of " + (total_length) + " items"); - } + const expand_copy = playlist_expand.clone(); + expand_copy.addClass('playlist-item'); + expand_copy.removeClass('d-none'); + if (display_from !== display_to) { + expand_copy.find('.playlist-expand-item-range').html((display_from + 1) + '~' + (display_to + 1) + + ' of ' + (total_length) + ' items'); + } else { + expand_copy.find('.playlist-expand-item-range').html(display_from + ' of ' + (total_length) + ' items'); + } - expand_copy.addClass('playlist-item'); - expand_copy.appendTo(playlist_table); - expand_copy.click(function () { - playlist_range_from = real_from; - playlist_range_to = real_to; - updatePlaylist(); - }); + expand_copy.addClass('playlist-item'); + expand_copy.appendTo(playlist_table); + expand_copy.click(function() { + playlist_range_from = real_from; + playlist_range_to = real_to; + updatePlaylist(); + }); } function updatePlaylist() { - playlist_table.animate({ opacity: 0 }, 200, function () { - playlist_empty.addClass('d-none'); - playlist_loading.show(); - playlist_table.find(".playlist-item").css("opacity", 0); - let data = {}; - if (!(playlist_range_from === 0 && playlist_range_to === 0)) { - data = { - range_from: playlist_range_from, - range_to: playlist_range_to - }; - } - $.ajax({ - type: 'GET', - url: 'playlist', - data: data, - statusCode: { - 200: displayPlaylist, - 204: function () { - playlist_loading.hide(); - playlist_empty.removeClass('d-none'); - $(".playlist-item").remove(); - } - } - }); - playlist_table.animate({ opacity: 1 }, 200); + playlist_table.animate({opacity: 0}, 200, function() { + playlist_empty.addClass('d-none'); + playlist_loading.show(); + playlist_table.find('.playlist-item').css('opacity', 0); + let data = {}; + if (!(playlist_range_from === 0 && playlist_range_to === 0)) { + data = { + range_from: playlist_range_from, + range_to: playlist_range_to, + }; + } + $.ajax({ + type: 'GET', + url: 'playlist', + data: data, + statusCode: { + 200: displayPlaylist, + 204: function() { + playlist_loading.hide(); + playlist_empty.removeClass('d-none'); + $('.playlist-item').remove(); + }, + }, }); + playlist_table.animate({opacity: 1}, 200); + }); } function checkForPlaylistUpdate() { - $.ajax({ - type: 'POST', - url: 'post', - statusCode: { - 200: function (data) { - if (data.ver !== playlist_ver) { - playlist_ver = data.ver; - playlist_range_from = 0; - playlist_range_to = 0; - updatePlaylist(); - } - if (data.current_index !== playlist_current_index) { - if (data.current_index !== -1) { - if ((data.current_index > playlist_range_to || data.current_index < playlist_range_from)) { - playlist_range_from = 0; - playlist_range_to = 0; - updatePlaylist(); - } else { - playlist_current_index = data.current_index; - updatePlayerInfo(playlist_items[data.current_index]); - displayActiveItem(data.current_index); - } - } - } - updateControls(data.empty, data.play, data.mode, data.volume); - if (!data.empty){ - updatePlayerPlayhead(data.playhead); - } - } + $.ajax({ + type: 'POST', + url: 'post', + statusCode: { + 200: function(data) { + if (data.ver !== playlist_ver) { + playlist_ver = data.ver; + playlist_range_from = 0; + playlist_range_to = 0; + updatePlaylist(); } - }); + if (data.current_index !== playlist_current_index) { + if (data.current_index !== -1) { + if ((data.current_index > playlist_range_to || data.current_index < playlist_range_from)) { + playlist_range_from = 0; + playlist_range_to = 0; + updatePlaylist(); + } else { + playlist_current_index = data.current_index; + updatePlayerInfo(playlist_items[data.current_index]); + displayActiveItem(data.current_index); + } + } + } + updateControls(data.empty, data.play, data.mode, data.volume); + if (!data.empty) { + updatePlayerPlayhead(data.playhead); + } + }, + }, + }); } function bindPlaylistEvent() { - $(".playlist-item-play").unbind().click( - function (e) { - request('post', { - 'play_music': ($(e.currentTarget).parent().parent().parent().find(".playlist-item-index").html() - 1) - }); - } - ); - $(".playlist-item-trash").unbind().click( - function (e) { - request('post', { - 'delete_music': ($(e.currentTarget).parent().parent().parent().find(".playlist-item-index").html() - 1) - }); - } - ); + $('.playlist-item-play').unbind().click( + function(e) { + request('post', { + 'play_music': ($(e.currentTarget).parent().parent().parent().find('.playlist-item-index').html() - 1), + }); + }, + ); + $('.playlist-item-trash').unbind().click( + function(e) { + request('post', { + 'delete_music': ($(e.currentTarget).parent().parent().parent().find('.playlist-item-index').html() - 1), + }); + }, + ); } function updateControls(empty, play, mode, volume) { - updatePlayerControls(play, empty); - if (empty) { - playPauseBtn.prop('disabled', true); - fastForwardBtn.prop('disabled', true); + updatePlayerControls(play, empty); + if (empty) { + playPauseBtn.prop('disabled', true); + fastForwardBtn.prop('disabled', true); + } else { + playPauseBtn.prop('disabled', false); + fastForwardBtn.prop('disabled', false); + if (play) { + playing = true; + playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause'); } else { - playPauseBtn.prop('disabled', false); - fastForwardBtn.prop('disabled', false); - if (play) { - playing = true; - playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause'); - } else { - playing = false; - playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play'); - } + playing = false; + playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play'); } + } - for (const otherMode of Object.values(playModeBtns)) { - otherMode.removeClass('active'); - } - playModeBtns[mode].addClass('active'); + for (const otherMode of Object.values(playModeBtns)) { + otherMode.removeClass('active'); + } + playModeBtns[mode].addClass('active'); - let playModeIndicator = $('#modeIndicator'); - for (const icon_class of Object.values(playModeIcon)) { - playModeIndicator.removeClass(icon_class); - } - playModeIndicator.addClass(playModeIcon[mode]); + const playModeIndicator = $('#modeIndicator'); + for (const icon_class of Object.values(playModeIcon)) { + playModeIndicator.removeClass(icon_class); + } + playModeIndicator.addClass(playModeIcon[mode]); - if (volume !== last_volume) { - last_volume = volume; - if (volume > 1) { - document.getElementById("volume-slider").value = 1; - } else if (volume < 0) { - document.getElementById("volume-slider").value = 0; - } else { - document.getElementById("volume-slider").value = volume; - } + if (volume !== last_volume) { + last_volume = volume; + if (volume > 1) { + document.getElementById('volume-slider').value = 1; + } else if (volume < 0) { + document.getElementById('volume-slider').value = 0; + } else { + document.getElementById('volume-slider').value = volume; } + } } function togglePlayPause() { - if (playing) { - request('post', {action: 'pause'}); - } else { - request('post', {action: 'resume'}); - } + if (playing) { + request('post', {action: 'pause'}); + } else { + request('post', {action: 'resume'}); + } } function changePlayMode(mode) { - request('post', {action: mode}); + request('post', {action: mode}); } @@ -327,758 +329,762 @@ function changePlayMode(mode) { // ------ Browser ------ // --------------------- -let filters = { - file: $('#filter-type-file'), - url: $('#filter-type-url'), - radio: $('#filter-type-radio'), +const filters = { + file: $('#filter-type-file'), + url: $('#filter-type-url'), + radio: $('#filter-type-radio'), }; -let filter_dir = $("#filter-dir"); -let filter_keywords = $("#filter-keywords"); +const filter_dir = $('#filter-dir'); +const filter_keywords = $('#filter-keywords'); function setFilterType(event, type) { - event.preventDefault(); + event.preventDefault(); - if (filters[type].hasClass('active')) { - filters[type].removeClass('active btn-primary').addClass('btn-secondary'); - filters[type].find('input[type=radio]').removeAttr('checked'); - } else { - filters[type].removeClass('btn-secondary').addClass('active btn-primary'); - filters[type].find('input[type=radio]').attr('checked', 'checked'); - } + if (filters[type].hasClass('active')) { + filters[type].removeClass('active btn-primary').addClass('btn-secondary'); + filters[type].find('input[type=radio]').removeAttr('checked'); + } else { + filters[type].removeClass('btn-secondary').addClass('active btn-primary'); + filters[type].find('input[type=radio]').attr('checked', 'checked'); + } - if (type === 'file') { - filter_dir.prop('disabled', !filters['file'].hasClass('active')); - } + if (type === 'file') { + filter_dir.prop('disabled', !filters['file'].hasClass('active')); + } - updateResults(); + updateResults(); } // Bind Event -$(".filter-tag").click(function (e) { - let tag = $(e.currentTarget); - if (!tag.hasClass('tag-clicked')) { - tag.addClass('tag-clicked'); - tag.removeClass('tag-unclicked'); - } else { - tag.addClass('tag-unclicked'); - tag.removeClass('tag-clicked'); - } - updateResults(); +$('.filter-tag').click(function(e) { + const tag = $(e.currentTarget); + if (!tag.hasClass('tag-clicked')) { + tag.addClass('tag-clicked'); + tag.removeClass('tag-unclicked'); + } else { + tag.addClass('tag-unclicked'); + tag.removeClass('tag-clicked'); + } + updateResults(); }); -filter_dir.change(function () { updateResults() }); -filter_keywords.change(function () { updateResults() }); +filter_dir.change(function() { + updateResults(); +}); +filter_keywords.change(function() { + updateResults(); +}); -let item_template = $("#library-item"); +const item_template = $('#library-item'); function bindLibraryResultEvent() { - $(".library-thumb-col").unbind().hover( - function (e) { $(e.currentTarget).find(".library-thumb-grp").addClass("library-thumb-grp-hover"); }, - function (e) { $(e.currentTarget).find(".library-thumb-grp").removeClass("library-thumb-grp-hover"); } - ); + $('.library-thumb-col').unbind().hover( + function(e) { + $(e.currentTarget).find('.library-thumb-grp').addClass('library-thumb-grp-hover'); + }, + function(e) { + $(e.currentTarget).find('.library-thumb-grp').removeClass('library-thumb-grp-hover'); + }, + ); - $(".library-info-title").unbind().hover( - function (e) { $(e.currentTarget).parent().find(".library-thumb-grp").addClass("library-thumb-grp-hover"); }, - function (e) { $(e.currentTarget).parent().find(".library-thumb-grp").removeClass("library-thumb-grp-hover"); } - ); + $('.library-info-title').unbind().hover( + function(e) { + $(e.currentTarget).parent().find('.library-thumb-grp').addClass('library-thumb-grp-hover'); + }, + function(e) { + $(e.currentTarget).parent().find('.library-thumb-grp').removeClass('library-thumb-grp-hover'); + }, + ); - $(".library-item-play").unbind().click( - function (e) { - request('post', { - 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find(".library-item-id").val() - }); - } - ); + $('.library-item-play').unbind().click( + function(e) { + request('post', { + 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find('.library-item-id').val(), + }); + }, + ); - $(".library-item-trash").unbind().click( - function (e) { - request('post', { - 'delete_item_from_library': $(e.currentTarget).parent().parent().find(".library-item-id").val() - }); - updateResults(active_page); - } - ); + $('.library-item-trash').unbind().click( + function(e) { + request('post', { + 'delete_item_from_library': $(e.currentTarget).parent().parent().find('.library-item-id').val(), + }); + updateResults(active_page); + }, + ); - $(".library-item-download").unbind().click( - function (e) { - let id = $(e.currentTarget).parent().parent().find(".library-item-id").val(); - //window.open('/download?id=' + id); - downloadId(id); - } - ); + $('.library-item-download').unbind().click( + function(e) { + const id = $(e.currentTarget).parent().parent().find('.library-item-id').val(); + // window.open('/download?id=' + id); + downloadId(id); + }, + ); - $(".library-item-add-next").unbind().click( - function (e) { - let id = $(e.currentTarget).parent().parent().find(".library-item-id").val(); - request('post', { - 'add_item_next': id - }); - } - ); + $('.library-item-add-next').unbind().click( + function(e) { + const id = $(e.currentTarget).parent().parent().find('.library-item-id').val(); + request('post', { + 'add_item_next': id, + }); + }, + ); - $(".library-item-add-bottom").unbind().click( - function (e) { - let id = $(e.currentTarget).parent().parent().find(".library-item-id").val(); - request('post', { - 'add_item_bottom': id - }); - } - ); + $('.library-item-add-bottom').unbind().click( + function(e) { + const id = $(e.currentTarget).parent().parent().find('.library-item-id').val(); + request('post', { + 'add_item_bottom': id, + }); + }, + ); } -const lib_group = $("#library-group"); -const id_element = $(".library-item-id"); -const title_element = $(".library-item-title"); -const artist_element = $(".library-item-artist"); -const thumb_element = $(".library-item-thumb"); -const type_element = $(".library-item-type"); -const path_element = $(".library-item-path"); +const lib_group = $('#library-group'); +const id_element = $('.library-item-id'); +const title_element = $('.library-item-title'); +const artist_element = $('.library-item-artist'); +const thumb_element = $('.library-item-thumb'); +const type_element = $('.library-item-type'); +const path_element = $('.library-item-path'); -const tag_edit_element = $(".library-item-edit"); -//var notag_element = $(".library-item-notag"); -//var tag_element = $(".library-item-tag"); +const tag_edit_element = $('.library-item-edit'); +// var notag_element = $(".library-item-notag"); +// var tag_element = $(".library-item-tag"); -//var add_tag_modal = $("#addTagModal"); +// var add_tag_modal = $("#addTagModal"); function addResultItem(item) { - id_element.val(item.id); - title_element.html(item.title); - artist_element.html(item.artist ? ("- " + item.artist) : ""); - thumb_element.attr("src", item.thumb); - type_element.html("[" + item.type + "]"); - path_element.html(item.path); + id_element.val(item.id); + title_element.html(item.title); + artist_element.html(item.artist ? ('- ' + item.artist) : ''); + thumb_element.attr('src', item.thumb); + type_element.html('[' + item.type + ']'); + path_element.html(item.path); - let item_copy = item_template.clone(); - item_copy.addClass("library-item-active"); + const item_copy = item_template.clone(); + item_copy.addClass('library-item-active'); - let tags = item_copy.find(".library-item-tags"); - tags.empty(); + const tags = item_copy.find('.library-item-tags'); + tags.empty(); - let tag_edit_copy = tag_edit_element.clone(); - tag_edit_copy.click(function () { - addTagModalShow(item.id, item.title, item.tags); + const tag_edit_copy = tag_edit_element.clone(); + tag_edit_copy.click(function() { + addTagModalShow(item.id, item.title, item.tags); + }); + tag_edit_copy.appendTo(tags); + + if (item.tags.length > 0) { + item.tags.forEach(function(tag_tuple) { + const tag_copy = tag_element.clone(); + tag_copy.html(tag_tuple[0]); + tag_copy.addClass('badge-' + tag_tuple[1]); + tag_copy.appendTo(tags); }); - tag_edit_copy.appendTo(tags); + } else { + const tag_copy = notag_element.clone(); + tag_copy.appendTo(tags); + } - if (item.tags.length > 0) { - item.tags.forEach(function (tag_tuple) { - let tag_copy = tag_element.clone(); - tag_copy.html(tag_tuple[0]); - tag_copy.addClass("badge-" + tag_tuple[1]); - tag_copy.appendTo(tags); - }); - } else { - let tag_copy = notag_element.clone(); - tag_copy.appendTo(tags); - } - - item_copy.appendTo(lib_group); - item_copy.show(); + item_copy.appendTo(lib_group); + item_copy.show(); } function getFilters(dest_page = 1) { - let tags = $(".tag-clicked"); - let tags_list = []; - tags.each(function (index, tag) { - tags_list.push(tag.innerHTML); - }); + const tags = $('.tag-clicked'); + const tags_list = []; + tags.each(function(index, tag) { + tags_list.push(tag.innerHTML); + }); - let filter_types = []; - for (const filter in filters) { - if (filters[filter].hasClass('active')) { - filter_types.push(filter); - } + const filter_types = []; + for (const filter in filters) { + if (filters[filter].hasClass('active')) { + filter_types.push(filter); } + } - return { - type: filter_types.join(','), - dir: filter_dir.val(), - tags: tags_list.join(","), - keywords: filter_keywords.val(), - page: dest_page - }; + return { + type: filter_types.join(','), + dir: filter_dir.val(), + tags: tags_list.join(','), + keywords: filter_keywords.val(), + page: dest_page, + }; } -let lib_loading = $("#library-item-loading"); -let lib_empty = $("#library-item-empty"); +const lib_loading = $('#library-item-loading'); +const lib_empty = $('#library-item-empty'); let active_page = 1; function updateResults(dest_page = 1) { - active_page = dest_page; - let data = getFilters(dest_page); - data.action = "query"; + active_page = dest_page; + const data = getFilters(dest_page); + data.action = 'query'; - lib_group.animate({ opacity: 0 }, 200, function () { - $.ajax({ - type: 'POST', - url: 'library', - data: data, - statusCode: { - 200: processResults, - 204: function () { - lib_loading.hide(); - lib_empty.show(); - page_ul.empty(); - }, - 403: function () { - location.reload(true); - } - } - }); - - $(".library-item-active").remove(); - lib_empty.hide(); - lib_loading.show(); - lib_group.animate({ opacity: 1 }, 200); + lib_group.animate({opacity: 0}, 200, function() { + $.ajax({ + type: 'POST', + url: 'library', + data: data, + statusCode: { + 200: processResults, + 204: function() { + lib_loading.hide(); + lib_empty.show(); + page_ul.empty(); + }, + 403: function() { + location.reload(true); + }, + }, }); + + $('.library-item-active').remove(); + lib_empty.hide(); + lib_loading.show(); + lib_group.animate({opacity: 1}, 200); + }); } -const download_form = $("#download-form"); -const download_id = download_form.find("input[name='id']"); -const download_type = download_form.find("input[name='type']"); -const download_dir = download_form.find("input[name='dir']"); -const download_tags = download_form.find("input[name='tags']"); -const download_keywords = download_form.find("input[name='keywords']"); +const download_form = $('#download-form'); +const download_id = download_form.find('input[name=\'id\']'); +const download_type = download_form.find('input[name=\'type\']'); +const download_dir = download_form.find('input[name=\'dir\']'); +const download_tags = download_form.find('input[name=\'tags\']'); +const download_keywords = download_form.find('input[name=\'keywords\']'); function addAllResults() { - let data = getFilters(); - data.action = "add"; + const data = getFilters(); + data.action = 'add'; - console.log(data); + console.log(data); - $.ajax({ - type: 'POST', - url: 'library', - data: data - }); + $.ajax({ + type: 'POST', + url: 'library', + data: data, + }); - checkForPlaylistUpdate(); + checkForPlaylistUpdate(); } function deleteAllResults() { - let data = getFilters(); - data.action = "delete"; + const data = getFilters(); + data.action = 'delete'; - console.log(data); + console.log(data); - $.ajax({ - type: 'POST', - url: 'library', - data: data - }); + $.ajax({ + type: 'POST', + url: 'library', + data: data, + }); - checkForPlaylistUpdate(); - updateResults(); + checkForPlaylistUpdate(); + updateResults(); } function downloadAllResults() { - let cond = getFilters(); - download_id.val(); - download_type.val(cond.type); - download_dir.val(cond.dir); - download_tags.val(cond.tags); - download_keywords.val(cond.keywords); - download_form.submit(); + const cond = getFilters(); + download_id.val(); + download_type.val(cond.type); + download_dir.val(cond.dir); + download_tags.val(cond.tags); + download_keywords.val(cond.keywords); + download_form.submit(); } function downloadId(id) { - download_id.attr("value", id); - download_type.attr("value", ""); - download_dir.attr("value", ""); - download_tags.attr("value", ""); - download_keywords.attr("value", ""); - download_form.submit(); + download_id.attr('value', id); + download_type.attr('value', ''); + download_dir.attr('value', ''); + download_tags.attr('value', ''); + download_keywords.attr('value', ''); + download_form.submit(); } -const page_ul = $("#library-page-ul"); -const page_li = $(".library-page-li"); -const page_no = $(".library-page-no"); +const page_ul = $('#library-page-ul'); +const page_li = $('.library-page-li'); +const page_no = $('.library-page-no'); function processResults(data) { - lib_group.animate({ opacity: 0 }, 200, function () { - lib_loading.hide(); - let total_pages = data.total_pages; - let active_page = data.active_page; - let items = data.items; - items.forEach( - function (item) { - addResultItem(item); - bindLibraryResultEvent(); - } - ); + lib_group.animate({opacity: 0}, 200, function() { + lib_loading.hide(); + const total_pages = data.total_pages; + const active_page = data.active_page; + const items = data.items; + items.forEach( + function(item) { + addResultItem(item); + bindLibraryResultEvent(); + }, + ); - page_ul.empty(); - page_li.removeClass('active').empty(); + page_ul.empty(); + page_li.removeClass('active').empty(); - let i = 1; - let page_li_copy; - let page_no_copy; + let i = 1; + let page_li_copy; + let page_no_copy; - if (total_pages > 25) { - i = (active_page - 12 >= 1) ? active_page - 12 : 1; - let _i = total_pages - 23; - i = (i < _i) ? i : _i; - page_li_copy = page_li.clone(); - page_no_copy = page_no.clone(); - page_no_copy.html("«"); + if (total_pages > 25) { + i = (active_page - 12 >= 1) ? active_page - 12 : 1; + const _i = total_pages - 23; + i = (i < _i) ? i : _i; + page_li_copy = page_li.clone(); + page_no_copy = page_no.clone(); + page_no_copy.html('«'); - page_no_copy.click(function (e) { - updateResults(1); - }); + page_no_copy.click(function(e) { + updateResults(1); + }); - page_no_copy.appendTo(page_li_copy); - page_li_copy.appendTo(page_ul); - } + page_no_copy.appendTo(page_li_copy); + page_li_copy.appendTo(page_ul); + } - let limit = i + 24; - for (; i <= total_pages && i <= limit; i++) { - page_li_copy = page_li.clone(); - page_no_copy = page_no.clone(); - page_no_copy.html(i.toString()); - if (active_page === i) { - page_li_copy.addClass("active"); - } else { - page_no_copy.click(function (e) { - let _page_no = $(e.currentTarget).html(); - updateResults(_page_no); - }); - } - page_no_copy.appendTo(page_li_copy); - page_li_copy.appendTo(page_ul); - } + const limit = i + 24; + for (; i <= total_pages && i <= limit; i++) { + page_li_copy = page_li.clone(); + page_no_copy = page_no.clone(); + page_no_copy.html(i.toString()); + if (active_page === i) { + page_li_copy.addClass('active'); + } else { + page_no_copy.click(function(e) { + const _page_no = $(e.currentTarget).html(); + updateResults(_page_no); + }); + } + page_no_copy.appendTo(page_li_copy); + page_li_copy.appendTo(page_ul); + } - if (limit < total_pages) { - page_li_copy = page_li.clone(); - page_no_copy = page_no.clone(); - page_no_copy.html("»"); + if (limit < total_pages) { + page_li_copy = page_li.clone(); + page_no_copy = page_no.clone(); + page_no_copy.html('»'); - page_no_copy.click(function (e) { - updateResults(total_pages); - }); + page_no_copy.click(function(e) { + updateResults(total_pages); + }); - page_no_copy.appendTo(page_li_copy); - page_li_copy.appendTo(page_ul); - } + page_no_copy.appendTo(page_li_copy); + page_li_copy.appendTo(page_ul); + } - lib_group.animate({ opacity: 1 }, 200); - }); + lib_group.animate({opacity: 1}, 200); + }); } // --------------------- // ------ Tagging ------ // --------------------- -const add_tag_modal_title = $("#addTagModalTitle"); -const add_tag_modal_item_id = $("#addTagModalItemId"); -const add_tag_modal_tags = $("#addTagModalTags"); -const add_tag_modal_input = $("#addTagModalInput"); -const modal_tag = $(".modal-tag"); -const modal_tag_text = $(".modal-tag-text"); +const add_tag_modal_title = $('#addTagModalTitle'); +const add_tag_modal_item_id = $('#addTagModalItemId'); +const add_tag_modal_tags = $('#addTagModalTags'); +const add_tag_modal_input = $('#addTagModalInput'); +const modal_tag = $('.modal-tag'); +const modal_tag_text = $('.modal-tag-text'); function addTagModalShow(_id, _title, _tag_tuples) { - add_tag_modal_title.html("Edit tags for " + _title); - add_tag_modal_item_id.val(_id); - add_tag_modal_tags.empty(); - _tag_tuples.forEach(function (tag_tuple) { - modal_tag_text.html(tag_tuple[0]); - let tag_copy = modal_tag.clone(); - let modal_tag_remove = tag_copy.find(".modal-tag-remove"); - modal_tag_remove.click(function (e) { - $(e.currentTarget).parent().remove(); - }); - tag_copy.show(); - tag_copy.appendTo(add_tag_modal_tags); - modal_tag_text.html(""); + add_tag_modal_title.html('Edit tags for ' + _title); + add_tag_modal_item_id.val(_id); + add_tag_modal_tags.empty(); + _tag_tuples.forEach(function(tag_tuple) { + modal_tag_text.html(tag_tuple[0]); + const tag_copy = modal_tag.clone(); + const modal_tag_remove = tag_copy.find('.modal-tag-remove'); + modal_tag_remove.click(function(e) { + $(e.currentTarget).parent().remove(); }); - add_tag_modal.modal('show'); + tag_copy.show(); + tag_copy.appendTo(add_tag_modal_tags); + modal_tag_text.html(''); + }); + add_tag_modal.modal('show'); } function addTagModalAdd() { - let new_tags = add_tag_modal_input.val().split(",").map(function (str) { return str.trim() }); - new_tags.forEach(function (tag) { - modal_tag_text.html(tag); - let tag_copy = modal_tag.clone(); - let modal_tag_remove = tag_copy.find(".modal-tag-remove"); - modal_tag_remove.click(function (e) { - $(e.currentTarget).parent().remove(); - }); - tag_copy.show(); - tag_copy.appendTo(add_tag_modal_tags); - modal_tag_text.html(""); + const new_tags = add_tag_modal_input.val().split(',').map(function(str) { + return str.trim(); + }); + new_tags.forEach(function(tag) { + modal_tag_text.html(tag); + const tag_copy = modal_tag.clone(); + const modal_tag_remove = tag_copy.find('.modal-tag-remove'); + modal_tag_remove.click(function(e) { + $(e.currentTarget).parent().remove(); }); - add_tag_modal_input.val(""); + tag_copy.show(); + tag_copy.appendTo(add_tag_modal_tags); + modal_tag_text.html(''); + }); + add_tag_modal_input.val(''); } function addTagModalSubmit() { - let all_tags = $(".modal-tag-text"); - let tags = []; - all_tags.each(function (i, element) { - if (element.innerHTML) { - tags.push(element.innerHTML); - } - }); + const all_tags = $('.modal-tag-text'); + const tags = []; + all_tags.each(function(i, element) { + if (element.innerHTML) { + tags.push(element.innerHTML); + } + }); - $.ajax({ - type: 'POST', - url: 'library', - data: { - action: 'edit_tags', - id: add_tag_modal_item_id.val(), - tags: tags.join(",") - } - }); - updateResults(active_page); + $.ajax({ + type: 'POST', + url: 'library', + data: { + action: 'edit_tags', + id: add_tag_modal_item_id.val(), + tags: tags.join(','), + }, + }); + updateResults(active_page); } // --------------------- // ------- Volume ------ // --------------------- -const volume_popover_btn = document.querySelector("#volume-popover-btn"); -const volume_popover_div = document.querySelector("#volume-popover"); +const volume_popover_btn = document.querySelector('#volume-popover-btn'); +const volume_popover_div = document.querySelector('#volume-popover'); let volume_popover_instance = null; let volume_popover_show = false; -volume_popover_btn.addEventListener('click', function(e){ e.stopPropagation(); }) -volume_popover_div.addEventListener('click', function(e){ e.stopPropagation(); }) +volume_popover_btn.addEventListener('click', function(e) { + e.stopPropagation(); +}); -function toggleVolumePopover(){ - if (!volume_popover_show){ - volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, { - placement: 'top', - modifiers: { - offset: { offset: '0, 8' } - } - } ); - volume_popover_div.setAttribute('data-show', ''); - } else { - volume_popover_div.removeAttribute('data-show'); - if (volume_popover_instance){ - volume_popover_instance.destroy(); - volume_popover_instance = null; - } +volume_popover_div.addEventListener('click', function(e) { + e.stopPropagation(); +}); + +function toggleVolumePopover() { + if (!volume_popover_show) { + volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, { + placement: 'top', + modifiers: { + offset: {offset: '0, 8'}, + }, + } ); + volume_popover_div.setAttribute('data-show', ''); + } else { + volume_popover_div.removeAttribute('data-show'); + if (volume_popover_instance) { + volume_popover_instance.destroy(); + volume_popover_instance = null; } - volume_popover_show = !volume_popover_show; + } + volume_popover_show = !volume_popover_show; - document.addEventListener('click', function(){ - volume_popover_div.removeAttribute('data-show'); - if (volume_popover_instance){ - volume_popover_instance.destroy(); - volume_popover_instance = null; - volume_popover_show = !volume_popover_show; - } - }, { once: true } ); + document.addEventListener('click', function() { + volume_popover_div.removeAttribute('data-show'); + if (volume_popover_instance) { + volume_popover_instance.destroy(); + volume_popover_instance = null; + volume_popover_show = !volume_popover_show; + } + }, {once: true} ); } let volume_update_timer; function setVolumeDelayed(new_volume_value) { - window.clearTimeout(volume_update_timer); - volume_update_timer = window.setTimeout(function () { - request('post', { action: 'volume_set_value', new_volume: new_volume_value }); - }, 500); // delay in milliseconds + window.clearTimeout(volume_update_timer); + volume_update_timer = window.setTimeout(function() { + request('post', {action: 'volume_set_value', new_volume: new_volume_value}); + }, 500); // delay in milliseconds } // --------------------- // ------- Upload ------ // --------------------- -const uploadModal = $("#uploadModal"); +const uploadModal = $('#uploadModal'); -const uploadFileInput = document.getElementById("uploadSelectFile"); -const uploadModalItem = document.getElementsByClassName("uploadItem")[0]; -const uploadModalList = document.getElementById("uploadModalList"); -const uploadTargetDir = document.getElementById("uploadTargetDir"); -const uploadSuccessAlert = document.getElementById("uploadSuccessAlert"); -const uploadSubmitBtn = document.getElementById("uploadSubmit"); -const uploadCancelBtn = document.getElementById("uploadCancel"); -const uploadCloseBtn = document.getElementById("uploadClose"); +const uploadFileInput = document.getElementById('uploadSelectFile'); +const uploadModalItem = document.getElementsByClassName('uploadItem')[0]; +const uploadModalList = document.getElementById('uploadModalList'); +const uploadTargetDir = document.getElementById('uploadTargetDir'); +const uploadSuccessAlert = document.getElementById('uploadSuccessAlert'); +const uploadSubmitBtn = document.getElementById('uploadSubmit'); +const uploadCancelBtn = document.getElementById('uploadCancel'); +const uploadCloseBtn = document.getElementById('uploadClose'); -const maxFileSize = parseInt(document.getElementById("maxUploadFileSize").value); +const maxFileSize = parseInt(document.getElementById('maxUploadFileSize').value); let filesToProceed = []; -let filesProgressItem = {}; +const filesProgressItem = {}; let runningXHR = null; let areYouSureToCancelUploading = false; -uploadSubmitBtn.addEventListener("click", uploadStart); -uploadCancelBtn.addEventListener("click", uploadCancel) +uploadSubmitBtn.addEventListener('click', uploadStart); +uploadCancelBtn.addEventListener('click', uploadCancel); -function uploadStart(){ - uploadModalList.textContent = ''; - uploadSuccessAlert.style.display = 'none'; - uploadCancelBtn.style.display = 'none'; - uploadCloseBtn.style.display = 'block'; - areYouSureToCancelUploading = false; - $(uploadCancelBtn).tooltip('hide'); - const file_list = uploadFileInput.files; +function uploadStart() { + uploadModalList.textContent = ''; + uploadSuccessAlert.style.display = 'none'; + uploadCancelBtn.style.display = 'none'; + uploadCloseBtn.style.display = 'block'; + areYouSureToCancelUploading = false; + $(uploadCancelBtn).tooltip('hide'); + const file_list = uploadFileInput.files; - if (file_list.length) { - for (const file of file_list) { - generateUploadProgressItem(file); - if (file.size > maxFileSize) { - setUploadError(file.name, 'File too large!') - continue; - } else if (!file.type.includes("audio")) { - setUploadError(file.name, 'Unsupported media format!') - continue; - } + if (file_list.length) { + for (const file of file_list) { + generateUploadProgressItem(file); + if (file.size > maxFileSize) { + setUploadError(file.name, 'File too large!'); + continue; + } else if (!file.type.includes('audio')) { + setUploadError(file.name, 'Unsupported media format!'); + continue; + } - filesToProceed.push(file); - } - - uploadFileInput.value = ''; - uploadModal.modal("show"); - uploadNextFile(); + filesToProceed.push(file); } + + uploadFileInput.value = ''; + uploadModal.modal('show'); + uploadNextFile(); + } } -function setUploadError(filename, error){ - let file_progress_item = filesProgressItem[filename]; +function setUploadError(filename, error) { + const file_progress_item = filesProgressItem[filename]; - file_progress_item.title.classList.add("text-muted"); - file_progress_item.error.innerHTML += 'Error: ' + error; - setProgressBar(file_progress_item.progress, 1); - file_progress_item.progress.classList.add("bg-danger"); - file_progress_item.progress.classList.remove("progress-bar-animated"); + file_progress_item.title.classList.add('text-muted'); + file_progress_item.error.innerHTML += 'Error: ' + error; + setProgressBar(file_progress_item.progress, 1); + file_progress_item.progress.classList.add('bg-danger'); + file_progress_item.progress.classList.remove('progress-bar-animated'); } -function generateUploadProgressItem(file){ - let item_clone = uploadModalItem.cloneNode(true); - let title = item_clone.querySelector(".uploadItemTitle"); - title.innerHTML = file.name; - let error = item_clone.querySelector(".uploadItemError"); - let progress = item_clone.querySelector(".uploadProgress"); - item_clone.style.display = "block"; +function generateUploadProgressItem(file) { + const item_clone = uploadModalItem.cloneNode(true); + const title = item_clone.querySelector('.uploadItemTitle'); + title.innerHTML = file.name; + const error = item_clone.querySelector('.uploadItemError'); + const progress = item_clone.querySelector('.uploadProgress'); + item_clone.style.display = 'block'; - let item = { title: title, error: error, progress: progress }; - filesProgressItem[file.name] = item; - uploadModalList.appendChild(item_clone); + const item = {title: title, error: error, progress: progress}; + filesProgressItem[file.name] = item; + uploadModalList.appendChild(item_clone); - return item; + return item; } -function uploadNextFile(){ - uploadCancelBtn.style.display = 'block'; - uploadCloseBtn.style.display = 'none'; +function uploadNextFile() { + uploadCancelBtn.style.display = 'block'; + uploadCloseBtn.style.display = 'none'; - let req = new XMLHttpRequest(); - let file = filesToProceed.shift(); - let file_progress_item = filesProgressItem[file.name]; + const req = new XMLHttpRequest(); + const file = filesToProceed.shift(); + const file_progress_item = filesProgressItem[file.name]; - req.addEventListener("load", function(){ - if (this.status === 200) { - setProgressBar(file_progress_item.progress, 1); - file_progress_item.progress.classList.add("bg-success"); - file_progress_item.progress.classList.remove("progress-bar-animated"); - } else if (this.status === 400 || this.status === 403) { - setUploadError(file.name, 'Illegal request!') - } else if (this.status === 500) { - setUploadError(file.name, 'Server internal error!') - } else { - if (this.responseText) { - setUploadError(file.name, this.responseText) - } else { - setUploadError(file.name, 'Unknown error!') - } - } - - if (filesToProceed.length) { - uploadNextFile(); - } else { - uploadSuccessAlert.style.display = "block"; - runningXHR = null; - - uploadCancelBtn.style.display = 'none'; - uploadCloseBtn.style.display = 'block'; - - request('post', {action : 'rescan'}); - updateResults(); - } - }); - - req.upload.addEventListener("progress", function(e){ - if (e.lengthComputable) { - let percent = e.loaded / e.total; - setProgressBar(file_progress_item.progress, percent, Math.floor(percent*100) + "%"); - } - }); - - let form = new FormData(); - form.append('file', file); - form.append('targetdir', uploadTargetDir.value); - - req.open('POST', 'upload'); - req.withCredentials = true; - req.send(form); - - file_progress_item.progress.classList.add("progress-bar-striped"); - file_progress_item.progress.classList.add("progress-bar-animated"); - - runningXHR = req; -} - -function uploadCancel(){ - if (!areYouSureToCancelUploading){ - $(uploadCancelBtn).tooltip('show'); + req.addEventListener('load', function() { + if (this.status === 200) { + setProgressBar(file_progress_item.progress, 1); + file_progress_item.progress.classList.add('bg-success'); + file_progress_item.progress.classList.remove('progress-bar-animated'); + } else if (this.status === 400 || this.status === 403) { + setUploadError(file.name, 'Illegal request!'); + } else if (this.status === 500) { + setUploadError(file.name, 'Server internal error!'); } else { - $(uploadCancelBtn).tooltip('hide'); - uploadModal.modal('hide'); - runningXHR.abort() - filesToProceed = []; - uploadFileInput.value = ''; - request('post', {action : 'rescan'}); - updateResults(); + if (this.responseText) { + setUploadError(file.name, this.responseText); + } else { + setUploadError(file.name, 'Unknown error!'); + } } - areYouSureToCancelUploading = !areYouSureToCancelUploading; + if (filesToProceed.length) { + uploadNextFile(); + } else { + uploadSuccessAlert.style.display = 'block'; + runningXHR = null; + + uploadCancelBtn.style.display = 'none'; + uploadCloseBtn.style.display = 'block'; + + request('post', {action: 'rescan'}); + updateResults(); + } + }); + + req.upload.addEventListener('progress', function(e) { + if (e.lengthComputable) { + const percent = e.loaded / e.total; + setProgressBar(file_progress_item.progress, percent, Math.floor(percent*100) + '%'); + } + }); + + const form = new FormData(); + form.append('file', file); + form.append('targetdir', uploadTargetDir.value); + + req.open('POST', 'upload'); + req.withCredentials = true; + req.send(form); + + file_progress_item.progress.classList.add('progress-bar-striped'); + file_progress_item.progress.classList.add('progress-bar-animated'); + + runningXHR = req; +} + +function uploadCancel() { + if (!areYouSureToCancelUploading) { + $(uploadCancelBtn).tooltip('show'); + } else { + $(uploadCancelBtn).tooltip('hide'); + uploadModal.modal('hide'); + runningXHR.abort(); + filesToProceed = []; + uploadFileInput.value = ''; + request('post', {action: 'rescan'}); + updateResults(); + } + + areYouSureToCancelUploading = !areYouSureToCancelUploading; } // --------------------- // ------ Player ------ // --------------------- -const player = document.getElementById("playerToast"); -const playerArtwork = document.getElementById("playerArtwork"); -const playerArtworkIdle = document.getElementById("playerArtworkIdle"); -const playerTitle = document.getElementById("playerTitle"); -const playerArtist = document.getElementById("playerArtist"); -const playerBar = document.getElementById("playerBar"); -const playerBarBox = document.getElementById("playerBarBox"); -const playerPlayBtn = document.getElementById("playerPlayBtn"); -const playerPauseBtn = document.getElementById("playerPauseBtn"); -const playerSkipBtn = document.getElementById("playerSkipBtn"); +const player = document.getElementById('playerToast'); +const playerArtwork = document.getElementById('playerArtwork'); +const playerArtworkIdle = document.getElementById('playerArtworkIdle'); +const playerTitle = document.getElementById('playerTitle'); +const playerArtist = document.getElementById('playerArtist'); +const playerBar = document.getElementById('playerBar'); +const playerBarBox = document.getElementById('playerBarBox'); +const playerPlayBtn = document.getElementById('playerPlayBtn'); +const playerPauseBtn = document.getElementById('playerPauseBtn'); +const playerSkipBtn = document.getElementById('playerSkipBtn'); let currentPlayingItem = null; function togglePlayer() { - $(player).toast("show"); + $(player).toast('show'); } -function playerSetIdle(){ - playerArtwork.style.display ='none'; - playerArtworkIdle.style.display ='block'; - playerTitle.textContent = '-- IDLE --'; - playerArtist.textContent = ''; - setProgressBar(playerBar, 0); +function playerSetIdle() { + playerArtwork.style.display ='none'; + playerArtworkIdle.style.display ='block'; + playerTitle.textContent = '-- IDLE --'; + playerArtist.textContent = ''; + setProgressBar(playerBar, 0); } -function updatePlayerInfo(item){ - if (!item){ - playerSetIdle(); - } - playerArtwork.style.display ='block'; - playerArtworkIdle.style.display ='none'; - currentPlayingItem = item; - playerTitle.textContent = item.title; - playerArtist.textContent = item.artist; - playerArtwork.setAttribute("src", item.thumbnail); +function updatePlayerInfo(item) { + if (!item) { + playerSetIdle(); + } + playerArtwork.style.display ='block'; + playerArtworkIdle.style.display ='none'; + currentPlayingItem = item; + playerTitle.textContent = item.title; + playerArtist.textContent = item.artist; + playerArtwork.setAttribute('src', item.thumbnail); - if (isOverflown(playerTitle)) { - playerTitle.classList.add("scrolling") - } else { - playerTitle.classList.remove("scrolling") - } + if (isOverflown(playerTitle)) { + playerTitle.classList.add('scrolling'); + } else { + playerTitle.classList.remove('scrolling'); + } - if (isOverflown(playerArtist)) { - playerArtist.classList.add("scrolling") - } else { - playerArtist.classList.remove("scrolling") - } + if (isOverflown(playerArtist)) { + playerArtist.classList.add('scrolling'); + } else { + playerArtist.classList.remove('scrolling'); + } } function updatePlayerControls(play, empty) { - if (empty) { - playerSetIdle(); - playerPlayBtn.setAttribute("disabled", ""); - playerPauseBtn.setAttribute("disabled", ""); - playerSkipBtn.setAttribute("disabled", ""); - } else { - playerPlayBtn.removeAttribute("disabled"); - playerPauseBtn.removeAttribute("disabled"); - playerSkipBtn.removeAttribute("disabled"); - } - if (play) { - playerPlayBtn.style.display ='none'; - playerPauseBtn.style.display = 'block'; - } else { - playerPlayBtn.style.display = 'block'; - playerPauseBtn.style.display = 'none'; - } + if (empty) { + playerSetIdle(); + playerPlayBtn.setAttribute('disabled', ''); + playerPauseBtn.setAttribute('disabled', ''); + playerSkipBtn.setAttribute('disabled', ''); + } else { + playerPlayBtn.removeAttribute('disabled'); + playerPauseBtn.removeAttribute('disabled'); + playerSkipBtn.removeAttribute('disabled'); + } + if (play) { + playerPlayBtn.style.display ='none'; + playerPauseBtn.style.display = 'block'; + } else { + playerPlayBtn.style.display = 'block'; + playerPauseBtn.style.display = 'none'; + } } let playhead_timer; let player_playhead_position; let playhead_dragging = false; -function updatePlayerPlayhead(playhead){ - if (!currentPlayingItem || playhead_dragging){ - return; - } - if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead){ - playerBar.classList.remove("progress-bar-animated"); - clearInterval(playhead_timer); - player_playhead_position = playhead; +function updatePlayerPlayhead(playhead) { + if (!currentPlayingItem || playhead_dragging) { + return; + } + if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead) { + playerBar.classList.remove('progress-bar-animated'); + clearInterval(playhead_timer); + player_playhead_position = playhead; + setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position)); + if (playing) { + playhead_timer = setInterval(function() { + player_playhead_position += 0.1; setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position)); - if (playing) { - playhead_timer = setInterval(function () { - player_playhead_position += 0.1; - setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position)); - }, 100); // delay in milliseconds - } + }, 100); // delay in milliseconds + } + } else { + if (playing) { + playerBar.classList.add('progress-bar-animated'); } else { - if (playing) { - playerBar.classList.add("progress-bar-animated"); - } else { - playerBar.classList.remove("progress-bar-animated"); - } - setProgressBar(playerBar, 1); + playerBar.classList.remove('progress-bar-animated'); } + setProgressBar(playerBar, 1); + } } -playerBarBox.addEventListener('mousedown', function () { - if (currentPlayingItem && currentPlayingItem.duration > 0){ - playerBarBox.addEventListener('mousemove', playheadDragged); - clearInterval(playhead_timer); - playhead_dragging = true; - } -}); -playerBarBox.addEventListener('mouseup', function (event) { - playerBarBox.removeEventListener('mousemove', playheadDragged); - let percent = event.offsetX / playerBarBox.clientWidth; - request('post', {move_playhead: percent * currentPlayingItem.duration}); - playhead_dragging = false; +playerBarBox.addEventListener('mousedown', function() { + if (currentPlayingItem && currentPlayingItem.duration > 0) { + playerBarBox.addEventListener('mousemove', playheadDragged); + clearInterval(playhead_timer); + playhead_dragging = true; + } }); -function playheadDragged(event){ - let percent = event.offsetX / playerBarBox.clientWidth; - setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration)); +playerBarBox.addEventListener('mouseup', function(event) { + playerBarBox.removeEventListener('mousemove', playheadDragged); + const percent = event.offsetX / playerBarBox.clientWidth; + request('post', {move_playhead: percent * currentPlayingItem.duration}); + playhead_dragging = false; +}); + +function playheadDragged(event) { + const percent = event.offsetX / playerBarBox.clientWidth; + setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration)); } - -// --------------------- -// ------- Util ------- -// --------------------- - -function isOverflown(element) { - return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; -} - -function setProgressBar(bar, progress, text="") { - let prog_str = (progress*100).toString(); - bar.setAttribute("aria-valuenow", prog_str); - bar.style.width = prog_str + "%"; - bar.textContent = text; -} - -function secondsToStr(seconds) { - seconds = Math.floor(seconds); - let mins = Math.floor(seconds / 60); - let secs = seconds % 60; - return ("00" + mins).slice(-2) + ":" + ("00" + secs).slice(-2); -} +// ----------------------- +// ----- Application ----- +// ----------------------- updateResults(); -$(document).ready(updatePlaylist); -// Check the version of playlist to see if update is needed. -setInterval(checkForPlaylistUpdate, 3000); +document.addEventListener('DOMContentLoaded', () => { + updatePlaylist(); + + // Check the version of playlist to see if update is needed. + setInterval(checkForPlaylistUpdate, 3000); +}); diff --git a/web/src/js/theme.mjs b/web/src/js/theme.mjs index 29943d7..f83f921 100644 --- a/web/src/js/theme.mjs +++ b/web/src/js/theme.mjs @@ -1,7 +1,6 @@ export default class { /** - * Internal state for dark theme activation. - * @property {boolean} + * @property {boolean} #dark Interal state for dark theme activation. * @private */ static #dark = false; @@ -10,33 +9,34 @@ export default class { * Inialize the theme class. */ static init() { - // Check LocalStorage for dark theme selection - if (localStorage.getItem('darkTheme') === 'true') { - // Update page theme - this.set(true); - } + // Check LocalStorage for dark theme selection + if (localStorage.getItem('darkTheme') === 'true') { + // Update page theme + this.set(true); + } } /** * Set page theme and update local storage variable. + * * @param {boolean} dark Whether to activate dark theme. */ static set(dark = false) { - // Swap CSS to selected theme - document.getElementById('pagestyle') - .setAttribute('href', 'static/css/' + (dark ? 'dark' : 'main') + '.css'); + // Swap CSS to selected theme + document.getElementById('pagestyle') + .setAttribute('href', 'static/css/' + (dark ? 'dark' : 'main') + '.css'); - // Update local storage - localStorage.setItem('darkTheme', dark); + // Update local storage + localStorage.setItem('darkTheme', dark); - // Update internal state - this.#dark = dark; + // Update internal state + this.#dark = dark; } /** * Swap page theme. */ static swap() { - this.set(!this.#dark); + this.set(!this.#dark); } -} \ No newline at end of file +} diff --git a/web/src/js/util.js b/web/src/js/util.js new file mode 100644 index 0000000..86290ea --- /dev/null +++ b/web/src/js/util.js @@ -0,0 +1,17 @@ +export function isOverflown(element) { + return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; +} + +export function setProgressBar(bar, progress, text='') { + const progStr = (progress*100).toString(); + bar.setAttribute('aria-valuenow', progStr); + bar.style.width = progStr + '%'; + bar.textContent = text; +} + +export function secondsToStr(seconds) { + seconds = Math.floor(seconds); + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return ('00' + mins).slice(-2) + ':' + ('00' + secs).slice(-2); +} diff --git a/web/src/templates/index.html b/web/src/templates/index.html index 3a92afe..7461188 100644 --- a/web/src/templates/index.html +++ b/web/src/templates/index.html @@ -94,8 +94,7 @@ - See item on the playlist. - + See item on the playlist. @@ -394,7 +393,7 @@ -
+