diff --git a/dist/ngXosVendor.min.js b/dist/ngXosVendor.min.js
index 6dd6f45..65c87e1 100644
--- a/dist/ngXosVendor.min.js
+++ b/dist/ngXosVendor.min.js
@@ -1,17 +1,16 @@
-!function(t){"use strict";function n(t,n){return n=n||Error,function(){var e,r,i=2,o=arguments,a=o[0],u="["+(t?t+":":"")+a+"] ",s=o[1];for(u+=s.replace(/\{\d+\}/g,function(t){var n=+t.slice(1,-1),e=n+i;return e<o.length?$t(o[e]):t}),u+="\nhttp://errors.angularjs.org/1.5.9-build.4970+sha.1660ddd/"+(t?t+"/":"")+a,r=i,e="?";r<o.length;r++,e="&")u+=e+"p"+(r-i)+"="+encodeURIComponent($t(o[r]));return new n(u)}}function e(t){if(null==t||_(t))return!1;if(Kr(t)||x(t)||qr&&t instanceof qr)return!0;var n="length"in Object(t)&&t.length;return w(n)&&(n>=0&&(n-1 in t||t instanceof Array)||"function"==typeof t.item)}function r(t,n,i){var o,a;if(t)if(S(t))for(o in t)"prototype"!==o&&"length"!==o&&"name"!==o&&t.hasOwnProperty(o)&&n.call(i,t[o],o,t);else if(Kr(t)||e(t)){var u="object"!=typeof t;for(o=0,a=t.length;o<a;o++)(u||o in t)&&n.call(i,t[o],o,t)}else if(t.forEach&&t.forEach!==r)t.forEach(n,i,t);else if(b(t))for(o in t)n.call(i,t[o],o,t);else if("function"==typeof t.hasOwnProperty)for(o in t)t.hasOwnProperty(o)&&n.call(i,t[o],o,t);else for(o in t)jr.call(t,o)&&n.call(i,t[o],o,t);return t}function i(t,n,e){for(var r=Object.keys(t).sort(),i=0;i<r.length;i++)n.call(e,t[r[i]],r[i]);return r}function o(t){return function(n,e){t(e,n)}}function a(){return++Jr}function u(t,n){n?t.$$hashKey=n:delete t.$$hashKey}function s(t,n,e){for(var r=t.$$hashKey,i=0,o=n.length;i<o;++i){var a=n[i];if($(a)||S(a))for(var l=Object.keys(a),c=0,f=l.length;c<f;c++){var h=l[c],p=a[h];e&&$(p)?C(p)?t[h]=new Date(p.valueOf()):M(p)?t[h]=new RegExp(p):p.nodeName?t[h]=p.cloneNode(!0):j(p)?t[h]=p.clone():($(t[h])||(t[h]=Kr(p)?[]:{}),s(t[h],[p],!0)):t[h]=p}}return u(t,r),t}function l(t){return s(t,Ur.call(arguments,1),!1)}function c(t){return s(t,Ur.call(arguments,1),!0)}function f(t){return parseInt(t,10)}function h(t,n){return l(Object.create(t),n)}function p(){}function d(t){return t}function v(t){return function(){return t}}function g(t){return S(t.toString)&&t.toString!==Yr}function m(t){return"undefined"==typeof t}function y(t){return"undefined"!=typeof t}function $(t){return null!==t&&"object"==typeof t}function b(t){return null!==t&&"object"==typeof t&&!Gr(t)}function x(t){return"string"==typeof t}function w(t){return"number"==typeof t}function C(t){return"[object Date]"===Yr.call(t)}function S(t){return"function"==typeof t}function M(t){return"[object RegExp]"===Yr.call(t)}function _(t){return t&&t.window===t}function k(t){return t&&t.$evalAsync&&t.$watch}function A(t){return"[object File]"===Yr.call(t)}function E(t){return"[object FormData]"===Yr.call(t)}function P(t){return"[object Blob]"===Yr.call(t)}function O(t){return"boolean"==typeof t}function T(t){return t&&S(t.then)}function L(t){return t&&w(t.length)&&Qr.test(Yr.call(t))}function N(t){return"[object ArrayBuffer]"===Yr.call(t)}function j(t){return!(!t||!(t.nodeName||t.prop&&t.attr&&t.find))}function R(t){var n,e={},r=t.split(",");for(n=0;n<r.length;n++)e[r[n]]=!0;return e}function D(t){return Rr(t.nodeName||t[0]&&t[0].nodeName)}function F(t,n){var e=t.indexOf(n);return e>=0&&t.splice(e,1),e}function I(t,n){function e(t,n){var e,r=n.$$hashKey;if(Kr(t))for(var o=0,a=t.length;o<a;o++)n.push(i(t[o]));else if(b(t))for(e in t)n[e]=i(t[e]);else if(t&&"function"==typeof t.hasOwnProperty)for(e in t)t.hasOwnProperty(e)&&(n[e]=i(t[e]));else for(e in t)jr.call(t,e)&&(n[e]=i(t[e]));return u(n,r),n}function i(t){if(!$(t))return t;var n=a.indexOf(t);if(n!==-1)return s[n];if(_(t)||k(t))throw Zr("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var r=!1,i=o(t);return void 0===i&&(i=Kr(t)?[]:Object.create(Gr(t)),r=!0),a.push(t),s.push(i),r?e(t,i):i}function o(t){switch(Yr.call(t)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new t.constructor(i(t.buffer),t.byteOffset,t.length);case"[object ArrayBuffer]":if(!t.slice){var n=new ArrayBuffer(t.byteLength);return new Uint8Array(n).set(new Uint8Array(t)),n}return t.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new t.constructor(t.valueOf());case"[object RegExp]":var e=new RegExp(t.source,t.toString().match(/[^\/]*$/)[0]);return e.lastIndex=t.lastIndex,e;case"[object Blob]":return new t.constructor([t],{type:t.type})}if(S(t.cloneNode))return t.cloneNode(!0)}var a=[],s=[];if(n){if(L(n)||N(n))throw Zr("cpta","Can't copy! TypedArray destination cannot be mutated.");if(t===n)throw Zr("cpi","Can't copy! Source and destination are identical.");return Kr(n)?n.length=0:r(n,function(t,e){"$$hashKey"!==e&&delete n[e]}),a.push(t),s.push(n),e(t,n)}return i(t)}function V(t,n){if(t===n)return!0;if(null===t||null===n)return!1;if(t!==t&&n!==n)return!0;var e,r,i,o=typeof t,a=typeof n;if(o===a&&"object"===o){if(!Kr(t)){if(C(t))return!!C(n)&&V(t.getTime(),n.getTime());if(M(t))return!!M(n)&&t.toString()===n.toString();if(k(t)||k(n)||_(t)||_(n)||Kr(n)||C(n)||M(n))return!1;i=dt();for(r in t)if("$"!==r.charAt(0)&&!S(t[r])){if(!V(t[r],n[r]))return!1;i[r]=!0}for(r in n)if(!(r in i)&&"$"!==r.charAt(0)&&y(n[r])&&!S(n[r]))return!1;return!0}if(!Kr(n))return!1;if((e=t.length)===n.length){for(r=0;r<e;r++)if(!V(t[r],n[r]))return!1;return!0}}return!1}function q(t,n,e){return t.concat(Ur.call(n,e))}function z(t,n){return Ur.call(t,n||0)}function B(t,n){var e=arguments.length>2?z(arguments,2):[];return!S(n)||n instanceof RegExp?n:e.length?function(){return arguments.length?n.apply(t,q(e,arguments,0)):n.apply(t,e)}:function(){return arguments.length?n.apply(t,arguments):n.call(t)}}function U(n,e){var r=e;return"string"==typeof n&&"$"===n.charAt(0)&&"$"===n.charAt(1)?r=void 0:_(e)?r="$WINDOW":e&&t.document===e?r="$DOCUMENT":k(e)&&(r="$SCOPE"),r}function W(t,n){if(!m(t))return w(n)||(n=n?2:null),JSON.stringify(t,U,n)}function H(t){return x(t)?JSON.parse(t):t}function Y(t,n){t=t.replace(ii,"");var e=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(e)?n:e}function G(t,n){return t=new Date(t.getTime()),t.setMinutes(t.getMinutes()+n),t}function Z(t,n,e){e=e?-1:1;var r=t.getTimezoneOffset(),i=Y(n,r);return G(t,e*(i-r))}function X(t){t=qr(t).clone();try{t.empty()}catch(n){}var e=qr("<div>").append(t).html();try{return t[0].nodeType===ci?Rr(e):e.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(t,n){return"<"+Rr(n)})}catch(n){return Rr(e)}}function J(t){try{return decodeURIComponent(t)}catch(n){}}function K(t){var n={};return r((t||"").split("&"),function(t){var e,r,i;t&&(r=t=t.replace(/\+/g,"%20"),e=t.indexOf("="),e!==-1&&(r=t.substring(0,e),i=t.substring(e+1)),r=J(r),y(r)&&(i=!y(i)||J(i),jr.call(n,r)?Kr(n[r])?n[r].push(i):n[r]=[n[r],i]:n[r]=i))}),n}function Q(t){var n=[];return r(t,function(t,e){Kr(t)?r(t,function(t){n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}):n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}),n.length?n.join("&"):""}function tt(t){return nt(t,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function nt(t,n){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,n?"%20":"+")}function et(t,n){var e,r,i=oi.length;for(r=0;r<i;++r)if(e=oi[r]+n,x(e=t.getAttribute(e)))return e;return null}function rt(t,n){var e,i,o={};r(oi,function(n){var r=n+"app";!e&&t.hasAttribute&&t.hasAttribute(r)&&(e=t,i=t.getAttribute(r))}),r(oi,function(n){var r,o=n+"app";!e&&(r=t.querySelector("["+o.replace(":","\\:")+"]"))&&(e=r,i=r.getAttribute(o))}),e&&(o.strictDi=null!==et(e,"strict-di"),n(e,i?[i]:[],o))}function it(n,e,i){$(i)||(i={});var o={strictDi:!1};i=l(o,i);var a=function(){if(n=qr(n),n.injector()){var r=n[0]===t.document?"document":X(n);throw Zr("btstrpd","App already bootstrapped with this element '{0}'",r.replace(/</,"&lt;").replace(/>/,"&gt;"))}e=e||[],e.unshift(["$provide",function(t){t.value("$rootElement",n)}]),i.debugInfoEnabled&&e.push(["$compileProvider",function(t){t.debugInfoEnabled(!0)}]),e.unshift("ng");var o=on(e,i.strictDi);return o.invoke(["$rootScope","$rootElement","$compile","$injector",function(t,n,e,r){t.$apply(function(){n.data("$injector",r),e(n)(t)})}]),o},u=/^NG_ENABLE_DEBUG_INFO!/,s=/^NG_DEFER_BOOTSTRAP!/;return t&&u.test(t.name)&&(i.debugInfoEnabled=!0,t.name=t.name.replace(u,"")),t&&!s.test(t.name)?a():(t.name=t.name.replace(s,""),Xr.resumeBootstrap=function(t){return r(t,function(t){e.push(t)}),a()},void(S(Xr.resumeDeferredBootstrap)&&Xr.resumeDeferredBootstrap()))}function ot(){t.name="NG_ENABLE_DEBUG_INFO!"+t.name,t.location.reload()}function at(t){var n=Xr.element(t).injector();if(!n)throw Zr("test","no injector found for element argument to getTestability");return n.get("$$testability")}function ut(t,n){return n=n||"_",t.replace(ai,function(t,e){return(e?n:"")+t.toLowerCase()})}function st(){var n;if(!ui){var e=ri();zr=m(e)?t.jQuery:e?t[e]:void 0,zr&&zr.fn.on?(qr=zr,l(zr.fn,{scope:ki.scope,isolateScope:ki.isolateScope,controller:ki.controller,injector:ki.injector,inheritedData:ki.inheritedData}),n=zr.cleanData,zr.cleanData=function(t){for(var e,r,i=0;null!=(r=t[i]);i++)e=zr._data(r,"events"),e&&e.$destroy&&zr(r).triggerHandler("$destroy");n(t)}):qr=Pt,Xr.element=qr,ui=!0}}function lt(t,n,e){if(!t)throw Zr("areq","Argument '{0}' is {1}",n||"?",e||"required");return t}function ct(t,n,e){return e&&Kr(t)&&(t=t[t.length-1]),lt(S(t),n,"not a function, got "+(t&&"object"==typeof t?t.constructor.name||"Object":typeof t)),t}function ft(t,n){if("hasOwnProperty"===t)throw Zr("badname","hasOwnProperty is not a valid {0} name",n)}function ht(t,n,e){if(!n)return t;for(var r,i=n.split("."),o=t,a=i.length,u=0;u<a;u++)r=i[u],t&&(t=(o=t)[r]);return!e&&S(t)?B(o,t):t}function pt(t){for(var n,e=t[0],r=t[t.length-1],i=1;e!==r&&(e=e.nextSibling);i++)(n||t[i]!==e)&&(n||(n=qr(Ur.call(t,0,i))),n.push(e));return n||t}function dt(){return Object.create(null)}function vt(t){if(null==t)return"";switch(typeof t){case"string":break;case"number":t=""+t;break;default:t=!g(t)||Kr(t)||C(t)?W(t):t.toString()}return t}function gt(t){function e(t,n,e){return t[n]||(t[n]=e())}var r=n("$injector"),i=n("ng"),o=e(t,"angular",Object);return o.$$minErr=o.$$minErr||n,e(o,"module",function(){var t={};return function(n,o,a){var u=function(t,n){if("hasOwnProperty"===t)throw i("badname","hasOwnProperty is not a valid {0} name",n)};return u(n,"module"),o&&t.hasOwnProperty(n)&&(t[n]=null),e(t,n,function(){function t(t,n,e,r){return r||(r=i),function(){return r[e||"push"]([t,n,arguments]),c}}function e(t,e,r){return r||(r=i),function(i,o){return o&&S(o)&&(o.$$moduleName=n),r.push([t,e,arguments]),c}}if(!o)throw r("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",n);var i=[],u=[],s=[],l=t("$injector","invoke","push",u),c={_invokeQueue:i,_configBlocks:u,_runBlocks:s,requires:o,name:n,provider:e("$provide","provider"),factory:e("$provide","factory"),service:e("$provide","service"),value:t("$provide","value"),constant:t("$provide","constant","unshift"),decorator:e("$provide","decorator",u),animation:e("$animateProvider","register"),filter:e("$filterProvider","register"),controller:e("$controllerProvider","register"),directive:e("$compileProvider","directive"),component:e("$compileProvider","component"),config:l,run:function(t){return s.push(t),this}};return a&&l(a),c})}})}function mt(t,n){if(Kr(t)){n=n||[];for(var e=0,r=t.length;e<r;e++)n[e]=t[e]}else if($(t)){n=n||{};for(var i in t)"$"===i.charAt(0)&&"$"===i.charAt(1)||(n[i]=t[i])}return n||t}function yt(t){var n=[];return JSON.stringify(t,function(t,e){if(e=U(t,e),$(e)){if(n.indexOf(e)>=0)return"...";n.push(e)}return e})}function $t(t){return"function"==typeof t?t.toString().replace(/ \{[\s\S]*$/,""):m(t)?"undefined":"string"!=typeof t?yt(t):t}function bt(e){l(e,{bootstrap:it,copy:I,extend:l,merge:c,equals:V,element:qr,forEach:r,injector:on,noop:p,bind:B,toJson:W,fromJson:H,identity:d,isUndefined:m,isDefined:y,isString:x,isFunction:S,isObject:$,isNumber:w,isElement:j,isArray:Kr,version:di,isDate:C,lowercase:Rr,uppercase:Dr,callbacks:{$$counter:0},getTestability:at,reloadWithDebugInfo:ot,$$minErr:n,$$csp:ei,$$encodeUriSegment:tt,$$encodeUriQuery:nt,$$stringify:vt}),(Br=gt(t))("ng",["ngLocale"],["$provide",function(t){t.provider({$$sanitizeUri:ke}),t.provider("$compile",gn).directive({a:Ro,input:na,textarea:na,form:qo,script:Xa,select:Qa,style:nu,option:tu,ngBind:ia,ngBindHtml:aa,ngBindTemplate:oa,ngClass:sa,ngClassEven:ca,ngClassOdd:la,ngCloak:fa,ngController:ha,ngForm:zo,ngHide:Ba,ngIf:va,ngInclude:ga,ngInit:ya,ngNonBindable:Na,ngPluralize:Fa,ngRepeat:Ia,ngShow:za,ngStyle:Ua,ngSwitch:Wa,ngSwitchWhen:Ha,ngSwitchDefault:Ya,ngOptions:Da,ngTransclude:Za,ngModel:Oa,ngList:$a,ngChange:ua,pattern:ru,ngPattern:ru,required:eu,ngRequired:eu,minlength:ou,ngMinlength:ou,maxlength:iu,ngMaxlength:iu,ngValue:ra,ngModelOptions:La}).directive({ngInclude:ma}).directive(Do).directive(pa),t.provider({$anchorScroll:an,$animate:Bi,$animateCss:Hi,$$animateJs:qi,$$animateQueue:zi,$$AnimateRunner:Wi,$$animateAsyncRun:Ui,$browser:hn,$cacheFactory:pn,$controller:wn,$document:Cn,$$isDocumentHidden:Sn,$exceptionHandler:Mn,$filter:qe,$$forceReflow:Ki,$interpolate:In,$interval:Vn,$http:jn,$httpParamSerializer:kn,$httpParamSerializerJQLike:An,$httpBackend:Dn,$xhrFactory:Rn,$jsonpCallbacks:uo,$location:ne,$log:ee,$parse:xe,$rootScope:_e,$q:we,$$q:Ce,$sce:Oe,$sceDelegate:Pe,$sniffer:Te,$templateCache:dn,$templateRequest:Le,$$testability:Ne,$timeout:je,$window:Fe,$$rAF:Me,$$jqLite:Jt,$$HashMap:Oi,$$cookieReader:Ve})}])}function xt(){return++gi}function wt(t){return t.replace(mi,function(t,n,e,r){return r?e.toUpperCase():e}).replace(yi,"Moz$1")}function Ct(t){return!wi.test(t)}function St(t){var n=t.nodeType;return n===si||!n||n===hi}function Mt(t){for(var n in vi[t.ng339])return!0;return!1}function _t(t){for(var n=0,e=t.length;n<e;n++)Nt(t[n])}function kt(t,n){var e,i,o,a,u=n.createDocumentFragment(),s=[];if(Ct(t))s.push(n.createTextNode(t));else{for(e=u.appendChild(n.createElement("div")),i=(Ci.exec(t)||["",""])[1].toLowerCase(),o=Mi[i]||Mi._default,e.innerHTML=o[1]+t.replace(Si,"<$1></$2>")+o[2],a=o[0];a--;)e=e.lastChild;s=q(s,e.childNodes),e=u.firstChild,e.textContent=""}return u.textContent="",u.innerHTML="",r(s,function(t){u.appendChild(t)}),u}function At(n,e){e=e||t.document;var r;return(r=xi.exec(n))?[e.createElement(r[1])]:(r=kt(n,e))?r.childNodes:[]}function Et(t,n){var e=t.parentNode;e&&e.replaceChild(n,t),n.appendChild(t)}function Pt(t){if(t instanceof Pt)return t;var n;if(x(t)&&(t=ti(t),n=!0),!(this instanceof Pt)){if(n&&"<"!==t.charAt(0))throw bi("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new Pt(t)}n?Vt(this,At(t)):Vt(this,t)}function Ot(t){return t.cloneNode(!0)}function Tt(t,n){if(n||Nt(t),t.querySelectorAll)for(var e=t.querySelectorAll("*"),r=0,i=e.length;r<i;r++)Nt(e[r])}function Lt(t,n,e,i){if(y(i))throw bi("offargs","jqLite#off() does not support the `selector` argument");var o=jt(t),a=o&&o.events,u=o&&o.handle;if(u)if(n){var s=function(n){var r=a[n];y(e)&&F(r||[],e),y(e)&&r&&r.length>0||(t.removeEventListener(n,u),delete a[n])};r(n.split(" "),function(t){s(t),$i[t]&&s($i[t])})}else for(n in a)"$destroy"!==n&&t.removeEventListener(n,u),delete a[n]}function Nt(t,n){var e=t.ng339,r=e&&vi[e];if(r){if(n)return void delete r.data[n];r.handle&&(r.events.$destroy&&r.handle({},"$destroy"),Lt(t)),delete vi[e],t.ng339=void 0}}function jt(t,n){var e=t.ng339,r=e&&vi[e];return n&&!r&&(t.ng339=e=xt(),r=vi[e]={events:{},data:{},handle:void 0}),r}function Rt(t,n,e){if(St(t)){var r=y(e),i=!r&&n&&!$(n),o=!n,a=jt(t,!i),u=a&&a.data;if(r)u[n]=e;else{if(o)return u;if(i)return u&&u[n];l(u,n)}}}function Dt(t,n){return!!t.getAttribute&&(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+n+" ")>-1}function Ft(t,n){n&&t.setAttribute&&r(n.split(" "),function(n){t.setAttribute("class",ti((" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+ti(n)+" "," ")))})}function It(t,n){if(n&&t.setAttribute){var e=(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(n.split(" "),function(t){t=ti(t),e.indexOf(" "+t+" ")===-1&&(e+=t+" ")}),t.setAttribute("class",ti(e))}}function Vt(t,n){if(n)if(n.nodeType)t[t.length++]=n;else{var e=n.length;if("number"==typeof e&&n.window!==n){if(e)for(var r=0;r<e;r++)t[t.length++]=n[r]}else t[t.length++]=n}}function qt(t,n){return zt(t,"$"+(n||"ngController")+"Controller")}function zt(t,n,e){t.nodeType===hi&&(t=t.documentElement);for(var r=Kr(n)?n:[n];t;){for(var i=0,o=r.length;i<o;i++)if(y(e=qr.data(t,r[i])))return e;t=t.parentNode||t.nodeType===pi&&t.host}}function Bt(t){for(Tt(t,!0);t.firstChild;)t.removeChild(t.firstChild)}function Ut(t,n){n||Tt(t);var e=t.parentNode;e&&e.removeChild(t)}function Wt(n,e){e=e||t,"complete"===e.document.readyState?e.setTimeout(n):qr(e).on("load",n)}function Ht(t,n){var e=Ai[n.toLowerCase()];return e&&Ei[D(t)]&&e}function Yt(t){return Pi[t]}function Gt(t,n){var e=function(e,r){e.isDefaultPrevented=function(){return e.defaultPrevented};var i=n[r||e.type],o=i?i.length:0;if(o){if(m(e.immediatePropagationStopped)){var a=e.stopImmediatePropagation;e.stopImmediatePropagation=function(){e.immediatePropagationStopped=!0,e.stopPropagation&&e.stopPropagation(),a&&a.call(e)}}e.isImmediatePropagationStopped=function(){return e.immediatePropagationStopped===!0};var u=i.specialHandlerWrapper||Zt;o>1&&(i=mt(i));for(var s=0;s<o;s++)e.isImmediatePropagationStopped()||u(t,e,i[s])}};return e.elem=t,e}function Zt(t,n,e){e.call(t,n)}function Xt(t,n,e){var r=n.relatedTarget;r&&(r===t||_i.call(t,r))||e.call(t,n)}function Jt(){this.$get=function(){return l(Pt,{hasClass:function(t,n){return t.attr&&(t=t[0]),Dt(t,n)},addClass:function(t,n){return t.attr&&(t=t[0]),It(t,n)},removeClass:function(t,n){return t.attr&&(t=t[0]),Ft(t,n)}})}}function Kt(t,n){var e=t&&t.$$hashKey;if(e)return"function"==typeof e&&(e=t.$$hashKey()),e;var r=typeof t;return e="function"===r||"object"===r&&null!==t?t.$$hashKey=r+":"+(n||a)():r+":"+t}function Qt(t,n){if(n){var e=0;this.nextUid=function(){return++e}}r(t,this.put,this)}function tn(t){return Function.prototype.toString.call(t)+" "}function nn(t){var n=tn(t).replace(Ri,""),e=n.match(Ti)||n.match(Li);return e}function en(t){var n=nn(t);return n?"function("+(n[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function rn(t,n,e){var i,o,a;if("function"==typeof t){if(!(i=t.$inject)){if(i=[],t.length){if(n)throw x(e)&&e||(e=t.name||en(t)),Di("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",e);o=nn(t),r(o[1].split(Ni),function(t){t.replace(ji,function(t,n,e){i.push(e)})})}t.$inject=i}}else Kr(t)?(a=t.length-1,ct(t[a],"fn"),i=t.slice(0,a)):ct(t,"fn",!0);return i}function on(t,n){function e(t){return function(n,e){return $(n)?void r(n,o(t)):t(n,e)}}function i(t,n){if(ft(t,"service"),(S(n)||Kr(n))&&(n=C.instantiate(n)),!n.$get)throw Di("pget","Provider '{0}' must define $get factory method.",t);return w[t+g]=n}function a(t,n){return function(){var e=k.invoke(n,this);if(m(e))throw Di("undef","Provider '{0}' must return a value from $get factory method.",t);return e}}function u(t,n,e){return i(t,{$get:e!==!1?a(t,n):n})}function s(t,n){return u(t,["$injector",function(t){return t.instantiate(n)}])}function l(t,n){return u(t,v(n),!1)}function c(t,n){ft(t,"constant"),w[t]=n,M[t]=n}function f(t,n){var e=C.get(t+g),r=e.$get;e.$get=function(){var t=k.invoke(r,e);return k.invoke(n,null,{$delegate:t})}}function h(t){lt(m(t)||Kr(t),"modulesToLoad","not an array");var n,e=[];return r(t,function(t){function r(t){var n,e;for(n=0,e=t.length;n<e;n++){var r=t[n],i=C.get(r[0]);i[r[1]].apply(i,r[2])}}if(!b.get(t)){b.put(t,!0);try{x(t)?(n=Br(t),e=e.concat(h(n.requires)).concat(n._runBlocks),r(n._invokeQueue),r(n._configBlocks)):S(t)?e.push(C.invoke(t)):Kr(t)?e.push(C.invoke(t)):ct(t,"module")}catch(i){throw Kr(t)&&(t=t[t.length-1]),i.message&&i.stack&&i.stack.indexOf(i.message)===-1&&(i=i.message+"\n"+i.stack),Di("modulerr","Failed to instantiate module {0} due to:\n{1}",t,i.stack||i.message||i)}}}),e}function p(t,e){function r(n,r){if(t.hasOwnProperty(n)){if(t[n]===d)throw Di("cdep","Circular dependency found: {0}",n+" <- "+y.join(" <- "));return t[n]}try{return y.unshift(n),t[n]=d,t[n]=e(n,r)}catch(i){throw t[n]===d&&delete t[n],i}finally{y.shift()}}function i(t,e,i){for(var o=[],a=on.$$annotate(t,n,i),u=0,s=a.length;u<s;u++){var l=a[u];if("string"!=typeof l)throw Di("itkn","Incorrect injection token! Expected service name as string, got {0}",l);o.push(e&&e.hasOwnProperty(l)?e[l]:r(l,i))}return o}function o(t){if(Vr<=11||"function"!=typeof t)return!1;var n=t.$$ngIsClass;return O(n)||(n=t.$$ngIsClass=/^(?:class\b|constructor\()/.test(tn(t))),n}function a(t,n,e,r){"string"==typeof e&&(r=e,e=null);var a=i(t,e,r);return Kr(t)&&(t=t[t.length-1]),o(t)?(a.unshift(null),new(Function.prototype.bind.apply(t,a))):t.apply(n,a)}function u(t,n,e){var r=Kr(t)?t[t.length-1]:t,o=i(t,n,e);return o.unshift(null),new(Function.prototype.bind.apply(r,o))}return{invoke:a,instantiate:u,get:r,annotate:on.$$annotate,has:function(n){return w.hasOwnProperty(n+g)||t.hasOwnProperty(n)}}}n=n===!0;var d={},g="Provider",y=[],b=new Qt([],(!0)),w={$provide:{provider:e(i),factory:e(u),service:e(s),value:e(l),constant:e(c),decorator:f}},C=w.$injector=p(w,function(t,n){throw Xr.isString(n)&&y.push(n),Di("unpr","Unknown provider: {0}",y.join(" <- "))}),M={},_=p(M,function(t,n){var e=C.get(t+g,n);return k.invoke(e.$get,e,void 0,t)}),k=_;w["$injector"+g]={$get:v(_)};var A=h(t);return k=_.get("$injector"),k.strictDi=n,r(A,function(t){t&&k.invoke(t)}),k}function an(){var t=!0;this.disableAutoScrolling=function(){t=!1},this.$get=["$window","$location","$rootScope",function(n,e,r){function i(t){var n=null;return Array.prototype.some.call(t,function(t){if("a"===D(t))return n=t,!0}),n}function o(){var t=u.yOffset;if(S(t))t=t();else if(j(t)){var e=t[0],r=n.getComputedStyle(e);t="fixed"!==r.position?0:e.getBoundingClientRect().bottom}else w(t)||(t=0);return t}function a(t){if(t){t.scrollIntoView();var e=o();if(e){var r=t.getBoundingClientRect().top;n.scrollBy(0,r-e)}}else n.scrollTo(0,0)}function u(t){t=x(t)?t:e.hash();var n;t?(n=s.getElementById(t))?a(n):(n=i(s.getElementsByName(t)))?a(n):"top"===t&&a(null):a(null)}var s=n.document;return t&&r.$watch(function(){return e.hash()},function(t,n){t===n&&""===t||Wt(function(){r.$evalAsync(u)})}),u}]}function un(t,n){return t||n?t?n?(Kr(t)&&(t=t.join(" ")),Kr(n)&&(n=n.join(" ")),t+" "+n):t:n:""}function sn(t){for(var n=0;n<t.length;n++){var e=t[n];if(e.nodeType===Ii)return e}}function ln(t){x(t)&&(t=t.split(" "));var n=dt();return r(t,function(t){t.length&&(n[t]=!0)}),n}function cn(t){return $(t)?t:{}}function fn(t,n,e,i){function o(t){try{t.apply(null,z(arguments,1))}finally{if(y--,0===y)for(;$.length;)try{$.pop()()}catch(n){e.error(n)}}}function a(t){var n=t.indexOf("#");return n===-1?"":t.substr(n)}function u(){S=null,s(),l()}function s(){b=M(),b=m(b)?null:b,V(b,A)&&(b=A),A=b}function l(){w===c.url()&&x===b||(w=c.url(),x=b,r(_,function(t){t(c.url(),b)}))}var c=this,f=t.location,h=t.history,d=t.setTimeout,v=t.clearTimeout,g={};c.isMock=!1;var y=0,$=[];c.$$completeOutstandingRequest=o,c.$$incOutstandingRequestCount=function(){y++},c.notifyWhenNoOutstandingRequests=function(t){0===y?t():$.push(t)};var b,x,w=f.href,C=n.find("base"),S=null,M=i.history?function(){try{return h.state}catch(t){}}:p;s(),x=b,c.url=function(n,e,r){if(m(r)&&(r=null),f!==t.location&&(f=t.location),h!==t.history&&(h=t.history),n){var o=x===r;if(w===n&&(!i.history||o))return c;var u=w&&Hn(w)===Hn(n);return w=n,x=r,!i.history||u&&o?(u||(S=n),e?f.replace(n):u?f.hash=a(n):f.href=n,f.href!==n&&(S=n)):(h[e?"replaceState":"pushState"](r,"",n),s(),x=b),S&&(S=n),c}return S||f.href.replace(/%27/g,"'")},c.state=function(){return b};var _=[],k=!1,A=null;c.onUrlChange=function(n){return k||(i.history&&qr(t).on("popstate",u),qr(t).on("hashchange",u),k=!0),_.push(n),n},c.$$applicationDestroyed=function(){qr(t).off("hashchange popstate",u)},c.$$checkUrlChange=l,c.baseHref=function(){var t=C.attr("href");return t?t.replace(/^(https?\:)?\/\/[^\/]*/,""):""},c.defer=function(t,n){var e;return y++,e=d(function(){delete g[e],o(t)},n||0),g[e]=!0,e},c.defer.cancel=function(t){return!!g[t]&&(delete g[t],v(t),o(p),!0)}}function hn(){this.$get=["$window","$log","$sniffer","$document",function(t,n,e,r){return new fn(t,r,n,e)}]}function pn(){this.$get=function(){function t(t,r){function i(t){t!==h&&(p?p===t&&(p=t.n):p=t,o(t.n,t.p),o(t,h),h=t,h.n=null)}function o(t,n){t!==n&&(t&&(t.p=n),n&&(n.n=t))}if(t in e)throw n("$cacheFactory")("iid","CacheId '{0}' is already taken!",t);var a=0,u=l({},r,{id:t}),s=dt(),c=r&&r.capacity||Number.MAX_VALUE,f=dt(),h=null,p=null;return e[t]={put:function(t,n){if(!m(n)){if(c<Number.MAX_VALUE){var e=f[t]||(f[t]={key:t});i(e)}return t in s||a++,s[t]=n,a>c&&this.remove(p.key),n}},get:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;i(n)}return s[t]},remove:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;n===h&&(h=n.p),n===p&&(p=n.n),o(n.n,n.p),delete f[t]}t in s&&(delete s[t],a--)},removeAll:function(){s=dt(),a=0,f=dt(),h=p=null},destroy:function(){s=null,u=null,f=null,delete e[t]},info:function(){return l({},u,{size:a})}}}var e={};return t.info=function(){var t={};return r(e,function(n,e){t[e]=n.info()}),t},t.get=function(t){return e[t]},t}}function dn(){this.$get=["$cacheFactory",function(t){return t("templates")}]}function vn(){}function gn(n,e){function i(t,n,e){var i=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,o=dt();return r(t,function(t,r){if(t in _)return void(o[r]=_[t]);var a=t.match(i);if(!a)throw Yi("iscp","Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}",n,r,t,e?"controller bindings definition":"isolate scope definition");o[r]={mode:a[1][0],collection:"*"===a[2],optional:"?"===a[3],attrName:a[4]||r},a[4]&&(_[t]=o[r])}),o}function a(t,n){var e={isolateScope:null,bindToController:null};if($(t.scope)&&(t.bindToController===!0?(e.bindToController=i(t.scope,n,!0),e.isolateScope={}):e.isolateScope=i(t.scope,n,!1)),$(t.bindToController)&&(e.bindToController=i(t.bindToController,n,!0)),$(e.bindToController)){var r=t.controller,o=t.controllerAs;if(!r)throw Yi("noctrl","Cannot bind to controller without directive '{0}'s controller.",n);if(!xn(r,o))throw Yi("noident","Cannot bind to controller without identifier for directive '{0}'.",n)}return e}function u(t){var n=t.charAt(0);if(!n||n!==Rr(n))throw Yi("baddir","Directive/Component name '{0}' is invalid. The first character must be a lowercase letter",t);if(t!==t.trim())throw Yi("baddir","Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces",t)}function s(t){var n=t.require||t.controller&&t.name;return!Kr(n)&&$(n)&&r(n,function(t,e){var r=t.match(C),i=t.substring(r[0].length);i||(n[e]=r[0]+e)}),n}var c={},f="Directive",g=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,b=/(([\w\-]+)(?:\:([^;]+))?;?)/,w=R("ngSrc,ngSrcset,src,srcset"),C=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,M=/^(on[a-z]+|formaction)$/,_=dt();this.directive=function P(t,e){return ft(t,"directive"),x(t)?(u(t),lt(e,"directiveFactory"),c.hasOwnProperty(t)||(c[t]=[],n.factory(t+f,["$injector","$exceptionHandler",function(n,e){var i=[];return r(c[t],function(r,o){try{var a=n.invoke(r);S(a)?a={compile:v(a)}:!a.compile&&a.link&&(a.compile=v(a.link)),a.priority=a.priority||0,a.index=o,a.name=a.name||t,a.require=s(a),a.restrict=a.restrict||"EA",a.$$moduleName=r.$$moduleName,i.push(a)}catch(u){e(u)}}),i}])),c[t].push(e)):r(t,o(P)),this},this.component=function(t,n){function e(t){function e(n){return S(n)||Kr(n)?function(e,r){return t.invoke(n,this,{$element:e,$attrs:r})}:n}var o=n.template||n.templateUrl?n.template:"",a={controller:i,controllerAs:xn(n.controller)||n.controllerAs||"$ctrl",template:e(o),templateUrl:e(n.templateUrl),transclude:n.transclude,scope:{},bindToController:n.bindings||{},restrict:"E",require:n.require};return r(n,function(t,n){"$"===n.charAt(0)&&(a[n]=t)}),a}var i=n.controller||function(){};return r(n,function(t,n){"$"===n.charAt(0)&&(e[n]=t,S(i)&&(i[n]=t))}),e.$inject=["$injector"],this.directive(t,e)},this.aHrefSanitizationWhitelist=function(t){return y(t)?(e.aHrefSanitizationWhitelist(t),this):e.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(e.imgSrcSanitizationWhitelist(t),this):e.imgSrcSanitizationWhitelist()};var A=!0;this.debugInfoEnabled=function(t){return y(t)?(A=t,this):A};var E=10;this.onChangesTtl=function(t){return arguments.length?(E=t,this):E},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(n,e,i,o,u,s,v,_,P,T){function L(){try{if(!--wt)throw $t=void 0,Yi("infchng","{0} $onChanges() iterations reached. Aborting!\n",E);v.$apply(function(){for(var t=[],n=0,e=$t.length;n<e;++n)try{$t[n]()}catch(r){t.push(r)}if($t=void 0,t.length)throw t})}finally{wt++}}function N(t,n){if(n){var e,r,i,o=Object.keys(n);for(e=0,r=o.length;e<r;e++)i=o[e],this[i]=n[i]}else this.$attr={};this.$$element=t}function j(t,n,e){xt.innerHTML="<span "+n+">";var r=xt.firstChild.attributes,i=r[0];r.removeNamedItem(i.name),i.value=e,t.attributes.setNamedItem(i)}function R(t,n){try{t.addClass(n)}catch(e){}}function I(t,n,e,r,i){t instanceof qr||(t=qr(t));var o=U(t,n,t,e,r,i);I.$$addScopeClass(t);var a=null;return function(n,e,r){lt(n,"scope"),i&&i.needsNewScope&&(n=n.$parent.$new()),r=r||{};var u=r.parentBoundTranscludeFn,s=r.transcludeControllers,l=r.futureParentElement;u&&u.$$boundTransclude&&(u=u.$$boundTransclude),a||(a=q(l));var c;if(c="html"!==a?qr(ft(a,qr("<div>").append(t).html())):e?ki.clone.call(t):t,s)for(var f in s)c.data("$"+f+"Controller",s[f].instance);return I.$$addScopeInfo(c,n),e&&e(c,n),o&&o(n,c,c,u),c}}function q(t){var n=t&&t[0];return n&&"foreignobject"!==D(n)&&Yr.call(n).match(/SVG/)?"svg":"html"}function U(t,n,e,r,i,o){function a(t,e,r,i){var o,a,u,s,l,c,f,h,v;if(p){var g=e.length;for(v=new Array(g),l=0;l<d.length;l+=3)f=d[l],v[f]=e[f]}else v=e;for(l=0,c=d.length;l<c;)u=v[d[l++]],o=d[l++],a=d[l++],o?(o.scope?(s=t.$new(),I.$$addScopeInfo(qr(u),s)):s=t,h=o.transcludeOnThisElement?W(t,o.transclude,i):!o.templateOnThisElement&&i?i:!i&&n?W(t,n):null,o(a,s,u,r,h)):a&&a(t,u.childNodes,void 0,i)}for(var u,s,l,c,f,h,p,d=[],v=0;v<t.length;v++)u=new N,s=H(t[v],[],u,0===v?r:void 0,i),l=s.length?K(s,t[v],u,n,e,null,[],[],o):null,l&&l.scope&&I.$$addScopeClass(u.$$element),f=l&&l.terminal||!(c=t[v].childNodes)||!c.length?null:U(c,l?(l.transcludeOnThisElement||!l.templateOnThisElement)&&l.transclude:n),(l||f)&&(d.push(v,l,f),h=!0,p=p||l),o=null;return h?a:null}function W(t,n,e){function r(r,i,o,a,u){return r||(r=t.$new(!1,u),r.$$transcluded=!0),n(r,i,{parentBoundTranscludeFn:e,transcludeControllers:o,futureParentElement:a})}var i=r.$$slots=dt();for(var o in n.$$slots)n.$$slots[o]?i[o]=W(t,n.$$slots[o],e):i[o]=null;return r}function H(t,n,e,r,i){var o,a,u=t.nodeType,s=e.$attr;switch(u){case si:et(n,yn(D(t)),"E",r,i);for(var l,c,f,h,p,d,v=t.attributes,g=0,m=v&&v.length;g<m;g++){var y=!1,w=!1;l=v[g],c=l.name,p=l.value,h=yn(c),(d=kt.test(h))&&(c=c.replace(Zi,"").substr(8).replace(/_(.)/g,function(t,n){return n.toUpperCase()}));var C=h.match(At);C&&rt(C[1])&&(y=c,w=c.substr(0,c.length-5)+"end",c=c.substr(0,c.length-6)),f=yn(c.toLowerCase()),s[f]=c,!d&&e.hasOwnProperty(f)||(e[f]=p,Ht(t,f)&&(e[f]=!0)),pt(t,n,p,f,d),et(n,f,"A",r,i,y,w)}if(a=t.className,$(a)&&(a=a.animVal),x(a)&&""!==a)for(;o=b.exec(a);)f=yn(o[2]),et(n,f,"C",r,i)&&(e[f]=ti(o[3])),a=a.substr(o.index+o[0].length);break;case ci:if(11===Vr)for(;t.parentNode&&t.nextSibling&&t.nextSibling.nodeType===ci;)t.nodeValue=t.nodeValue+t.nextSibling.nodeValue,
-t.parentNode.removeChild(t.nextSibling);ct(n,t.nodeValue);break;case fi:Y(t,n,e,r,i)}return n.sort(at),n}function Y(t,n,e,r,i){try{var o=g.exec(t.nodeValue);if(o){var a=yn(o[1]);et(n,a,"M",r,i)&&(e[a]=ti(o[2]))}}catch(u){}}function G(t,n,e){var r=[],i=0;if(n&&t.hasAttribute&&t.hasAttribute(n)){do{if(!t)throw Yi("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",n,e);t.nodeType===si&&(t.hasAttribute(n)&&i++,t.hasAttribute(e)&&i--),r.push(t),t=t.nextSibling}while(i>0)}else r.push(t);return qr(r)}function Z(t,n,e){return function(r,i,o,a,u){return i=G(i[0],n,e),t(r,i,o,a,u)}}function J(t,n,e,r,i,o){var a;return t?I(n,e,r,i,o):function(){return a||(a=I(n,e,r,i,o),n=e=o=null),a.apply(this,arguments)}}function K(t,n,e,o,a,u,s,c,f){function h(t,n,e,r){t&&(e&&(t=Z(t,e,r)),t.require=d.require,t.directiveName=v,(M===d||d.$$isolateScope)&&(t=gt(t,{isolateScope:!0})),s.push(t)),n&&(e&&(n=Z(n,e,r)),n.require=d.require,n.directiveName=v,(M===d||d.$$isolateScope)&&(n=gt(n,{isolateScope:!0})),c.push(n))}function p(t,o,a,u,f){function h(t,n,e,r){var i;if(k(t)||(r=e,e=n,n=t,t=void 0),O&&(i=b),e||(e=O?A.parent():A),!r)return f(t,n,i,e,F);var o=f.$$slots[r];if(o)return o(t,n,i,e,F);if(m(o))throw Yi("noslot",'No parent directive that requires a transclusion with slot name "{0}". Element: {1}',r,X(A))}var p,d,v,g,y,b,x,A,E,P;n===a?(E=e,A=e.$$element):(A=qr(a),E=new N(A,e)),y=o,M?g=o.$new(!0):w&&(y=o.$parent),f&&(x=h,x.$$boundTransclude=f,x.isSlotFilled=function(t){return!!f.$$slots[t]}),C&&(b=tt(A,E,x,C,g,o,M)),M&&(I.$$addScopeInfo(A,g,!0,!(_&&(_===M||_===M.$$originalDirective))),I.$$addScopeClass(A,!0),g.$$isolateBindings=M.$$isolateBindings,P=yt(o,E,g,g.$$isolateBindings,M),P.removeWatches&&g.$on("$destroy",P.removeWatches));for(var T in b){var L=C[T],j=b[T],R=L.$$bindings.bindToController;j.identifier&&R?j.bindingInfo=yt(y,E,j.instance,R,L):j.bindingInfo={};var D=j();D!==j.instance&&(j.instance=D,A.data("$"+L.name+"Controller",D),j.bindingInfo.removeWatches&&j.bindingInfo.removeWatches(),j.bindingInfo=yt(y,E,j.instance,R,L))}for(r(C,function(t,n){var e=t.require;t.bindToController&&!Kr(e)&&$(e)&&l(b[n].instance,Q(n,e,A,b))}),r(b,function(t){var n=t.instance;if(S(n.$onChanges))try{n.$onChanges(t.bindingInfo.initialChanges)}catch(e){i(e)}if(S(n.$onInit))try{n.$onInit()}catch(e){i(e)}S(n.$doCheck)&&(y.$watch(function(){n.$doCheck()}),n.$doCheck()),S(n.$onDestroy)&&y.$on("$destroy",function(){n.$onDestroy()})}),p=0,d=s.length;p<d;p++)v=s[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);var F=o;for(M&&(M.template||null===M.templateUrl)&&(F=g),t&&t(F,a.childNodes,void 0,f),p=c.length-1;p>=0;p--)v=c[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);r(b,function(t){var n=t.instance;S(n.$postLink)&&n.$postLink()})}f=f||{};for(var d,v,g,y,b,x=-Number.MAX_VALUE,w=f.newScopeDirective,C=f.controllerDirectives,M=f.newIsolateScopeDirective,_=f.templateDirective,A=f.nonTlbTranscludeDirective,E=!1,P=!1,O=f.hasElementTranscludeDirective,T=e.$$element=qr(n),L=u,j=o,R=!1,F=!1,V=0,q=t.length;V<q;V++){d=t[V];var U=d.$$start,W=d.$$end;if(U&&(T=G(n,U,W)),g=void 0,x>d.priority)break;if((b=d.scope)&&(d.templateUrl||($(b)?(st("new/isolated scope",M||w,d,T),M=d):st("new/isolated scope",M,d,T)),w=w||d),v=d.name,!R&&(d.replace&&(d.templateUrl||d.template)||d.transclude&&!d.$$tlb)){for(var Y,K=V+1;Y=t[K++];)if(Y.transclude&&!Y.$$tlb||Y.replace&&(Y.templateUrl||Y.template)){F=!0;break}R=!0}if(!d.templateUrl&&d.controller&&(b=d.controller,C=C||dt(),st("'"+v+"' controller",C[v],d,T),C[v]=d),b=d.transclude)if(E=!0,d.$$tlb||(st("transclusion",A,d,T),A=d),"element"===b)O=!0,x=d.priority,g=T,T=e.$$element=qr(I.$$createComment(v,e[v])),n=T[0],vt(a,z(g),n),g[0].$$parentNode=g[0].parentNode,j=J(F,g,o,x,L&&L.name,{nonTlbTranscludeDirective:A});else{var et=dt();if(g=qr(Ot(n)).contents(),$(b)){g=[];var rt=dt(),at=dt();r(b,function(t,n){var e="?"===t.charAt(0);t=e?t.substring(1):t,rt[t]=n,et[n]=null,at[n]=e}),r(T.contents(),function(t){var n=rt[yn(D(t))];n?(at[n]=!0,et[n]=et[n]||[],et[n].push(t)):g.push(t)}),r(at,function(t,n){if(!t)throw Yi("reqslot","Required transclusion slot `{0}` was not filled.",n)});for(var ut in et)et[ut]&&(et[ut]=J(F,et[ut],o))}T.empty(),j=J(F,g,o,void 0,void 0,{needsNewScope:d.$$isolateScope||d.$$newScope}),j.$$slots=et}if(d.template)if(P=!0,st("template",_,d,T),_=d,b=S(d.template)?d.template(T,e):d.template,b=_t(b),d.replace){if(L=d,g=Ct(b)?[]:bn(ft(d.templateNamespace,ti(b))),n=g[0],1!==g.length||n.nodeType!==si)throw Yi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",v,"");vt(a,T,n);var lt={$attr:{}},ct=H(n,[],lt),ht=t.splice(V+1,t.length-(V+1));(M||w)&&nt(ct,M,w),t=t.concat(ct).concat(ht),it(e,lt),q=t.length}else T.html(b);if(d.templateUrl)P=!0,st("template",_,d,T),_=d,d.replace&&(L=d),p=ot(t.splice(V,t.length-V),T,e,a,E&&j,s,c,{controllerDirectives:C,newScopeDirective:w!==d&&w,newIsolateScopeDirective:M,templateDirective:_,nonTlbTranscludeDirective:A}),q=t.length;else if(d.compile)try{y=d.compile(T,e,j);var pt=d.$$originalDirective||d;S(y)?h(null,B(pt,y),U,W):y&&h(B(pt,y.pre),B(pt,y.post),U,W)}catch($t){i($t,X(T))}d.terminal&&(p.terminal=!0,x=Math.max(x,d.priority))}return p.scope=w&&w.scope===!0,p.transcludeOnThisElement=E,p.templateOnThisElement=P,p.transclude=j,f.hasElementTranscludeDirective=O,p}function Q(t,n,e,i){var o;if(x(n)){var a=n.match(C),u=n.substring(a[0].length),s=a[1]||a[3],l="?"===a[2];if("^^"===s?e=e.parent():(o=i&&i[u],o=o&&o.instance),!o){var c="$"+u+"Controller";o=s?e.inheritedData(c):e.data(c)}if(!o&&!l)throw Yi("ctreq","Controller '{0}', required by directive '{1}', can't be found!",u,t)}else if(Kr(n)){o=[];for(var f=0,h=n.length;f<h;f++)o[f]=Q(t,n[f],e,i)}else $(n)&&(o={},r(n,function(n,r){o[r]=Q(t,n,e,i)}));return o||null}function tt(t,n,e,r,i,o,a){var u=dt();for(var l in r){var c=r[l],f={$scope:c===a||c.$$isolateScope?i:o,$element:t,$attrs:n,$transclude:e},h=c.controller;"@"===h&&(h=n[c.name]);var p=s(h,f,!0,c.controllerAs);u[c.name]=p,t.data("$"+c.name+"Controller",p.instance)}return u}function nt(t,n,e){for(var r=0,i=t.length;r<i;r++)t[r]=h(t[r],{$$isolateScope:n,$$newScope:e})}function et(t,e,r,o,u,s,l){if(e===u)return null;var p=null;if(c.hasOwnProperty(e))for(var d,v=n.get(e+f),g=0,y=v.length;g<y;g++)try{if(d=v[g],(m(o)||o>d.priority)&&d.restrict.indexOf(r)!==-1){if(s&&(d=h(d,{$$start:s,$$end:l})),!d.$$bindings){var b=d.$$bindings=a(d,d.name);$(b.isolateScope)&&(d.$$isolateBindings=b.isolateScope)}t.push(d),p=d}}catch(x){i(x)}return p}function rt(t){if(c.hasOwnProperty(t))for(var e,r=n.get(t+f),i=0,o=r.length;i<o;i++)if(e=r[i],e.multiElement)return!0;return!1}function it(t,n){var e=n.$attr,i=t.$attr;t.$$element;r(t,function(r,i){"$"!==i.charAt(0)&&(n[i]&&n[i]!==r&&(r.length?r+=("style"===i?";":" ")+n[i]:r=n[i]),t.$set(i,r,!0,e[i]))}),r(n,function(n,r){t.hasOwnProperty(r)||"$"===r.charAt(0)||(t[r]=n,"class"!==r&&"style"!==r&&(i[r]=e[r]))})}function ot(t,n,e,i,a,u,s,l){var c,f,d=[],v=n[0],g=t.shift(),m=h(g,{templateUrl:null,transclude:null,replace:null,$$originalDirective:g}),y=S(g.templateUrl)?g.templateUrl(n,e):g.templateUrl,b=g.templateNamespace;return n.empty(),o(y).then(function(o){var h,p,x,w;if(o=_t(o),g.replace){if(x=Ct(o)?[]:bn(ft(b,ti(o))),h=x[0],1!==x.length||h.nodeType!==si)throw Yi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",g.name,y);p={$attr:{}},vt(i,n,h);var C=H(h,[],p);$(g.scope)&&nt(C,!0),t=C.concat(t),it(e,p)}else h=v,n.html(o);for(t.unshift(m),c=K(t,h,e,a,n,g,u,s,l),r(i,function(t,e){t===h&&(i[e]=n[0])}),f=U(n[0].childNodes,a);d.length;){var S=d.shift(),M=d.shift(),_=d.shift(),k=d.shift(),A=n[0];if(!S.$$destroyed){if(M!==v){var E=M.className;l.hasElementTranscludeDirective&&g.replace||(A=Ot(h)),vt(_,qr(M),A),R(qr(A),E)}w=c.transcludeOnThisElement?W(S,c.transclude,k):k,c(f,S,A,i,w)}}d=null})["catch"](p),function(t,n,e,r,i){var o=i;n.$$destroyed||(d?d.push(n,e,r,o):(c.transcludeOnThisElement&&(o=W(n,c.transclude,i)),c(f,n,e,r,o)))}}function at(t,n){var e=n.priority-t.priority;return 0!==e?e:t.name!==n.name?t.name<n.name?-1:1:t.index-n.index}function st(t,n,e,r){function i(t){return t?" (module: "+t+")":""}if(n)throw Yi("multidir","Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}",n.name,i(n.$$moduleName),e.name,i(e.$$moduleName),t,X(r))}function ct(t,n){var r=e(n,!0);r&&t.push({priority:0,compile:function(t){var n=t.parent(),e=!!n.length;return e&&I.$$addBindingClass(n),function(t,n){var i=n.parent();e||I.$$addBindingClass(i),I.$$addBindingInfo(i,r.expressions),t.$watch(r,function(t){n[0].nodeValue=t})}}})}function ft(n,e){switch(n=Rr(n||"html")){case"svg":case"math":var r=t.document.createElement("div");return r.innerHTML="<"+n+">"+e+"</"+n+">",r.childNodes[0].childNodes;default:return e}}function ht(t,n){if("srcdoc"===n)return _.HTML;var e=D(t);return"xlinkHref"===n||"form"===e&&"action"===n||"link"===e&&"href"===n||"img"!==e&&("src"===n||"ngSrc"===n)?_.RESOURCE_URL:void 0}function pt(t,n,r,i,o){var a=ht(t,i);o=w[i]||o;var u=e(r,!0,a,o);if(u){if("multiple"===i&&"select"===D(t))throw Yi("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",X(t));if(M.test(i))throw Yi("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");n.push({priority:100,compile:function(){return{pre:function(t,n,s){var l=s.$$observers||(s.$$observers=dt()),c=s[i];c!==r&&(u=c&&e(c,!0,a,o),r=c),u&&(s[i]=u(t),(l[i]||(l[i]=[])).$$inter=!0,(s.$$observers&&s.$$observers[i].$$scope||t).$watch(u,function(t,n){"class"===i&&t!==n?s.$updateClass(t,n):s.$set(i,t)}))}}}})}}function vt(n,e,r){var i,o,a=e[0],u=e.length,s=a.parentNode;if(n)for(i=0,o=n.length;i<o;i++)if(n[i]===a){n[i++]=r;for(var l=i,c=l+u-1,f=n.length;l<f;l++,c++)c<f?n[l]=n[c]:delete n[l];n.length-=u-1,n.context===a&&(n.context=r);break}s&&s.replaceChild(r,a);var h=t.document.createDocumentFragment();for(i=0;i<u;i++)h.appendChild(e[i]);for(qr.hasData(a)&&(qr.data(r,qr.data(a)),qr(a).off("$destroy")),qr.cleanData(h.querySelectorAll("*")),i=1;i<u;i++)delete e[i];e[0]=r,e.length=1}function gt(t,n){return l(function(){return t.apply(null,arguments)},t,n)}function mt(t,n,e,r,o,a){try{t(n,e,r,o,a)}catch(u){i(u,X(e))}}function yt(t,n,i,o,a){function s(n,e,r){S(i.$onChanges)&&e!==r&&($t||(t.$$postDigest(L),$t=[]),c||(c={},$t.push(l)),c[n]&&(r=c[n].previousValue),c[n]=new mn(r,e))}function l(){i.$onChanges(c),c=void 0}var c,f=[],h={};return r(o,function(r,o){var l,c,d,v,g,m=r.attrName,y=r.optional,$=r.mode;switch($){case"@":y||jr.call(n,m)||(i[o]=n[m]=void 0),n.$observe(m,function(t){if(x(t)||O(t)){var n=i[o];s(o,t,n),i[o]=t}}),n.$$observers[m].$$scope=t,l=n[m],x(l)?i[o]=e(l)(t):O(l)&&(i[o]=l),h[o]=new mn(Gi,i[o]);break;case"=":if(!jr.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]),v=c.literal?V:function(t,n){return t===n||t!==t&&n!==n},d=c.assign||function(){throw l=i[o]=c(t),Yi("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",n[m],m,a.name)},l=i[o]=c(t);var b=function(n){return v(n,i[o])||(v(n,l)?d(t,n=i[o]):i[o]=n),l=n};b.$stateful=!0,g=r.collection?t.$watchCollection(n[m],b):t.$watch(u(n[m],b),null,c.literal),f.push(g);break;case"<":if(!jr.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]);var w=i[o]=c(t);h[o]=new mn(Gi,i[o]),g=t.$watch(c,function(t,n){if(n===t){if(n===w)return;n=w}s(o,t,n),i[o]=t},c.literal),f.push(g);break;case"&":if(c=n.hasOwnProperty(m)?u(n[m]):p,c===p&&y)break;i[o]=function(n){return c(t,n)}}}),{initialChanges:h,removeWatches:f.length&&function(){for(var t=0,n=f.length;t<n;++t)f[t]()}}}var $t,bt=/^\w/,xt=t.document.createElement("div"),wt=E;N.prototype={$normalize:yn,$addClass:function(t){t&&t.length>0&&P.addClass(this.$$element,t)},$removeClass:function(t){t&&t.length>0&&P.removeClass(this.$$element,t)},$updateClass:function(t,n){var e=$n(t,n);e&&e.length&&P.addClass(this.$$element,e);var r=$n(n,t);r&&r.length&&P.removeClass(this.$$element,r)},$set:function(t,n,e,o){var a,u=this.$$element[0],s=Ht(u,t),l=Yt(t),c=t;if(s?(this.$$element.prop(t,n),o=s):l&&(this[l]=n,c=l),this[t]=n,o?this.$attr[t]=o:(o=this.$attr[t],o||(this.$attr[t]=o=ut(t,"-"))),a=D(this.$$element),"a"===a&&("href"===t||"xlinkHref"===t)||"img"===a&&"src"===t)this[t]=n=T(n,"src"===t);else if("img"===a&&"srcset"===t&&y(n)){for(var f="",h=ti(n),p=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,d=/\s/.test(h)?p:/(,)/,v=h.split(d),g=Math.floor(v.length/2),$=0;$<g;$++){var b=2*$;f+=T(ti(v[b]),!0),f+=" "+ti(v[b+1])}var x=ti(v[2*$]).split(/\s/);f+=T(ti(x[0]),!0),2===x.length&&(f+=" "+ti(x[1])),this[t]=n=f}e!==!1&&(null===n||m(n)?this.$$element.removeAttr(o):bt.test(o)?this.$$element.attr(o,n):j(this.$$element[0],o,n));var w=this.$$observers;w&&r(w[c],function(t){try{t(n)}catch(e){i(e)}})},$observe:function(t,n){var e=this,r=e.$$observers||(e.$$observers=dt()),i=r[t]||(r[t]=[]);return i.push(n),v.$evalAsync(function(){i.$$inter||!e.hasOwnProperty(t)||m(e[t])||n(e[t])}),function(){F(i,n)}}};var St=e.startSymbol(),Mt=e.endSymbol(),_t="{{"===St&&"}}"===Mt?d:function(t){return t.replace(/\{\{/g,St).replace(/}}/g,Mt)},kt=/^ngAttr[A-Z]/,At=/^(.+)Start$/;return I.$$addBindingInfo=A?function(t,n){var e=t.data("$binding")||[];Kr(n)?e=e.concat(n):e.push(n),t.data("$binding",e)}:p,I.$$addBindingClass=A?function(t){R(t,"ng-binding")}:p,I.$$addScopeInfo=A?function(t,n,e,r){var i=e?r?"$isolateScopeNoTemplate":"$isolateScope":"$scope";t.data(i,n)}:p,I.$$addScopeClass=A?function(t,n){R(t,n?"ng-isolate-scope":"ng-scope")}:p,I.$$createComment=function(n,e){var r="";return A&&(r=" "+(n||"")+": ",e&&(r+=e+" ")),t.document.createComment(r)},I}]}function mn(t,n){this.previousValue=t,this.currentValue=n}function yn(t){return wt(t.replace(Zi,""))}function $n(t,n){var e="",r=t.split(/\s+/),i=n.split(/\s+/);t:for(var o=0;o<r.length;o++){for(var a=r[o],u=0;u<i.length;u++)if(a===i[u])continue t;e+=(e.length>0?" ":"")+a}return e}function bn(t){t=qr(t);var n=t.length;if(n<=1)return t;for(;n--;){var e=t[n];e.nodeType===fi&&Wr.call(t,n,1)}return t}function xn(t,n){if(n&&x(n))return n;if(x(t)){var e=Ji.exec(t);if(e)return e[3]}}function wn(){var t={},e=!1;this.has=function(n){return t.hasOwnProperty(n)},this.register=function(n,e){ft(n,"controller"),$(n)?l(t,n):t[n]=e},this.allowGlobals=function(){e=!0},this.$get=["$injector","$window",function(r,i){function o(t,e,r,i){if(!t||!$(t.$scope))throw n("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",i,e);t.$scope[e]=r}return function(n,a,u,s){var c,f,h,p;if(u=u===!0,s&&x(s)&&(p=s),x(n)){if(f=n.match(Ji),!f)throw Xi("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",n);h=f[1],p=p||f[3],n=t.hasOwnProperty(h)?t[h]:ht(a.$scope,h,!0)||(e?ht(i,h,!0):void 0),ct(n,h,!0)}if(u){var d=(Kr(n)?n[n.length-1]:n).prototype;c=Object.create(d||null),p&&o(a,p,c,h||n.name);var v;return v=l(function(){var t=r.invoke(n,c,a,h);return t!==c&&($(t)||S(t))&&(c=t,p&&o(a,p,c,h||n.name)),c},{instance:c,identifier:p})}return c=r.instantiate(n,a,h),p&&o(a,p,c,h||n.name),c}}]}function Cn(){this.$get=["$window",function(t){return qr(t.document)}]}function Sn(){this.$get=["$document","$rootScope",function(t,n){function e(){i=r.hidden}var r=t[0],i=r&&r.hidden;return t.on("visibilitychange",e),n.$on("$destroy",function(){t.off("visibilitychange",e)}),function(){return i}}]}function Mn(){this.$get=["$log",function(t){return function(n,e){t.error.apply(t,arguments)}}]}function _n(t){return $(t)?C(t)?t.toISOString():W(t):t}function kn(){this.$get=function(){return function(t){if(!t)return"";var n=[];return i(t,function(t,e){null===t||m(t)||(Kr(t)?r(t,function(t){n.push(nt(e)+"="+nt(_n(t)))}):n.push(nt(e)+"="+nt(_n(t))))}),n.join("&")}}}function An(){this.$get=function(){return function(t){function n(t,o,a){null===t||m(t)||(Kr(t)?r(t,function(t,e){n(t,o+"["+($(t)?e:"")+"]")}):$(t)&&!C(t)?i(t,function(t,e){n(t,o+(a?"":"[")+e+(a?"":"]"))}):e.push(nt(o)+"="+nt(_n(t))))}if(!t)return"";var e=[];return n(t,"",!0),e.join("&")}}}function En(t,n){if(x(t)){var e=t.replace(ro,"").trim();if(e){var r=n("Content-Type");(r&&0===r.indexOf(Qi)||Pn(e))&&(t=H(e))}}return t}function Pn(t){var n=t.match(no);return n&&eo[n[0]].test(t)}function On(t){function n(t,n){t&&(i[t]=i[t]?i[t]+", "+n:n)}var e,i=dt();return x(t)?r(t.split("\n"),function(t){e=t.indexOf(":"),n(Rr(ti(t.substr(0,e))),ti(t.substr(e+1)))}):$(t)&&r(t,function(t,e){n(Rr(e),ti(t))}),i}function Tn(t){var n;return function(e){if(n||(n=On(t)),e){var r=n[Rr(e)];return void 0===r&&(r=null),r}return n}}function Ln(t,n,e,i){return S(i)?i(t,n,e):(r(i,function(r){t=r(t,n,e)}),t)}function Nn(t){return 200<=t&&t<300}function jn(){var t=this.defaults={transformResponse:[En],transformRequest:[function(t){return!$(t)||A(t)||P(t)||E(t)?t:W(t)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:mt(to),put:mt(to),patch:mt(to)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},e=!1;this.useApplyAsync=function(t){return y(t)?(e=!!t,this):e};var i=!0;this.useLegacyPromiseExtensions=function(t){return y(t)?(i=!!t,this):i};var o=this.interceptors=[];this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(a,u,s,c,f,h,d){function v(e){function o(t,n){for(var e=0,r=n.length;e<r;){var i=n[e++],o=n[e++];t=t.then(i,o)}return n.length=0,t}function u(){a.$$completeOutstandingRequest(p)}function s(t,n){var e,i={};return r(t,function(t,r){S(t)?(e=t(n),null!=e&&(i[r]=e)):i[r]=t}),i}function c(n){var e,r,i,o=t.headers,a=l({},n.headers);o=l({},o.common,o[Rr(n.method)]);t:for(e in o){r=Rr(e);for(i in a)if(Rr(i)===r)continue t;a[e]=o[e]}return s(a,mt(n))}function f(n){var e=n.headers,i=Ln(n.data,Tn(e),void 0,n.transformRequest);return m(i)&&r(e,function(t,n){"content-type"===Rr(n)&&delete e[n]}),m(n.withCredentials)&&!m(t.withCredentials)&&(n.withCredentials=t.withCredentials),w(n,i).then(v,v)}function v(t){var n=l({},t);return n.data=Ln(t.data,t.headers,t.status,g.transformResponse),Nn(t.status)?n:h.reject(n)}if(!$(e))throw n("$http")("badreq","Http request configuration must be an object.  Received: {0}",e);if(!x(e.url))throw n("$http")("badreq","Http request configuration url must be a string.  Received: {0}",e.url);var g=l({method:"get",transformRequest:t.transformRequest,transformResponse:t.transformResponse,paramSerializer:t.paramSerializer},e);g.headers=c(e),g.method=Dr(g.method),g.paramSerializer=x(g.paramSerializer)?d.get(g.paramSerializer):g.paramSerializer,a.$$incOutstandingRequestCount();var y=[],b=[],C=h.when(g);return r(_,function(t){(t.request||t.requestError)&&y.unshift(t.request,t.requestError),(t.response||t.responseError)&&b.push(t.response,t.responseError)}),C=o(C,y),C=C.then(f),C=o(C,b),C=C["finally"](u),i?(C.success=function(t){return ct(t,"fn"),C.then(function(n){t(n.data,n.status,n.headers,g)}),C},C.error=function(t){return ct(t,"fn"),C.then(null,function(n){t(n.data,n.status,n.headers,g)}),C}):(C.success=oo("success"),C.error=oo("error")),C}function g(t){r(arguments,function(t){v[t]=function(n,e){return v(l({},e||{},{method:t,url:n}))}})}function b(t){r(arguments,function(t){v[t]=function(n,e,r){return v(l({},r||{},{method:t,url:n,data:e}))}})}function w(n,i){function o(t){if(t){var n={};return r(t,function(t,r){n[r]=function(n){function r(){t(n)}e?f.$applyAsync(r):f.$$phase?r():f.$apply(r)}}),n}}function a(t,n,r,i){function o(){l(n,t,r,i)}d&&(Nn(t)?d.put(S,[t,n,On(r),i]):d.remove(S)),e?f.$applyAsync(o):(o(),f.$$phase||f.$apply())}function l(t,e,r,i){e=e>=-1?e:0,(Nn(e)?b.resolve:b.reject)({data:t,status:e,headers:Tn(r),config:n,statusText:i})}function c(t){l(t.data,t.status,mt(t.headers()),t.statusText)}function p(){var t=v.pendingRequests.indexOf(n);t!==-1&&v.pendingRequests.splice(t,1)}var d,g,b=h.defer(),x=b.promise,w=n.headers,S=C(n.url,n.paramSerializer(n.params));if(v.pendingRequests.push(n),x.then(p,p),!n.cache&&!t.cache||n.cache===!1||"GET"!==n.method&&"JSONP"!==n.method||(d=$(n.cache)?n.cache:$(t.cache)?t.cache:M),d&&(g=d.get(S),y(g)?T(g)?g.then(c,c):Kr(g)?l(g[1],g[0],mt(g[2]),g[3]):l(g,200,{},"OK"):d.put(S,x)),m(g)){var _=De(n.url)?s()[n.xsrfCookieName||t.xsrfCookieName]:void 0;_&&(w[n.xsrfHeaderName||t.xsrfHeaderName]=_),u(n.method,S,i,a,w,n.timeout,n.withCredentials,n.responseType,o(n.eventHandlers),o(n.uploadEventHandlers))}return x}function C(t,n){return n.length>0&&(t+=(t.indexOf("?")===-1?"?":"&")+n),t}var M=c("$http");t.paramSerializer=x(t.paramSerializer)?d.get(t.paramSerializer):t.paramSerializer;var _=[];return r(o,function(t){_.unshift(x(t)?d.get(t):d.invoke(t))}),v.pendingRequests=[],g("get","delete","head","jsonp"),b("post","put","patch"),v.defaults=t,v}]}function Rn(){this.$get=function(){return function(){return new t.XMLHttpRequest}}}function Dn(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(t,n,e,r){return Fn(t,r,t.defer,n,e[0])}]}function Fn(t,n,e,i,o){function a(t,n,e){t=t.replace("JSON_CALLBACK",n);var r=o.createElement("script"),a=null;return r.type="text/javascript",r.src=t,r.async=!0,a=function(t){r.removeEventListener("load",a),r.removeEventListener("error",a),o.body.removeChild(r),r=null;var u=-1,s="unknown";t&&("load"!==t.type||i.wasCalled(n)||(t={type:"error"}),s=t.type,u="error"===t.type?404:200),e&&e(u,s)},r.addEventListener("load",a),r.addEventListener("error",a),o.body.appendChild(r),a}return function(o,u,s,l,c,f,h,p,d,v){function g(){x&&x(),w&&w.abort()}function $(t,n,r,i,o){y(M)&&e.cancel(M),x=w=null,t(n,r,i,o)}if(u=u||t.url(),"jsonp"===Rr(o))var b=i.createCallback(u),x=a(u,b,function(t,n){var e=200===t&&i.getResponse(b);$(l,t,e,"",n),i.removeCallback(b)});else{var w=n(o,u);w.open(o,u,!0),r(c,function(t,n){y(t)&&w.setRequestHeader(n,t)}),w.onload=function(){var t=w.statusText||"",n="response"in w?w.response:w.responseText,e=1223===w.status?204:w.status;0===e&&(e=n?200:"file"===Re(u).protocol?404:0),$(l,e,n,w.getAllResponseHeaders(),t)};var C=function(){$(l,-1,null,null,"")};if(w.onerror=C,w.onabort=C,r(d,function(t,n){w.addEventListener(n,t)}),r(v,function(t,n){w.upload.addEventListener(n,t)}),h&&(w.withCredentials=!0),p)try{w.responseType=p}catch(S){if("json"!==p)throw S}w.send(m(s)?null:s)}if(f>0)var M=e(g,f);else T(f)&&f.then(g)}}function In(){var t="{{",n="}}";this.startSymbol=function(n){return n?(t=n,this):t},this.endSymbol=function(t){return t?(n=t,this):n},this.$get=["$parse","$exceptionHandler","$sce",function(e,r,i){function o(t){return"\\\\\\"+t}function a(e){return e.replace(h,t).replace(p,n)}function u(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function s(o,s,h,p){function d(t){try{return t=O(t),p&&!y(t)?t:vt(t)}catch(n){r(ao.interr(o,n))}}if(!o.length||o.indexOf(t)===-1){var g;if(!s){var $=a(o);g=v($),g.exp=o,g.expressions=[],g.$$watchDelegate=u}return g}p=!!p;for(var b,x,w,C=0,M=[],_=[],k=o.length,A=[],E=[];C<k;){if((b=o.indexOf(t,C))===-1||(x=o.indexOf(n,b+c))===-1){C!==k&&A.push(a(o.substring(C)));break}C!==b&&A.push(a(o.substring(C,b))),w=o.substring(b+c,x),M.push(w),_.push(e(w,d)),C=x+f,E.push(A.length),A.push("")}if(h&&A.length>1&&ao.throwNoconcat(o),!s||M.length){var P=function(t){for(var n=0,e=M.length;n<e;n++){if(p&&m(t[n]))return;A[E[n]]=t[n]}return A.join("")},O=function(t){return h?i.getTrusted(h,t):i.valueOf(t)};return l(function(t){var n=0,e=M.length,i=new Array(e);try{for(;n<e;n++)i[n]=_[n](t);return P(i)}catch(a){r(ao.interr(o,a))}},{exp:o,expressions:M,$$watchDelegate:function(t,n){var e;return t.$watchGroup(_,function(r,i){var o=P(r);S(n)&&n.call(this,o,r!==i?e:o,t),e=o})}})}}var c=t.length,f=n.length,h=new RegExp(t.replace(/./g,o),"g"),p=new RegExp(n.replace(/./g,o),"g");return s.startSymbol=function(){return t},s.endSymbol=function(){return n},s}]}function Vn(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(t,n,e,r,i){function o(o,u,s,l){function c(){f?o.apply(null,h):o(v)}var f=arguments.length>4,h=f?z(arguments,4):[],p=n.setInterval,d=n.clearInterval,v=0,g=y(l)&&!l,m=(g?r:e).defer(),$=m.promise;return s=y(s)?s:0,$.$$intervalId=p(function(){g?i.defer(c):t.$evalAsync(c),m.notify(v++),s>0&&v>=s&&(m.resolve(v),d($.$$intervalId),delete a[$.$$intervalId]),g||t.$apply()},u),a[$.$$intervalId]=m,$}var a={};return o.cancel=function(t){return!!(t&&t.$$intervalId in a)&&(a[t.$$intervalId].promise["catch"](p),a[t.$$intervalId].reject("canceled"),n.clearInterval(t.$$intervalId),delete a[t.$$intervalId],!0)},o}]}function qn(t){for(var n=t.split("/"),e=n.length;e--;)n[e]=tt(n[e]);return n.join("/")}function zn(t,n){var e=Re(t);n.$$protocol=e.protocol,n.$$host=e.hostname,n.$$port=f(e.port)||lo[e.protocol]||null}function Bn(t,n){var e="/"!==t.charAt(0);e&&(t="/"+t);var r=Re(t);n.$$path=decodeURIComponent(e&&"/"===r.pathname.charAt(0)?r.pathname.substring(1):r.pathname),n.$$search=K(r.search),n.$$hash=decodeURIComponent(r.hash),n.$$path&&"/"!==n.$$path.charAt(0)&&(n.$$path="/"+n.$$path)}function Un(t,n){return 0===t.lastIndexOf(n,0)}function Wn(t,n){if(Un(n,t))return n.substr(t.length)}function Hn(t){var n=t.indexOf("#");return n===-1?t:t.substr(0,n)}function Yn(t){return t.replace(/(#.+)|#$/,"$1")}function Gn(t){return t.substr(0,Hn(t).lastIndexOf("/")+1)}function Zn(t){return t.substring(0,t.indexOf("/",t.indexOf("//")+2))}function Xn(t,n,e){this.$$html5=!0,e=e||"",zn(t,this),this.$$parse=function(t){var e=Wn(n,t);if(!x(e))throw co("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',t,n);Bn(e,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var t=Q(this.$$search),e=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=qn(this.$$path)+(t?"?"+t:"")+e,this.$$absUrl=n+this.$$url.substr(1)},this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a,u;return y(o=Wn(t,r))?(a=o,u=y(o=Wn(e,o))?n+(Wn("/",o)||o):t+a):y(o=Wn(n,r))?u=n+o:n===r+"/"&&(u=n),u&&this.$$parse(u),!!u}}function Jn(t,n,e){zn(t,this),this.$$parse=function(r){function i(t,n,e){var r,i=/^\/[A-Z]:(\/.*)/;return Un(n,e)&&(n=n.replace(e,"")),i.exec(n)?t:(r=i.exec(t),r?r[1]:t)}var o,a=Wn(t,r)||Wn(n,r);m(a)||"#"!==a.charAt(0)?this.$$html5?o=a:(o="",m(a)&&(t=r,this.replace())):(o=Wn(e,a),m(o)&&(o=a)),Bn(o,this),this.$$path=i(this.$$path,o,t),this.$$compose()},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=qn(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+(this.$$url?e+this.$$url:"")},this.$$parseLinkUrl=function(n,e){return Hn(t)===Hn(n)&&(this.$$parse(n),!0)}}function Kn(t,n,e){this.$$html5=!0,Jn.apply(this,arguments),this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a;return t===Hn(r)?o=r:(a=Wn(n,r))?o=t+e+a:n===r+"/"&&(o=n),o&&this.$$parse(o),!!o},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=qn(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+e+this.$$url}}function Qn(t){return function(){return this[t]}}function te(t,n){return function(e){return m(e)?this[t]:(this[t]=n(e),this.$$compose(),this)}}function ne(){var t="!",n={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(n){return y(n)?(t=n,this):t},this.html5Mode=function(t){return O(t)?(n.enabled=t,this):$(t)?(O(t.enabled)&&(n.enabled=t.enabled),O(t.requireBase)&&(n.requireBase=t.requireBase),O(t.rewriteLinks)&&(n.rewriteLinks=t.rewriteLinks),this):n},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(e,r,i,o,a){function u(t,n,e){var i=l.url(),o=l.$$state;try{r.url(t,n,e),l.$$state=r.state()}catch(a){throw l.url(i),l.$$state=o,a}}function s(t,n){e.$broadcast("$locationChangeSuccess",l.absUrl(),t,l.$$state,n)}var l,c,f,h=r.baseHref(),p=r.url();if(n.enabled){if(!h&&n.requireBase)throw co("nobase","$location in HTML5 mode requires a <base> tag to be present!");f=Zn(p)+(h||"/"),c=i.history?Xn:Kn}else f=Hn(p),c=Jn;var d=Gn(f);l=new c(f,d,"#"+t),l.$$parseLinkUrl(p,p),l.$$state=r.state();var v=/^\s*(javascript|mailto):/i;o.on("click",function(t){if(n.rewriteLinks&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey&&2!==t.which&&2!==t.button){for(var i=qr(t.target);"a"!==D(i[0]);)if(i[0]===o[0]||!(i=i.parent())[0])return;var u=i.prop("href"),s=i.attr("href")||i.attr("xlink:href");$(u)&&"[object SVGAnimatedString]"===u.toString()&&(u=Re(u.animVal).href),v.test(u)||!u||i.attr("target")||t.isDefaultPrevented()||l.$$parseLinkUrl(u,s)&&(t.preventDefault(),l.absUrl()!==r.url()&&(e.$apply(),a.angular["ff-684208-preventDefault"]=!0))}}),Yn(l.absUrl())!==Yn(p)&&r.url(l.absUrl(),!0);var g=!0;return r.onUrlChange(function(t,n){return Un(t,d)?(e.$evalAsync(function(){var r,i=l.absUrl(),o=l.$$state;t=Yn(t),l.$$parse(t),l.$$state=n,r=e.$broadcast("$locationChangeStart",t,i,n,o).defaultPrevented,l.absUrl()===t&&(r?(l.$$parse(i),l.$$state=o,u(i,!1,o)):(g=!1,s(i,o)))}),void(e.$$phase||e.$digest())):void(a.location.href=t)}),e.$watch(function(){var t=Yn(r.url()),n=Yn(l.absUrl()),o=r.state(),a=l.$$replace,c=t!==n||l.$$html5&&i.history&&o!==l.$$state;(g||c)&&(g=!1,e.$evalAsync(function(){var n=l.absUrl(),r=e.$broadcast("$locationChangeStart",n,t,l.$$state,o).defaultPrevented;l.absUrl()===n&&(r?(l.$$parse(t),l.$$state=o):(c&&u(n,a,o===l.$$state?null:l.$$state),s(t,o)))})),l.$$replace=!1}),l}]}function ee(){var t=!0,n=this;this.debugEnabled=function(n){return y(n)?(t=n,this):t},this.$get=["$window",function(e){function i(t){return t instanceof Error&&(t.stack?t=t.message&&t.stack.indexOf(t.message)===-1?"Error: "+t.message+"\n"+t.stack:t.stack:t.sourceURL&&(t=t.message+"\n"+t.sourceURL+":"+t.line)),t}function o(t){var n=e.console||{},o=n[t]||n.log||p,a=!1;try{a=!!o.apply}catch(u){}return a?function(){var t=[];return r(arguments,function(n){t.push(i(n))}),o.apply(n,t)}:function(t,n){o(t,null==n?"":n)}}return{log:o("log"),info:o("info"),warn:o("warn"),error:o("error"),debug:function(){var e=o("debug");return function(){t&&e.apply(n,arguments)}}()}}]}function re(t,n){if("__defineGetter__"===t||"__defineSetter__"===t||"__lookupGetter__"===t||"__lookupSetter__"===t||"__proto__"===t)throw ho("isecfld","Attempting to access a disallowed field in Angular expressions! Expression: {0}",n);return t}function ie(t){return t+""}function oe(t,n){if(t){if(t.constructor===t)throw ho("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t.window===t)throw ho("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",n);if(t.children&&(t.nodeName||t.prop&&t.attr&&t.find))throw ho("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",n);if(t===Object)throw ho("isecobj","Referencing Object in Angular expressions is disallowed! Expression: {0}",n)}return t}function ae(t,n){if(t){if(t.constructor===t)throw ho("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t===po||t===vo||t===go)throw ho("isecff","Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}",n)}}function ue(t,n){if(t){var e=(!1).constructor,r=(0).constructor,i="".constructor,o={}.constructor,a=[].constructor,u=Function.constructor;if(t===e||t===r||t===i||t===o||t===a||t===u||t===e.prototype||t===r.prototype||t===i.prototype||t===o.prototype||t===a.prototype||t===u.prototype)throw ho("isecaf","Assigning to a constructor or its prototype is disallowed! Expression: {0}",n)}}function se(t,n){return"undefined"!=typeof t?t:n}function le(t,n){return"undefined"==typeof t?n:"undefined"==typeof n?t:t+n}function ce(t,n){var e=t(n);return!e.$stateful}function fe(t,n){var e,i,o;switch(t.type){case bo.Program:e=!0,r(t.body,function(t){fe(t.expression,n),e=e&&t.expression.constant}),t.constant=e;break;case bo.Literal:t.constant=!0,t.toWatch=[];break;case bo.UnaryExpression:fe(t.argument,n),t.constant=t.argument.constant,t.toWatch=t.argument.toWatch;break;case bo.BinaryExpression:
-fe(t.left,n),fe(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.left.toWatch.concat(t.right.toWatch);break;case bo.LogicalExpression:fe(t.left,n),fe(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.constant?[]:[t];break;case bo.ConditionalExpression:fe(t.test,n),fe(t.alternate,n),fe(t.consequent,n),t.constant=t.test.constant&&t.alternate.constant&&t.consequent.constant,t.toWatch=t.constant?[]:[t];break;case bo.Identifier:t.constant=!1,t.toWatch=[t];break;case bo.MemberExpression:fe(t.object,n),t.computed&&fe(t.property,n),t.constant=t.object.constant&&(!t.computed||t.property.constant),t.toWatch=[t];break;case bo.CallExpression:o=!!t.filter&&ce(n,t.callee.name),e=o,i=[],r(t.arguments,function(t){fe(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=o?i:[t];break;case bo.AssignmentExpression:fe(t.left,n),fe(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=[t];break;case bo.ArrayExpression:e=!0,i=[],r(t.elements,function(t){fe(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=i;break;case bo.ObjectExpression:e=!0,i=[],r(t.properties,function(t){fe(t.value,n),e=e&&t.value.constant&&!t.computed,t.value.constant||i.push.apply(i,t.value.toWatch)}),t.constant=e,t.toWatch=i;break;case bo.ThisExpression:t.constant=!1,t.toWatch=[];break;case bo.LocalsExpression:t.constant=!1,t.toWatch=[]}}function he(t){if(1===t.length){var n=t[0].expression,e=n.toWatch;return 1!==e.length?e:e[0]!==n?e:void 0}}function pe(t){return t.type===bo.Identifier||t.type===bo.MemberExpression}function de(t){if(1===t.body.length&&pe(t.body[0].expression))return{type:bo.AssignmentExpression,left:t.body[0].expression,right:{type:bo.NGValueParameter},operator:"="}}function ve(t){return 0===t.body.length||1===t.body.length&&(t.body[0].expression.type===bo.Literal||t.body[0].expression.type===bo.ArrayExpression||t.body[0].expression.type===bo.ObjectExpression)}function ge(t){return t.constant}function me(t,n){this.astBuilder=t,this.$filter=n}function ye(t,n){this.astBuilder=t,this.$filter=n}function $e(t){return"constructor"===t}function be(t){return S(t.valueOf)?t.valueOf():wo.call(t)}function xe(){var t,n,e=dt(),i=dt(),o={"true":!0,"false":!1,"null":null,undefined:void 0};this.addLiteral=function(t,n){o[t]=n},this.setIdentifierFns=function(e,r){return t=e,n=r,this},this.$get=["$filter",function(a){function u(t,n,r){var o,u,l;switch(r=r||b,typeof t){case"string":t=t.trim(),l=t;var g=r?i:e;if(o=g[l],!o){":"===t.charAt(0)&&":"===t.charAt(1)&&(u=!0,t=t.substring(2));var y=r?$:m,x=new $o(y),w=new xo(x,a,y);o=w.parse(t),o.constant?o.$$watchDelegate=d:u?o.$$watchDelegate=o.literal?h:f:o.inputs&&(o.$$watchDelegate=c),r&&(o=s(o)),g[l]=o}return v(o,n);case"function":return v(t,n);default:return v(p,n)}}function s(t){function n(n,e,r,i){var o=b;b=!0;try{return t(n,e,r,i)}finally{b=o}}if(!t)return t;n.$$watchDelegate=t.$$watchDelegate,n.assign=s(t.assign),n.constant=t.constant,n.literal=t.literal;for(var e=0;t.inputs&&e<t.inputs.length;++e)t.inputs[e]=s(t.inputs[e]);return n.inputs=t.inputs,n}function l(t,n){return null==t||null==n?t===n:("object"!=typeof t||(t=be(t),"object"!=typeof t))&&(t===n||t!==t&&n!==n)}function c(t,n,e,r,i){var o,a=r.inputs;if(1===a.length){var u=l;return a=a[0],t.$watch(function(t){var n=a(t);return l(n,u)||(o=r(t,void 0,void 0,[n]),u=n&&be(n)),o},n,e,i)}for(var s=[],c=[],f=0,h=a.length;f<h;f++)s[f]=l,c[f]=null;return t.$watch(function(t){for(var n=!1,e=0,i=a.length;e<i;e++){var u=a[e](t);(n||(n=!l(u,s[e])))&&(c[e]=u,s[e]=u&&be(u))}return n&&(o=r(t,void 0,void 0,c)),o},n,e,i)}function f(t,n,e,r,i){function o(t){return r(t)}function a(t,e,r){s=t,S(n)&&n(t,e,r),y(t)&&r.$$postDigest(function(){y(s)&&u()})}var u,s;return u=r.inputs?c(t,a,e,r,i):t.$watch(o,a,e)}function h(t,n,e,i){function o(t){var n=!0;return r(t,function(t){y(t)||(n=!1)}),n}var a,u;return a=t.$watch(function(t){return i(t)},function(t,e,r){u=t,S(n)&&n(t,e,r),o(t)&&r.$$postDigest(function(){o(u)&&a()})},e)}function d(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function v(t,n){if(!n)return t;var e=t.$$watchDelegate,r=!1,i=e!==h&&e!==f,o=i?function(e,i,o,a){var u=r&&a?a[0]:t(e,i,o,a);return n(u,e,i)}:function(e,r,i,o){var a=t(e,r,i,o),u=n(a,e,r);return y(a)?u:a};return r=!t.inputs,t.$$watchDelegate&&t.$$watchDelegate!==c?(o.$$watchDelegate=t.$$watchDelegate,o.inputs=t.inputs):n.$stateful||(o.$$watchDelegate=c,o.inputs=t.inputs?t.inputs:[t]),o}var g=ei().noUnsafeEval,m={csp:g,expensiveChecks:!1,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},$={csp:g,expensiveChecks:!0,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},b=!1;return u.$$runningExpensiveChecks=function(){return b},u}]}function we(){var t=!0;this.$get=["$rootScope","$exceptionHandler",function(n,e){return Se(function(t){n.$evalAsync(t)},e,t)}],this.errorOnUnhandledRejections=function(n){return y(n)?(t=n,this):t}}function Ce(){var t=!0;this.$get=["$browser","$exceptionHandler",function(n,e){return Se(function(t){n.defer(t)},e,t)}],this.errorOnUnhandledRejections=function(n){return y(n)?(t=n,this):t}}function Se(t,e,i){function o(){this.$$state={status:0}}function a(t,n){return function(e){n.call(t,e)}}function u(n){var r,o,a;a=n.pending,n.processScheduled=!1,n.pending=void 0;try{for(var u=0,s=a.length;u<s;++u){n.pur=!0,o=a[u][0],r=a[u][n.status];try{S(r)?o.resolve(r(n.value)):1===n.status?o.resolve(n.value):o.reject(n.value)}catch(l){o.reject(l),e(l)}}}finally{--y,i&&0===y&&t(c())}}function s(){for(;!y&&b.length;){var t=b.shift();if(!t.pur){t.pur=!0;var n="Possibly unhandled rejection: "+$t(t.value);e(n)}}}function c(){return function(){s()}}function f(t){return function(){u(t)}}function h(n){!i||n.pending||2!==n.status||n.pur||(0===y&&0===b.length&&t(c()),b.push(n)),!n.processScheduled&&n.pending&&(n.processScheduled=!0,++y,t(f(n)))}function p(){this.promise=new o}function d(t){var n=new p,e=0,i=Kr(t)?[]:{};return r(t,function(t,r){e++,_(t).then(function(t){i.hasOwnProperty(r)||(i[r]=t,--e||n.resolve(i))},function(t){i.hasOwnProperty(r)||n.reject(t)})}),0===e&&n.resolve(i),n.promise}function v(t){var n=x();return r(t,function(t){_(t).then(n.resolve,n.reject)}),n.promise}var g=n("$q",TypeError),y=0,b=[],x=function(){var t=new p;return t.resolve=a(t,t.resolve),t.reject=a(t,t.reject),t.notify=a(t,t.notify),t};l(o.prototype,{then:function(t,n,e){if(m(t)&&m(n)&&m(e))return this;var r=new p;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([r,t,n,e]),this.$$state.status>0&&h(this.$$state),r.promise},"catch":function(t){return this.then(null,t)},"finally":function(t,n){return this.then(function(n){return M(n,!0,t)},function(n){return M(n,!1,t)},n)}}),l(p.prototype,{resolve:function(t){this.promise.$$state.status||(t===this.promise?this.$$reject(g("qcycle","Expected promise to be resolved with value other than itself '{0}'",t)):this.$$resolve(t))},$$resolve:function(t){function n(t){u||(u=!0,o.$$resolve(t))}function r(t){u||(u=!0,o.$$reject(t))}var i,o=this,u=!1;try{($(t)||S(t))&&(i=t&&t.then),S(i)?(this.promise.$$state.status=-1,i.call(t,n,r,a(this,this.notify))):(this.promise.$$state.value=t,this.promise.$$state.status=1,h(this.promise.$$state))}catch(s){r(s),e(s)}},reject:function(t){this.promise.$$state.status||this.$$reject(t)},$$reject:function(t){this.promise.$$state.value=t,this.promise.$$state.status=2,h(this.promise.$$state)},notify:function(n){var r=this.promise.$$state.pending;this.promise.$$state.status<=0&&r&&r.length&&t(function(){for(var t,i,o=0,a=r.length;o<a;o++){i=r[o][0],t=r[o][3];try{i.notify(S(t)?t(n):n)}catch(u){e(u)}}})}});var w=function(t){var n=new p;return n.reject(t),n.promise},C=function(t,n){var e=new p;return n?e.resolve(t):e.reject(t),e.promise},M=function(t,n,e){var r=null;try{S(e)&&(r=e())}catch(i){return C(i,!1)}return T(r)?r.then(function(){return C(t,n)},function(t){return C(t,!1)}):C(t,n)},_=function(t,n,e,r){var i=new p;return i.resolve(t),i.promise.then(n,e,r)},k=_,A=function(t){function n(t){r.resolve(t)}function e(t){r.reject(t)}if(!S(t))throw g("norslvr","Expected resolverFn, got '{0}'",t);var r=new p;return t(n,e),r.promise};return A.prototype=o.prototype,A.defer=x,A.reject=w,A.when=_,A.resolve=k,A.all=d,A.race=v,A}function Me(){this.$get=["$window","$timeout",function(t,n){var e=t.requestAnimationFrame||t.webkitRequestAnimationFrame,r=t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.webkitCancelRequestAnimationFrame,i=!!e,o=i?function(t){var n=e(t);return function(){r(n)}}:function(t){var e=n(t,16.66,!1);return function(){n.cancel(e)}};return o.supported=i,o}]}function _e(){function t(t){function n(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=a(),this.$$ChildScope=null}return n.prototype=t,n}var i=10,o=n("$rootScope"),u=null,s=null;this.digestTtl=function(t){return arguments.length&&(i=t),i},this.$get=["$exceptionHandler","$parse","$browser",function(n,l,c){function f(t){t.currentScope.$$destroyed=!0}function h(t){9===Vr&&(t.$$childHead&&h(t.$$childHead),t.$$nextSibling&&h(t.$$nextSibling)),t.$parent=t.$$nextSibling=t.$$prevSibling=t.$$childHead=t.$$childTail=t.$root=t.$$watchers=null}function d(){this.$id=a(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function v(t){if(M.$$phase)throw o("inprog","{0} already in progress",M.$$phase);M.$$phase=t}function g(){M.$$phase=null}function y(t,n){do t.$$watchersCount+=n;while(t=t.$parent)}function b(t,n,e){do t.$$listenerCount[e]-=n,0===t.$$listenerCount[e]&&delete t.$$listenerCount[e];while(t=t.$parent)}function x(){}function w(){for(;A.length;)try{A.shift()()}catch(t){n(t)}s=null}function C(){null===s&&(s=c.defer(function(){M.$apply(w)}))}d.prototype={constructor:d,$new:function(n,e){var r;return e=e||this,n?(r=new d,r.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=t(this)),r=new this.$$ChildScope),r.$parent=e,r.$$prevSibling=e.$$childTail,e.$$childHead?(e.$$childTail.$$nextSibling=r,e.$$childTail=r):e.$$childHead=e.$$childTail=r,(n||e!==this)&&r.$on("$destroy",f),r},$watch:function(t,n,e,r){var i=l(t);if(i.$$watchDelegate)return i.$$watchDelegate(this,n,e,i,t);var o=this,a=o.$$watchers,s={fn:n,last:x,get:i,exp:r||t,eq:!!e};return u=null,S(n)||(s.fn=p),a||(a=o.$$watchers=[]),a.unshift(s),y(this,1),function(){F(a,s)>=0&&y(o,-1),u=null}},$watchGroup:function(t,n){function e(){s=!1,l?(l=!1,n(o,o,u)):n(o,i,u)}var i=new Array(t.length),o=new Array(t.length),a=[],u=this,s=!1,l=!0;if(!t.length){var c=!0;return u.$evalAsync(function(){c&&n(o,o,u)}),function(){c=!1}}return 1===t.length?this.$watch(t[0],function(t,e,r){o[0]=t,i[0]=e,n(o,t===e?o:i,r)}):(r(t,function(t,n){var r=u.$watch(t,function(t,r){o[n]=t,i[n]=r,s||(s=!0,u.$evalAsync(e))});a.push(r)}),function(){for(;a.length;)a.shift()()})},$watchCollection:function(t,n){function r(t){o=t;var n,r,i,u,s;if(!m(o)){if($(o))if(e(o)){a!==p&&(a=p,g=a.length=0,f++),n=o.length,g!==n&&(f++,a.length=g=n);for(var l=0;l<n;l++)s=a[l],u=o[l],i=s!==s&&u!==u,i||s===u||(f++,a[l]=u)}else{a!==d&&(a=d={},g=0,f++),n=0;for(r in o)jr.call(o,r)&&(n++,u=o[r],s=a[r],r in a?(i=s!==s&&u!==u,i||s===u||(f++,a[r]=u)):(g++,a[r]=u,f++));if(g>n){f++;for(r in a)jr.call(o,r)||(g--,delete a[r])}}else a!==o&&(a=o,f++);return f}}function i(){if(v?(v=!1,n(o,o,s)):n(o,u,s),c)if($(o))if(e(o)){u=new Array(o.length);for(var t=0;t<o.length;t++)u[t]=o[t]}else{u={};for(var r in o)jr.call(o,r)&&(u[r]=o[r])}else u=o}r.$stateful=!0;var o,a,u,s=this,c=n.length>1,f=0,h=l(t,r),p=[],d={},v=!0,g=0;return this.$watch(h,i)},$digest:function(){var t,e,r,a,l,f,h,p,d,m,y,$,b=i,C=this,A=[];v("$digest"),c.$$checkUrlChange(),this===M&&null!==s&&(c.defer.cancel(s),w()),u=null;do{p=!1,m=C;for(var P=0;P<_.length;P++){try{$=_[P],$.scope.$eval($.expression,$.locals)}catch(O){n(O)}u=null}_.length=0;t:do{if(f=m.$$watchers)for(h=f.length;h--;)try{if(t=f[h])if(l=t.get,(e=l(m))===(r=t.last)||(t.eq?V(e,r):"number"==typeof e&&"number"==typeof r&&isNaN(e)&&isNaN(r))){if(t===u){p=!1;break t}}else p=!0,u=t,t.last=t.eq?I(e,null):e,a=t.fn,a(e,r===x?e:r,m),b<5&&(y=4-b,A[y]||(A[y]=[]),A[y].push({msg:S(t.exp)?"fn: "+(t.exp.name||t.exp.toString()):t.exp,newVal:e,oldVal:r}))}catch(O){n(O)}if(!(d=m.$$watchersCount&&m.$$childHead||m!==C&&m.$$nextSibling))for(;m!==C&&!(d=m.$$nextSibling);)m=m.$parent}while(m=d);if((p||_.length)&&!b--)throw g(),o("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",i,A)}while(p||_.length);for(g();E<k.length;)try{k[E++]()}catch(O){n(O)}k.length=E=0},$destroy:function(){if(!this.$$destroyed){var t=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===M&&c.$$applicationDestroyed(),y(this,-this.$$watchersCount);for(var n in this.$$listenerCount)b(this,this.$$listenerCount[n],n);t&&t.$$childHead===this&&(t.$$childHead=this.$$nextSibling),t&&t.$$childTail===this&&(t.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=p,this.$on=this.$watch=this.$watchGroup=function(){return p},this.$$listeners={},this.$$nextSibling=null,h(this)}},$eval:function(t,n){return l(t)(this,n)},$evalAsync:function(t,n){M.$$phase||_.length||c.defer(function(){_.length&&M.$digest()}),_.push({scope:this,expression:l(t),locals:n})},$$postDigest:function(t){k.push(t)},$apply:function(t){try{v("$apply");try{return this.$eval(t)}finally{g()}}catch(e){n(e)}finally{try{M.$digest()}catch(e){throw n(e),e}}},$applyAsync:function(t){function n(){e.$eval(t)}var e=this;t&&A.push(n),t=l(t),C()},$on:function(t,n){var e=this.$$listeners[t];e||(this.$$listeners[t]=e=[]),e.push(n);var r=this;do r.$$listenerCount[t]||(r.$$listenerCount[t]=0),r.$$listenerCount[t]++;while(r=r.$parent);var i=this;return function(){var r=e.indexOf(n);r!==-1&&(e[r]=null,b(i,1,t))}},$emit:function(t,e){var r,i,o,a=[],u=this,s=!1,l={name:t,targetScope:u,stopPropagation:function(){s=!0},preventDefault:function(){l.defaultPrevented=!0},defaultPrevented:!1},c=q([l],arguments,1);do{for(r=u.$$listeners[t]||a,l.currentScope=u,i=0,o=r.length;i<o;i++)if(r[i])try{r[i].apply(null,c)}catch(f){n(f)}else r.splice(i,1),i--,o--;if(s)return l.currentScope=null,l;u=u.$parent}while(u);return l.currentScope=null,l},$broadcast:function(t,e){var r=this,i=r,o=r,a={name:t,targetScope:r,preventDefault:function(){a.defaultPrevented=!0},defaultPrevented:!1};if(!r.$$listenerCount[t])return a;for(var u,s,l,c=q([a],arguments,1);i=o;){for(a.currentScope=i,u=i.$$listeners[t]||[],s=0,l=u.length;s<l;s++)if(u[s])try{u[s].apply(null,c)}catch(f){n(f)}else u.splice(s,1),s--,l--;if(!(o=i.$$listenerCount[t]&&i.$$childHead||i!==r&&i.$$nextSibling))for(;i!==r&&!(o=i.$$nextSibling);)i=i.$parent}return a.currentScope=null,a}};var M=new d,_=M.$$asyncQueue=[],k=M.$$postDigestQueue=[],A=M.$$applyAsyncQueue=[],E=0;return M}]}function ke(){var t=/^\s*(https?|ftp|mailto|tel|file):/,n=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(n){return y(n)?(t=n,this):t},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(n=t,this):n},this.$get=function(){return function(e,r){var i,o=r?n:t;return i=Re(e).href,""===i||i.match(o)?e:"unsafe:"+i}}}function Ae(t){if("self"===t)return t;if(x(t)){if(t.indexOf("***")>-1)throw Co("iwcard","Illegal sequence *** in string matcher.  String: {0}",t);return t=ni(t).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+t+"$")}if(M(t))return new RegExp("^"+t.source+"$");throw Co("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function Ee(t){var n=[];return y(t)&&r(t,function(t){n.push(Ae(t))}),n}function Pe(){this.SCE_CONTEXTS=So;var t=["self"],n=[];this.resourceUrlWhitelist=function(n){return arguments.length&&(t=Ee(n)),t},this.resourceUrlBlacklist=function(t){return arguments.length&&(n=Ee(t)),n},this.$get=["$injector",function(e){function r(t,n){return"self"===t?De(n):!!t.exec(n.href)}function i(e){var i,o,a=Re(e.toString()),u=!1;for(i=0,o=t.length;i<o;i++)if(r(t[i],a)){u=!0;break}if(u)for(i=0,o=n.length;i<o;i++)if(r(n[i],a)){u=!1;break}return u}function o(t){var n=function(t){this.$$unwrapTrustedValue=function(){return t}};return t&&(n.prototype=new t),n.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},n.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},n}function a(t,n){var e=f.hasOwnProperty(t)?f[t]:null;if(!e)throw Co("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",t,n);if(null===n||m(n)||""===n)return n;if("string"!=typeof n)throw Co("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",t);return new e(n)}function u(t){return t instanceof c?t.$$unwrapTrustedValue():t}function s(t,n){if(null===n||m(n)||""===n)return n;var e=f.hasOwnProperty(t)?f[t]:null;if(e&&n instanceof e)return n.$$unwrapTrustedValue();if(t===So.RESOURCE_URL){if(i(n))return n;throw Co("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",n.toString())}if(t===So.HTML)return l(n);throw Co("unsafe","Attempting to use an unsafe value in a safe context.")}var l=function(t){throw Co("unsafe","Attempting to use an unsafe value in a safe context.")};e.has("$sanitize")&&(l=e.get("$sanitize"));var c=o(),f={};return f[So.HTML]=o(c),f[So.CSS]=o(c),f[So.URL]=o(c),f[So.JS]=o(c),f[So.RESOURCE_URL]=o(f[So.URL]),{trustAs:a,getTrusted:s,valueOf:u}}]}function Oe(){var t=!0;this.enabled=function(n){return arguments.length&&(t=!!n),t},this.$get=["$parse","$sceDelegate",function(n,e){if(t&&Vr<8)throw Co("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var i=mt(So);i.isEnabled=function(){return t},i.trustAs=e.trustAs,i.getTrusted=e.getTrusted,i.valueOf=e.valueOf,t||(i.trustAs=i.getTrusted=function(t,n){return n},i.valueOf=d),i.parseAs=function(t,e){var r=n(e);return r.literal&&r.constant?r:n(e,function(n){return i.getTrusted(t,n)})};var o=i.parseAs,a=i.getTrusted,u=i.trustAs;return r(So,function(t,n){var e=Rr(n);i[wt("parse_as_"+e)]=function(n){return o(t,n)},i[wt("get_trusted_"+e)]=function(n){return a(t,n)},i[wt("trust_as_"+e)]=function(n){return u(t,n)}}),i}]}function Te(){this.$get=["$window","$document",function(t,n){var e,r,i={},o=t.chrome&&t.chrome.app&&t.chrome.app.runtime,a=!o&&t.history&&t.history.pushState,u=f((/android (\d+)/.exec(Rr((t.navigator||{}).userAgent))||[])[1]),s=/Boxee/i.test((t.navigator||{}).userAgent),l=n[0]||{},c=/^(Moz|webkit|ms)(?=[A-Z])/,h=l.body&&l.body.style,p=!1,d=!1;if(h){for(var v in h)if(r=c.exec(v)){e=r[0],e=e[0].toUpperCase()+e.substr(1);break}e||(e="WebkitOpacity"in h&&"webkit"),p=!!("transition"in h||e+"Transition"in h),d=!!("animation"in h||e+"Animation"in h),!u||p&&d||(p=x(h.webkitTransition),d=x(h.webkitAnimation))}return{history:!(!a||u<4||s),hasEvent:function(t){if("input"===t&&Vr<=11)return!1;if(m(i[t])){var n=l.createElement("div");i[t]="on"+t in n}return i[t]},csp:ei(),vendorPrefix:e,transitions:p,animations:d,android:u}}]}function Le(){var t;this.httpOptions=function(n){return n?(t=n,this):t},this.$get=["$templateCache","$http","$q","$sce",function(n,e,r,i){function o(a,u){function s(t){if(!u)throw Mo("tpload","Failed to load template: {0} (HTTP status: {1} {2})",a,t.status,t.statusText);return r.reject(t)}o.totalPendingRequests++,x(a)&&!m(n.get(a))||(a=i.getTrustedResourceUrl(a));var c=e.defaults&&e.defaults.transformResponse;return Kr(c)?c=c.filter(function(t){return t!==En}):c===En&&(c=null),e.get(a,l({cache:n,transformResponse:c},t))["finally"](function(){o.totalPendingRequests--}).then(function(t){return n.put(a,t.data),t.data},s)}return o.totalPendingRequests=0,o}]}function Ne(){this.$get=["$rootScope","$browser","$location",function(t,n,e){var i={};return i.findBindings=function(t,n,e){var i=t.getElementsByClassName("ng-binding"),o=[];return r(i,function(t){var i=Xr.element(t).data("$binding");i&&r(i,function(r){if(e){var i=new RegExp("(^|\\s)"+ni(n)+"(\\s|\\||$)");i.test(r)&&o.push(t)}else r.indexOf(n)!==-1&&o.push(t)})}),o},i.findModels=function(t,n,e){for(var r=["ng-","data-ng-","ng\\:"],i=0;i<r.length;++i){var o=e?"=":"*=",a="["+r[i]+"model"+o+'"'+n+'"]',u=t.querySelectorAll(a);if(u.length)return u}},i.getLocation=function(){return e.url()},i.setLocation=function(n){n!==e.url()&&(e.url(n),t.$digest())},i.whenStable=function(t){n.notifyWhenNoOutstandingRequests(t)},i}]}function je(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(t,n,e,r,i){function o(o,u,s){S(o)||(s=u,u=o,o=p);var l,c=z(arguments,3),f=y(s)&&!s,h=(f?r:e).defer(),d=h.promise;return l=n.defer(function(){try{h.resolve(o.apply(null,c))}catch(n){h.reject(n),i(n)}finally{delete a[d.$$timeoutId]}f||t.$apply()},u),d.$$timeoutId=l,a[l]=h,d}var a={};return o.cancel=function(t){return!!(t&&t.$$timeoutId in a)&&(a[t.$$timeoutId].promise["catch"](p),a[t.$$timeoutId].reject("canceled"),delete a[t.$$timeoutId],n.defer.cancel(t.$$timeoutId))},o}]}function Re(t){var n=t;return Vr&&(_o.setAttribute("href",n),n=_o.href),_o.setAttribute("href",n),{href:_o.href,protocol:_o.protocol?_o.protocol.replace(/:$/,""):"",host:_o.host,search:_o.search?_o.search.replace(/^\?/,""):"",hash:_o.hash?_o.hash.replace(/^#/,""):"",hostname:_o.hostname,port:_o.port,pathname:"/"===_o.pathname.charAt(0)?_o.pathname:"/"+_o.pathname}}function De(t){var n=x(t)?Re(t):t;return n.protocol===ko.protocol&&n.host===ko.host}function Fe(){this.$get=v(t)}function Ie(t){function n(t){try{return decodeURIComponent(t)}catch(n){return t}}var e=t[0]||{},r={},i="";return function(){var t,o,a,u,s,l=e.cookie||"";if(l!==i)for(i=l,t=i.split("; "),r={},a=0;a<t.length;a++)o=t[a],u=o.indexOf("="),u>0&&(s=n(o.substring(0,u)),m(r[s])&&(r[s]=n(o.substring(u+1))));return r}}function Ve(){this.$get=Ie}function qe(t){function n(i,o){if($(i)){var a={};return r(i,function(t,e){a[e]=n(e,t)}),a}return t.factory(i+e,o)}var e="Filter";this.register=n,this.$get=["$injector",function(t){return function(n){return t.get(n+e)}}],n("currency",He),n("date",ur),n("filter",ze),n("json",sr),n("limitTo",lr),n("lowercase",No),n("number",Ye),n("orderBy",fr),n("uppercase",jo)}function ze(){return function(t,r,i,o){if(!e(t)){if(null==t)return t;throw n("filter")("notarray","Expected array but received: {0}",t)}o=o||"$";var a,u,s=We(r);switch(s){case"function":a=r;break;case"boolean":case"null":case"number":case"string":u=!0;case"object":a=Be(r,i,o,u);break;default:return t}return Array.prototype.filter.call(t,a)}}function Be(t,n,e,r){var i,o=$(t)&&e in t;return n===!0?n=V:S(n)||(n=function(t,n){return!m(t)&&(null===t||null===n?t===n:!($(n)||$(t)&&!g(t))&&(t=Rr(""+t),n=Rr(""+n),t.indexOf(n)!==-1))}),i=function(i){return o&&!$(i)?Ue(i,t[e],n,e,!1):Ue(i,t,n,e,r)}}function Ue(t,n,e,r,i,o){var a=We(t),u=We(n);if("string"===u&&"!"===n.charAt(0))return!Ue(t,n.substring(1),e,r,i);if(Kr(t))return t.some(function(t){return Ue(t,n,e,r,i)});switch(a){case"object":var s;if(i){for(s in t)if("$"!==s.charAt(0)&&Ue(t[s],n,e,r,!0))return!0;return!o&&Ue(t,n,e,r,!1)}if("object"===u){for(s in n){var l=n[s];if(!S(l)&&!m(l)){var c=s===r,f=c?t:t[s];if(!Ue(f,l,e,r,c,c))return!1}}return!0}return e(t,n);case"function":return!1;default:return e(t,n)}}function We(t){return null===t?"null":typeof t}function He(t){var n=t.NUMBER_FORMATS;return function(t,e,r){return m(e)&&(e=n.CURRENCY_SYM),m(r)&&(r=n.PATTERNS[1].maxFrac),null==t?t:Xe(t,n.PATTERNS[1],n.GROUP_SEP,n.DECIMAL_SEP,r).replace(/\u00A4/g,e)}}function Ye(t){var n=t.NUMBER_FORMATS;return function(t,e){return null==t?t:Xe(t,n.PATTERNS[0],n.GROUP_SEP,n.DECIMAL_SEP,e)}}function Ge(t){var n,e,r,i,o,a=0;for((e=t.indexOf(Eo))>-1&&(t=t.replace(Eo,"")),(r=t.search(/e/i))>0?(e<0&&(e=r),e+=+t.slice(r+1),t=t.substring(0,r)):e<0&&(e=t.length),r=0;t.charAt(r)===Po;r++);if(r===(o=t.length))n=[0],e=1;else{for(o--;t.charAt(o)===Po;)o--;for(e-=r,n=[],i=0;r<=o;r++,i++)n[i]=+t.charAt(r)}return e>Ao&&(n=n.splice(0,Ao-1),a=e-1,e=1),{d:n,e:a,i:e}}function Ze(t,n,e,r){var i=t.d,o=i.length-t.i;n=m(n)?Math.min(Math.max(e,o),r):+n;var a=n+t.i,u=i[a];if(a>0){i.splice(Math.max(t.i,a));for(var s=a;s<i.length;s++)i[s]=0}else{o=Math.max(0,o),t.i=1,i.length=Math.max(1,a=n+1),i[0]=0;for(var l=1;l<a;l++)i[l]=0}if(u>=5)if(a-1<0){for(var c=0;c>a;c--)i.unshift(0),t.i++;i.unshift(1),t.i++}else i[a-1]++;for(;o<Math.max(0,n);o++)i.push(0);var f=i.reduceRight(function(t,n,e,r){return n+=t,r[e]=n%10,Math.floor(n/10)},0);f&&(i.unshift(f),t.i++)}function Xe(t,n,e,r,i){if(!x(t)&&!w(t)||isNaN(t))return"";var o,a=!isFinite(t),u=!1,s=Math.abs(t)+"",l="";if(a)l="∞";else{o=Ge(s),Ze(o,i,n.minFrac,n.maxFrac);var c=o.d,f=o.i,h=o.e,p=[];for(u=c.reduce(function(t,n){return t&&!n},!0);f<0;)c.unshift(0),f++;f>0?p=c.splice(f,c.length):(p=c,c=[0]);var d=[];for(c.length>=n.lgSize&&d.unshift(c.splice(-n.lgSize,c.length).join(""));c.length>n.gSize;)d.unshift(c.splice(-n.gSize,c.length).join(""));c.length&&d.unshift(c.join("")),l=d.join(e),p.length&&(l+=r+p.join("")),h&&(l+="e+"+h)}return t<0&&!u?n.negPre+l+n.negSuf:n.posPre+l+n.posSuf}function Je(t,n,e,r){var i="";for((t<0||r&&t<=0)&&(r?t=-t+1:(t=-t,i="-")),t=""+t;t.length<n;)t=Po+t;return e&&(t=t.substr(t.length-n)),i+t}function Ke(t,n,e,r,i){return e=e||0,function(o){var a=o["get"+t]();return(e>0||a>-e)&&(a+=e),0===a&&e===-12&&(a=12),Je(a,n,r,i)}}function Qe(t,n,e){return function(r,i){var o=r["get"+t](),a=(e?"STANDALONE":"")+(n?"SHORT":""),u=Dr(a+t);return i[u][o]}}function tr(t,n,e){var r=-1*e,i=r>=0?"+":"";return i+=Je(Math[r>0?"floor":"ceil"](r/60),2)+Je(Math.abs(r%60),2)}function nr(t){var n=new Date(t,0,1).getDay();return new Date(t,0,(n<=4?5:12)-n)}function er(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function rr(t){return function(n){var e=nr(n.getFullYear()),r=er(n),i=+r-+e,o=1+Math.round(i/6048e5);return Je(o,t)}}function ir(t,n){return t.getHours()<12?n.AMPMS[0]:n.AMPMS[1]}function or(t,n){return t.getFullYear()<=0?n.ERAS[0]:n.ERAS[1]}function ar(t,n){return t.getFullYear()<=0?n.ERANAMES[0]:n.ERANAMES[1]}function ur(t){function n(t){var n;if(n=t.match(e)){var r=new Date(0),i=0,o=0,a=n[8]?r.setUTCFullYear:r.setFullYear,u=n[8]?r.setUTCHours:r.setHours;n[9]&&(i=f(n[9]+n[10]),o=f(n[9]+n[11])),a.call(r,f(n[1]),f(n[2])-1,f(n[3]));var s=f(n[4]||0)-i,l=f(n[5]||0)-o,c=f(n[6]||0),h=Math.round(1e3*parseFloat("0."+(n[7]||0)));return u.call(r,s,l,c,h),r}return t}var e=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(e,i,o){var a,u,s="",l=[];if(i=i||"mediumDate",i=t.DATETIME_FORMATS[i]||i,x(e)&&(e=Lo.test(e)?f(e):n(e)),w(e)&&(e=new Date(e)),!C(e)||!isFinite(e.getTime()))return e;for(;i;)u=To.exec(i),u?(l=q(l,u,1),i=l.pop()):(l.push(i),i=null);var c=e.getTimezoneOffset();return o&&(c=Y(o,c),e=Z(e,o,!0)),r(l,function(n){a=Oo[n],s+=a?a(e,t.DATETIME_FORMATS,c):"''"===n?"'":n.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),s}}function sr(){return function(t,n){return m(n)&&(n=2),W(t,n)}}function lr(){return function(t,n,r){return n=Math.abs(Number(n))===1/0?Number(n):f(n),isNaN(n)?t:(w(t)&&(t=t.toString()),e(t)?(r=!r||isNaN(r)?0:f(r),r=r<0?Math.max(0,t.length+r):r,n>=0?cr(t,r,r+n):0===r?cr(t,n,t.length):cr(t,Math.max(0,r+n),r)):t)}}function cr(t,n,e){return x(t)?t.slice(n,e):Ur.call(t,n,e)}function fr(t){function r(n){return n.map(function(n){var e=1,r=d;if(S(n))r=n;else if(x(n)&&("+"!==n.charAt(0)&&"-"!==n.charAt(0)||(e="-"===n.charAt(0)?-1:1,n=n.substring(1)),""!==n&&(r=t(n),r.constant))){var i=r();r=function(t){return t[i]}}return{get:r,descending:e}})}function i(t){switch(typeof t){case"number":case"boolean":case"string":return!0;default:return!1}}function o(t){return S(t.valueOf)&&(t=t.valueOf(),i(t))?t:g(t)&&(t=t.toString(),i(t))?t:t}function a(t,n){var e=typeof t;return null===t?(e="string",t="null"):"object"===e&&(t=o(t)),{value:t,type:e,index:n}}function u(t,n){var e=0,r=t.type,i=n.type;if(r===i){var o=t.value,a=n.value;"string"===r?(o=o.toLowerCase(),a=a.toLowerCase()):"object"===r&&($(o)&&(o=t.index),$(a)&&(a=n.index)),o!==a&&(e=o<a?-1:1)}else e=r<i?-1:1;return e}return function(t,i,o,s){function l(t,n){return{value:t,tieBreaker:{value:n,type:"number",index:n},predicateValues:f.map(function(e){return a(e.get(t),n)})}}function c(t,n){for(var e=0,r=f.length;e<r;e++){var i=p(t.predicateValues[e],n.predicateValues[e]);if(i)return i*f[e].descending*h}return p(t.tieBreaker,n.tieBreaker)*h}if(null==t)return t;if(!e(t))throw n("orderBy")("notarray","Expected array but received: {0}",t);Kr(i)||(i=[i]),0===i.length&&(i=["+"]);var f=r(i),h=o?-1:1,p=S(s)?s:u,d=Array.prototype.map.call(t,l);return d.sort(c),t=d.map(function(t){return t.value})}}function hr(t){return S(t)&&(t={link:t}),t.restrict=t.restrict||"AC",v(t)}function pr(t,n){t.$name=n}function dr(t,n,e,i,o){var a=this,u=[];a.$error={},a.$$success={},a.$pending=void 0,a.$name=o(n.name||n.ngForm||"")(e),a.$dirty=!1,a.$pristine=!0,a.$valid=!0,a.$invalid=!1,a.$submitted=!1,a.$$parentForm=Fo,a.$rollbackViewValue=function(){r(u,function(t){t.$rollbackViewValue()})},a.$commitViewValue=function(){r(u,function(t){t.$commitViewValue()})},a.$addControl=function(t){ft(t.$name,"input"),u.push(t),t.$name&&(a[t.$name]=t),t.$$parentForm=a},a.$$renameControl=function(t,n){var e=t.$name;a[e]===t&&delete a[e],a[n]=t,t.$name=n},a.$removeControl=function(t){t.$name&&a[t.$name]===t&&delete a[t.$name],r(a.$pending,function(n,e){a.$setValidity(e,null,t)}),r(a.$error,function(n,e){a.$setValidity(e,null,t)}),r(a.$$success,function(n,e){a.$setValidity(e,null,t)}),F(u,t),t.$$parentForm=Fo},Or({ctrl:this,$element:t,set:function(t,n,e){var r=t[n];if(r){var i=r.indexOf(e);i===-1&&r.push(e)}else t[n]=[e]},unset:function(t,n,e){var r=t[n];r&&(F(r,e),0===r.length&&delete t[n])},$animate:i}),a.$setDirty=function(){i.removeClass(t,wa),i.addClass(t,Ca),a.$dirty=!0,a.$pristine=!1,a.$$parentForm.$setDirty()},a.$setPristine=function(){i.setClass(t,wa,Ca+" "+Io),a.$dirty=!1,a.$pristine=!0,a.$submitted=!1,r(u,function(t){t.$setPristine()})},a.$setUntouched=function(){r(u,function(t){t.$setUntouched()})},a.$setSubmitted=function(){i.addClass(t,Io),a.$submitted=!0,a.$$parentForm.$setSubmitted()}}function vr(t){t.$formatters.push(function(n){return t.$isEmpty(n)?n:n.toString()})}function gr(t,n,e,r,i,o){mr(t,n,e,r,i,o),vr(r)}function mr(t,n,e,r,i,o){var a=Rr(n[0].type);if(!i.android){var u=!1;n.on("compositionstart",function(){u=!0}),n.on("compositionend",function(){u=!1,l()})}var s,l=function(t){if(s&&(o.defer.cancel(s),s=null),!u){var i=n.val(),l=t&&t.type;"password"===a||e.ngTrim&&"false"===e.ngTrim||(i=ti(i)),(r.$viewValue!==i||""===i&&r.$$hasNativeValidators)&&r.$setViewValue(i,l)}};if(i.hasEvent("input"))n.on("input",l);else{var c=function(t,n,e){s||(s=o.defer(function(){s=null,n&&n.value===e||l(t)}))};n.on("keydown",function(t){var n=t.keyCode;91===n||15<n&&n<19||37<=n&&n<=40||c(t,this,this.value)}),i.hasEvent("paste")&&n.on("paste cut",c)}n.on("change",l),Qo[a]&&r.$$hasNativeValidators&&a===e.type&&n.on(Ko,function(t){if(!s){var n=this[Nr],e=n.badInput,r=n.typeMismatch;s=o.defer(function(){s=null,n.badInput===e&&n.typeMismatch===r||l(t)})}}),r.$render=function(){var t=r.$isEmpty(r.$viewValue)?"":r.$viewValue;n.val()!==t&&n.val(t)}}function yr(t,n){if(C(t))return t;if(x(t)){Zo.lastIndex=0;var e=Zo.exec(t);if(e){var r=+e[1],i=+e[2],o=0,a=0,u=0,s=0,l=nr(r),c=7*(i-1);return n&&(o=n.getHours(),a=n.getMinutes(),u=n.getSeconds(),s=n.getMilliseconds()),
-new Date(r,0,l.getDate()+c,o,a,u,s)}}return NaN}function $r(t,n){return function(e,i){var o,a;if(C(e))return e;if(x(e)){if('"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substring(1,e.length-1)),Bo.test(e))return new Date(e);if(t.lastIndex=0,o=t.exec(e))return o.shift(),a=i?{yyyy:i.getFullYear(),MM:i.getMonth()+1,dd:i.getDate(),HH:i.getHours(),mm:i.getMinutes(),ss:i.getSeconds(),sss:i.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(o,function(t,e){e<n.length&&(a[n[e]]=+t)}),new Date(a.yyyy,a.MM-1,a.dd,a.HH,a.mm,a.ss||0,1e3*a.sss||0)}return NaN}}function br(t,n,e,r){return function(i,o,a,u,s,l,c){function f(t){return t&&!(t.getTime&&t.getTime()!==t.getTime())}function h(t){return y(t)&&!C(t)?e(t)||void 0:t}xr(i,o,a,u),mr(i,o,a,u,s,l);var p,d=u&&u.$options&&u.$options.timezone;if(u.$$parserName=t,u.$parsers.push(function(t){if(u.$isEmpty(t))return null;if(n.test(t)){var r=e(t,p);return d&&(r=Z(r,d)),r}}),u.$formatters.push(function(t){if(t&&!C(t))throw Ea("datefmt","Expected `{0}` to be a date",t);return f(t)?(p=t,p&&d&&(p=Z(p,d,!0)),c("date")(t,r,d)):(p=null,"")}),y(a.min)||a.ngMin){var v;u.$validators.min=function(t){return!f(t)||m(v)||e(t)>=v},a.$observe("min",function(t){v=h(t),u.$validate()})}if(y(a.max)||a.ngMax){var g;u.$validators.max=function(t){return!f(t)||m(g)||e(t)<=g},a.$observe("max",function(t){g=h(t),u.$validate()})}}}function xr(t,n,e,r){var i=n[0],o=r.$$hasNativeValidators=$(i.validity);o&&r.$parsers.push(function(t){var e=n.prop(Nr)||{};return e.badInput||e.typeMismatch?void 0:t})}function wr(t){t.$$parserName="number",t.$parsers.push(function(n){return t.$isEmpty(n)?null:Ho.test(n)?parseFloat(n):void 0}),t.$formatters.push(function(n){if(!t.$isEmpty(n)){if(!w(n))throw Ea("numfmt","Expected `{0}` to be a number",n);n=n.toString()}return n})}function Cr(t,n,e,r,i,o){if(xr(t,n,e,r),wr(r),mr(t,n,e,r,i,o),y(e.min)||e.ngMin){var a;r.$validators.min=function(t){return r.$isEmpty(t)||m(a)||t>=a},e.$observe("min",function(t){y(t)&&!w(t)&&(t=parseFloat(t)),a=w(t)&&!isNaN(t)?t:void 0,r.$validate()})}if(y(e.max)||e.ngMax){var u;r.$validators.max=function(t){return r.$isEmpty(t)||m(u)||t<=u},e.$observe("max",function(t){y(t)&&!w(t)&&(t=parseFloat(t)),u=w(t)&&!isNaN(t)?t:void 0,r.$validate()})}}function Sr(t,n,e,r,i,o){function a(t){if(y(t)&&!w(t)&&(t=parseFloat(t)),s=w(t)&&!isNaN(t)?t:void 0,!w(r.$modelValue)||!isNaN(r.$modelValue))if(c&&"min"===p){var e=n.val();s>e&&(n.val(s),e=s),r.$setViewValue(e)}else r.$validate()}function u(t){if(y(t)&&!w(t)&&(t=parseFloat(t)),l=w(t)&&!isNaN(t)?t:void 0,!w(r.$modelValue)||!isNaN(r.$modelValue))if(c&&"max"===d){var e=n.val();l<e&&(n.val(l),e=s),r.$setViewValue(e)}else r.$validate()}xr(t,n,e,r),wr(r),mr(t,n,e,r,i,o);var s=0,l=100,c=r.$$hasNativeValidators&&"range"===n[0].type,f=n[0].validity,h=r.$render;r.$render=c&&y(f.rangeUnderflow)&&y(f.rangeOverflow)?function(){h(),r.$setViewValue(n.val())}:h;var p=y(e.ngMin)?"ngMin":!!y(e.min)&&"min";p&&(r.$validators.min=y(e.min)&&c?function(t){return!0}:function(t,n){return r.$isEmpty(n)||m(s)||n>=s},a(e.min),e.$observe("min",a));var d=y(e.max)?"max":!!e.ngMax&&"ngMax";d&&(r.$validators.max=y(e.max)&&c?function(){return!0}:function(t,n){return r.$isEmpty(n)||m(l)||n<=l},u(e.max),e.$observe("max",u))}function Mr(t,n,e,r,i,o){mr(t,n,e,r,i,o),vr(r),r.$$parserName="url",r.$validators.url=function(t,n){var e=t||n;return r.$isEmpty(e)||Uo.test(e)}}function _r(t,n,e,r,i,o){mr(t,n,e,r,i,o),vr(r),r.$$parserName="email",r.$validators.email=function(t,n){var e=t||n;return r.$isEmpty(e)||Wo.test(e)}}function kr(t,n,e,r){var i=!e.ngTrim||"false"!==ti(e.ngTrim);m(e.name)&&n.attr("name",a());var o=function(t){var o;n[0].checked&&(o=e.value,i&&(o=ti(o)),r.$setViewValue(o,t&&t.type))};n.on("click",o),r.$render=function(){var t=e.value;i&&(t=ti(t)),n[0].checked=t==r.$viewValue},e.$observe("value",r.$render)}function Ar(t,n,e,r,i){var o;if(y(r)){if(o=t(r),!o.constant)throw Ea("constexpr","Expected constant expression for `{0}`, but saw `{1}`.",e,r);return o(n)}return i}function Er(t,n,e,r,i,o,a,u){var s=Ar(u,t,"ngTrueValue",e.ngTrueValue,!0),l=Ar(u,t,"ngFalseValue",e.ngFalseValue,!1),c=function(t){r.$setViewValue(n[0].checked,t&&t.type)};n.on("click",c),r.$render=function(){n[0].checked=r.$viewValue},r.$isEmpty=function(t){return t===!1},r.$formatters.push(function(t){return V(t,s)}),r.$parsers.push(function(t){return t?s:l})}function Pr(t,n){return t="ngClass"+t,["$animate",function(e){function i(t,n){var e=[];t:for(var r=0;r<t.length;r++){for(var i=t[r],o=0;o<n.length;o++)if(i===n[o])continue t;e.push(i)}return e}function o(t){var n=[];return Kr(t)?(r(t,function(t){n=n.concat(o(t))}),n):x(t)?t.split(" "):$(t)?(r(t,function(t,e){t&&(n=n.concat(e.split(" ")))}),n):t}return{restrict:"AC",link:function(a,u,s){function l(t){var n=f(t,1);s.$addClass(n)}function c(t){var n=f(t,-1);s.$removeClass(n)}function f(t,n){var e=u.data("$classCounts")||dt(),i=[];return r(t,function(t){(n>0||e[t])&&(e[t]=(e[t]||0)+n,e[t]===+(n>0)&&i.push(t))}),u.data("$classCounts",e),i.join(" ")}function h(t,n){var r=i(n,t),o=i(t,n);r=f(r,1),o=f(o,-1),r&&r.length&&e.addClass(u,r),o&&o.length&&e.removeClass(u,o)}function p(t){if(n===!0||(1&a.$index)===n){var e=o(t||[]);if(d){if(!V(t,d)){var r=o(d);h(r,e)}}else l(e)}d=Kr(t)?t.map(function(t){return mt(t)}):mt(t)}var d;a.$watch(s[t],p,!0),s.$observe("class",function(n){p(a.$eval(s[t]))}),"ngClass"!==t&&a.$watch("$index",function(e,r){var i=1&e;if(i!==(1&r)){var u=o(a.$eval(s[t]));i===n?l(u):c(u)}})}}}]}function Or(t){function n(t,n,u){m(n)?e("$pending",t,u):r("$pending",t,u),O(n)?n?(c(a.$error,t,u),l(a.$$success,t,u)):(l(a.$error,t,u),c(a.$$success,t,u)):(c(a.$error,t,u),c(a.$$success,t,u)),a.$pending?(i(_a,!0),a.$valid=a.$invalid=void 0,o("",null)):(i(_a,!1),a.$valid=Tr(a.$error),a.$invalid=!a.$valid,o("",a.$valid));var s;s=a.$pending&&a.$pending[t]?void 0:!a.$error[t]&&(!!a.$$success[t]||null),o(t,s),a.$$parentForm.$setValidity(t,s,a)}function e(t,n,e){a[t]||(a[t]={}),l(a[t],n,e)}function r(t,n,e){a[t]&&c(a[t],n,e),Tr(a[t])&&(a[t]=void 0)}function i(t,n){n&&!s[t]?(f.addClass(u,t),s[t]=!0):!n&&s[t]&&(f.removeClass(u,t),s[t]=!1)}function o(t,n){t=t?"-"+ut(t,"-"):"",i(ba+t,n===!0),i(xa+t,n===!1)}var a=t.ctrl,u=t.$element,s={},l=t.set,c=t.unset,f=t.$animate;s[xa]=!(s[ba]=u.hasClass(ba)),a.$setValidity=n}function Tr(t){if(t)for(var n in t)if(t.hasOwnProperty(n))return!1;return!0}var Lr=/^\/(.+)\/([a-z]*)$/,Nr="validity",jr=Object.prototype.hasOwnProperty,Rr=function(t){return x(t)?t.toLowerCase():t},Dr=function(t){return x(t)?t.toUpperCase():t},Fr=function(t){return x(t)?t.replace(/[A-Z]/g,function(t){return String.fromCharCode(32|t.charCodeAt(0))}):t},Ir=function(t){return x(t)?t.replace(/[a-z]/g,function(t){return String.fromCharCode(t.charCodeAt(0)&-33)}):t};"i"!=="I".toLowerCase()&&(Rr=Fr,Dr=Ir);var Vr,qr,zr,Br,Ur=[].slice,Wr=[].splice,Hr=[].push,Yr=Object.prototype.toString,Gr=Object.getPrototypeOf,Zr=n("ng"),Xr=t.angular||(t.angular={}),Jr=0;Vr=t.document.documentMode,p.$inject=[],d.$inject=[];var Kr=Array.isArray,Qr=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,ti=function(t){return x(t)?t.trim():t},ni=function(t){return t.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},ei=function(){function n(){try{return new Function(""),!1}catch(t){return!0}}if(!y(ei.rules)){var e=t.document.querySelector("[ng-csp]")||t.document.querySelector("[data-ng-csp]");if(e){var r=e.getAttribute("ng-csp")||e.getAttribute("data-ng-csp");ei.rules={noUnsafeEval:!r||r.indexOf("no-unsafe-eval")!==-1,noInlineStyle:!r||r.indexOf("no-inline-style")!==-1}}else ei.rules={noUnsafeEval:n(),noInlineStyle:!1}}return ei.rules},ri=function(){if(y(ri.name_))return ri.name_;var n,e,r,i,o=oi.length;for(e=0;e<o;++e)if(r=oi[e],n=t.document.querySelector("["+r.replace(":","\\:")+"jq]")){i=n.getAttribute(r+"jq");break}return ri.name_=i},ii=/:/g,oi=["ng-","data-ng-","ng:","x-ng-"],ai=/[A-Z]/g,ui=!1,si=1,li=2,ci=3,fi=8,hi=9,pi=11,di={full:"1.5.9-build.4970+sha.1660ddd",major:1,minor:5,dot:9,codeName:"snapshot"};Pt.expando="ng339";var vi=Pt.cache={},gi=1;Pt._data=function(t){return this.cache[t[this.expando]]||{}};var mi=/([\:\-\_]+(.))/g,yi=/^moz([A-Z])/,$i={mouseleave:"mouseout",mouseenter:"mouseover"},bi=n("jqLite"),xi=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,wi=/<|&#?\w+;/,Ci=/<([\w:-]+)/,Si=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Mi={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Mi.optgroup=Mi.option,Mi.tbody=Mi.tfoot=Mi.colgroup=Mi.caption=Mi.thead,Mi.th=Mi.td;var _i=t.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))},ki=Pt.prototype={ready:function(n){function e(){r||(r=!0,n())}var r=!1;"complete"===t.document.readyState?t.setTimeout(e):(this.on("DOMContentLoaded",e),Pt(t).on("load",e))},toString:function(){var t=[];return r(this,function(n){t.push(""+n)}),"["+t.join(", ")+"]"},eq:function(t){return qr(t>=0?this[t]:this[this.length+t])},length:0,push:Hr,sort:[].sort,splice:[].splice},Ai={};r("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(t){Ai[Rr(t)]=t});var Ei={};r("input,select,option,textarea,button,form,details".split(","),function(t){Ei[t]=!0});var Pi={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Rt,removeData:Nt,hasData:Mt,cleanData:_t},function(t,n){Pt[n]=t}),r({data:Rt,inheritedData:zt,scope:function(t){return qr.data(t,"$scope")||zt(t.parentNode||t,["$isolateScope","$scope"])},isolateScope:function(t){return qr.data(t,"$isolateScope")||qr.data(t,"$isolateScopeNoTemplate")},controller:qt,injector:function(t){return zt(t,"$injector")},removeAttr:function(t,n){t.removeAttribute(n)},hasClass:Dt,css:function(t,n,e){return n=wt(n),y(e)?void(t.style[n]=e):t.style[n]},attr:function(t,n,e){var r=t.nodeType;if(r!==ci&&r!==li&&r!==fi){var i=Rr(n);if(Ai[i]){if(!y(e))return t[n]||(t.attributes.getNamedItem(n)||p).specified?i:void 0;e?(t[n]=!0,t.setAttribute(n,i)):(t[n]=!1,t.removeAttribute(i))}else if(y(e))t.setAttribute(n,e);else if(t.getAttribute){var o=t.getAttribute(n,2);return null===o?void 0:o}}},prop:function(t,n,e){return y(e)?void(t[n]=e):t[n]},text:function(){function t(t,n){if(m(n)){var e=t.nodeType;return e===si||e===ci?t.textContent:""}t.textContent=n}return t.$dv="",t}(),val:function(t,n){if(m(n)){if(t.multiple&&"select"===D(t)){var e=[];return r(t.options,function(t){t.selected&&e.push(t.value||t.text)}),0===e.length?null:e}return t.value}t.value=n},html:function(t,n){return m(n)?t.innerHTML:(Tt(t,!0),void(t.innerHTML=n))},empty:Bt},function(t,n){Pt.prototype[n]=function(n,e){var r,i,o=this.length;if(t!==Bt&&m(2===t.length&&t!==Dt&&t!==qt?n:e)){if($(n)){for(r=0;r<o;r++)if(t===Rt)t(this[r],n);else for(i in n)t(this[r],i,n[i]);return this}for(var a=t.$dv,u=m(a)?Math.min(o,1):o,s=0;s<u;s++){var l=t(this[s],n,e);a=a?a+l:l}return a}for(r=0;r<o;r++)t(this[r],n,e);return this}}),r({removeData:Nt,on:function(t,n,e,r){if(y(r))throw bi("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");if(St(t)){var i=jt(t,!0),o=i.events,a=i.handle;a||(a=i.handle=Gt(t,o));for(var u=n.indexOf(" ")>=0?n.split(" "):[n],s=u.length,l=function(n,r,i){var u=o[n];u||(u=o[n]=[],u.specialHandlerWrapper=r,"$destroy"===n||i||t.addEventListener(n,a)),u.push(e)};s--;)n=u[s],$i[n]?(l($i[n],Xt),l(n,void 0,!0)):l(n)}},off:Lt,one:function(t,n,e){t=qr(t),t.on(n,function r(){t.off(n,e),t.off(n,r)}),t.on(n,e)},replaceWith:function(t,n){var e,i=t.parentNode;Tt(t),r(new Pt(n),function(n){e?i.insertBefore(n,e.nextSibling):i.replaceChild(n,t),e=n})},children:function(t){var n=[];return r(t.childNodes,function(t){t.nodeType===si&&n.push(t)}),n},contents:function(t){return t.contentDocument||t.childNodes||[]},append:function(t,n){var e=t.nodeType;if(e===si||e===pi){n=new Pt(n);for(var r=0,i=n.length;r<i;r++){var o=n[r];t.appendChild(o)}}},prepend:function(t,n){if(t.nodeType===si){var e=t.firstChild;r(new Pt(n),function(n){t.insertBefore(n,e)})}},wrap:function(t,n){Et(t,qr(n).eq(0).clone()[0])},remove:Ut,detach:function(t){Ut(t,!0)},after:function(t,n){var e=t,r=t.parentNode;n=new Pt(n);for(var i=0,o=n.length;i<o;i++){var a=n[i];r.insertBefore(a,e.nextSibling),e=a}},addClass:It,removeClass:Ft,toggleClass:function(t,n,e){n&&r(n.split(" "),function(n){var r=e;m(r)&&(r=!Dt(t,n)),(r?It:Ft)(t,n)})},parent:function(t){var n=t.parentNode;return n&&n.nodeType!==pi?n:null},next:function(t){return t.nextElementSibling},find:function(t,n){return t.getElementsByTagName?t.getElementsByTagName(n):[]},clone:Ot,triggerHandler:function(t,n,e){var i,o,a,u=n.type||n,s=jt(t),c=s&&s.events,f=c&&c[u];f&&(i={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:p,type:u,target:t},n.type&&(i=l(i,n)),o=mt(f),a=e?[i].concat(e):[i],r(o,function(n){i.isImmediatePropagationStopped()||n.apply(t,a)}))}},function(t,n){Pt.prototype[n]=function(n,e,r){for(var i,o=0,a=this.length;o<a;o++)m(i)?(i=t(this[o],n,e,r),y(i)&&(i=qr(i))):Vt(i,t(this[o],n,e,r));return y(i)?i:this},Pt.prototype.bind=Pt.prototype.on,Pt.prototype.unbind=Pt.prototype.off}),Qt.prototype={put:function(t,n){this[Kt(t,this.nextUid)]=n},get:function(t){return this[Kt(t,this.nextUid)]},remove:function(t){var n=this[t=Kt(t,this.nextUid)];return delete this[t],n}};var Oi=[function(){this.$get=[function(){return Qt}]}],Ti=/^([^\(]+?)=>/,Li=/^[^\(]*\(\s*([^\)]*)\)/m,Ni=/,/,ji=/^\s*(_?)(\S+?)\1\s*$/,Ri=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Di=n("$injector");on.$$annotate=rn;var Fi=n("$animate"),Ii=1,Vi="ng-animate",qi=function(){this.$get=p},zi=function(){var t=new Qt,n=[];this.$get=["$$AnimateRunner","$rootScope",function(e,i){function o(t,n,e){var i=!1;return n&&(n=x(n)?n.split(" "):Kr(n)?n:[],r(n,function(n){n&&(i=!0,t[n]=e)})),i}function a(){r(n,function(n){var e=t.get(n);if(e){var i=ln(n.attr("class")),o="",a="";r(e,function(t,n){var e=!!i[n];t!==e&&(t?o+=(o.length?" ":"")+n:a+=(a.length?" ":"")+n)}),r(n,function(t){o&&It(t,o),a&&Ft(t,a)}),t.remove(n)}}),n.length=0}function u(e,r,u){var s=t.get(e)||{},l=o(s,r,!0),c=o(s,u,!1);(l||c)&&(t.put(e,s),n.push(e),1===n.length&&i.$$postDigest(a))}return{enabled:p,on:p,off:p,pin:p,push:function(t,n,r,i){i&&i(),r=r||{},r.from&&t.css(r.from),r.to&&t.css(r.to),(r.addClass||r.removeClass)&&u(t,r.addClass,r.removeClass);var o=new e;return o.complete(),o}}}]},Bi=["$provide",function(t){var n=this;this.$$registeredAnimations=Object.create(null),this.register=function(e,r){if(e&&"."!==e.charAt(0))throw Fi("notcsel","Expecting class selector starting with '.' got '{0}'.",e);var i=e+"-animation";n.$$registeredAnimations[e.substr(1)]=i,t.factory(i,r)},this.classNameFilter=function(t){if(1===arguments.length&&(this.$$classNameFilter=t instanceof RegExp?t:null,this.$$classNameFilter)){var n=new RegExp("(\\s+|\\/)"+Vi+"(\\s+|\\/)");if(n.test(this.$$classNameFilter.toString()))throw Fi("nongcls",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.',Vi)}return this.$$classNameFilter},this.$get=["$$animateQueue",function(t){function n(t,n,e){if(e){var r=sn(e);!r||r.parentNode||r.previousElementSibling||(e=null)}e?e.after(t):n.prepend(t)}return{on:t.on,off:t.off,pin:t.pin,enabled:t.enabled,cancel:function(t){t.end&&t.end()},enter:function(e,r,i,o){return r=r&&qr(r),i=i&&qr(i),r=r||i.parent(),n(e,r,i),t.push(e,"enter",cn(o))},move:function(e,r,i,o){return r=r&&qr(r),i=i&&qr(i),r=r||i.parent(),n(e,r,i),t.push(e,"move",cn(o))},leave:function(n,e){return t.push(n,"leave",cn(e),function(){n.remove()})},addClass:function(n,e,r){return r=cn(r),r.addClass=un(r.addclass,e),t.push(n,"addClass",r)},removeClass:function(n,e,r){return r=cn(r),r.removeClass=un(r.removeClass,e),t.push(n,"removeClass",r)},setClass:function(n,e,r,i){return i=cn(i),i.addClass=un(i.addClass,e),i.removeClass=un(i.removeClass,r),t.push(n,"setClass",i)},animate:function(n,e,r,i,o){return o=cn(o),o.from=o.from?l(o.from,e):e,o.to=o.to?l(o.to,r):r,i=i||"ng-inline-animate",o.tempClasses=un(o.tempClasses,i),t.push(n,"animate",o)}}}]}],Ui=function(){this.$get=["$$rAF",function(t){function n(n){e.push(n),e.length>1||t(function(){for(var t=0;t<e.length;t++)e[t]();e=[]})}var e=[];return function(){var t=!1;return n(function(){t=!0}),function(e){t?e():n(e)}}}]},Wi=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$$isDocumentHidden","$timeout",function(t,n,e,i,o){function a(t){this.setHost(t);var n=e(),r=function(t){o(t,0,!1)};this._doneCallbacks=[],this._tick=function(t){i()?r(t):n(t)},this._state=0}var u=0,s=1,l=2;return a.chain=function(t,n){function e(){return r===t.length?void n(!0):void t[r](function(t){return t===!1?void n(!1):(r++,void e())})}var r=0;e()},a.all=function(t,n){function e(e){o=o&&e,++i===t.length&&n(o)}var i=0,o=!0;r(t,function(t){t.done(e)})},a.prototype={setHost:function(t){this.host=t||{}},done:function(t){this._state===l?t():this._doneCallbacks.push(t)},progress:p,getPromise:function(){if(!this.promise){var n=this;this.promise=t(function(t,e){n.done(function(n){n===!1?e():t()})})}return this.promise},then:function(t,n){return this.getPromise().then(t,n)},"catch":function(t){return this.getPromise()["catch"](t)},"finally":function(t){return this.getPromise()["finally"](t)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end(),this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel(),this._resolve(!1)},complete:function(t){var n=this;n._state===u&&(n._state=s,n._tick(function(){n._resolve(t)}))},_resolve:function(t){this._state!==l&&(r(this._doneCallbacks,function(n){n(t)}),this._doneCallbacks.length=0,this._state=l)}},a}]},Hi=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(t,n,e){return function(n,r){function i(){return t(function(){o(),u||s.complete(),u=!0}),s}function o(){a.addClass&&(n.addClass(a.addClass),a.addClass=null),a.removeClass&&(n.removeClass(a.removeClass),a.removeClass=null),a.to&&(n.css(a.to),a.to=null)}var a=r||{};a.$$prepared||(a=I(a)),a.cleanupStyles&&(a.from=a.to=null),a.from&&(n.css(a.from),a.from=null);var u,s=new e;return{start:i,end:i}}}]},Yi=n("$compile"),Gi=new vn;gn.$inject=["$provide","$$sanitizeUriProvider"],mn.prototype.isFirstChange=function(){return this.previousValue===Gi};var Zi=/^((?:x|data)[\:\-_])/i,Xi=n("$controller"),Ji=/^(\S+)(\s+as\s+([\w$]+))?$/,Ki=function(){this.$get=["$document",function(t){return function(n){return n?!n.nodeType&&n instanceof qr&&(n=n[0]):n=t[0].body,n.offsetWidth+1}}]},Qi="application/json",to={"Content-Type":Qi+";charset=utf-8"},no=/^\[|^\{(?!\{)/,eo={"[":/]$/,"{":/}$/},ro=/^\)\]\}',?\n/,io=n("$http"),oo=function(t){return function(){throw io("legacy","The method `{0}` on the promise returned from `$http` has been disabled.",t)}},ao=Xr.$interpolateMinErr=n("$interpolate");ao.throwNoconcat=function(t){throw ao("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",t)},ao.interr=function(t,n){return ao("interr","Can't interpolate: {0}\n{1}",t,n.toString())};var uo=function(){this.$get=["$window",function(t){function n(t){var n=function(t){n.data=t,n.called=!0};return n.id=t,n}var e=t.angular.callbacks,r={};return{createCallback:function(t){var i="_"+(e.$$counter++).toString(36),o="angular.callbacks."+i,a=n(i);return r[o]=e[i]=a,o},wasCalled:function(t){return r[t].called},getResponse:function(t){return r[t].data},removeCallback:function(t){var n=r[t];delete e[n.id],delete r[t]}}}]},so=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,lo={http:80,https:443,ftp:21},co=n("$location"),fo={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:Qn("$$absUrl"),url:function(t){if(m(t))return this.$$url;var n=so.exec(t);return(n[1]||""===t)&&this.path(decodeURIComponent(n[1])),(n[2]||n[1]||""===t)&&this.search(n[3]||""),this.hash(n[5]||""),this},protocol:Qn("$$protocol"),host:Qn("$$host"),port:Qn("$$port"),path:te("$$path",function(t){return t=null!==t?t.toString():"","/"===t.charAt(0)?t:"/"+t}),search:function(t,n){switch(arguments.length){case 0:return this.$$search;case 1:if(x(t)||w(t))t=t.toString(),this.$$search=K(t);else{if(!$(t))throw co("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");t=I(t,{}),r(t,function(n,e){null==n&&delete t[e]}),this.$$search=t}break;default:m(n)||null===n?delete this.$$search[t]:this.$$search[t]=n}return this.$$compose(),this},hash:te("$$hash",function(t){return null!==t?t.toString():""}),replace:function(){return this.$$replace=!0,this}};r([Kn,Jn,Xn],function(t){t.prototype=Object.create(fo),t.prototype.state=function(n){if(!arguments.length)return this.$$state;if(t!==Xn||!this.$$html5)throw co("nostate","History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API");return this.$$state=m(n)?null:n,this}});var ho=n("$parse"),po=Function.prototype.call,vo=Function.prototype.apply,go=Function.prototype.bind,mo=dt();r("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(t){mo[t]=!0});var yo={n:"\n",f:"\f",r:"\r",t:"\t",v:"\x0B","'":"'",'"':'"'},$o=function(t){this.options=t};$o.prototype={constructor:$o,lex:function(t){for(this.text=t,this.index=0,this.tokens=[];this.index<this.text.length;){var n=this.text.charAt(this.index);if('"'===n||"'"===n)this.readString(n);else if(this.isNumber(n)||"."===n&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(n,"(){}[].,;:?"))this.tokens.push({index:this.index,text:n}),this.index++;else if(this.isWhitespace(n))this.index++;else{var e=n+this.peek(),r=e+this.peek(2),i=mo[n],o=mo[e],a=mo[r];if(i||o||a){var u=a?r:o?e:n;this.tokens.push({index:this.index,text:u,operator:!0}),this.index+=u.length}else this.throwError("Unexpected next character ",this.index,this.index+1)}}return this.tokens},is:function(t,n){return n.indexOf(t)!==-1},peek:function(t){var n=t||1;return this.index+n<this.text.length&&this.text.charAt(this.index+n)},isNumber:function(t){return"0"<=t&&t<="9"&&"string"==typeof t},isWhitespace:function(t){return" "===t||"\r"===t||"\t"===t||"\n"===t||"\x0B"===t||" "===t},isIdentifierStart:function(t){return this.options.isIdentifierStart?this.options.isIdentifierStart(t,this.codePointAt(t)):this.isValidIdentifierStart(t)},isValidIdentifierStart:function(t){return"a"<=t&&t<="z"||"A"<=t&&t<="Z"||"_"===t||"$"===t},isIdentifierContinue:function(t){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(t,this.codePointAt(t)):this.isValidIdentifierContinue(t)},isValidIdentifierContinue:function(t,n){return this.isValidIdentifierStart(t,n)||this.isNumber(t)},codePointAt:function(t){return 1===t.length?t.charCodeAt(0):(t.charCodeAt(0)<<10)+t.charCodeAt(1)-56613888},peekMultichar:function(){var t=this.text.charAt(this.index),n=this.peek();if(!n)return t;var e=t.charCodeAt(0),r=n.charCodeAt(0);return e>=55296&&e<=56319&&r>=56320&&r<=57343?t+n:t},isExpOperator:function(t){return"-"===t||"+"===t||this.isNumber(t)},throwError:function(t,n,e){e=e||this.index;var r=y(n)?"s "+n+"-"+this.index+" ["+this.text.substring(n,e)+"]":" "+e;throw ho("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",t,r,this.text)},readNumber:function(){for(var t="",n=this.index;this.index<this.text.length;){var e=Rr(this.text.charAt(this.index));if("."===e||this.isNumber(e))t+=e;else{var r=this.peek();if("e"===e&&this.isExpOperator(r))t+=e;else if(this.isExpOperator(e)&&r&&this.isNumber(r)&&"e"===t.charAt(t.length-1))t+=e;else{if(!this.isExpOperator(e)||r&&this.isNumber(r)||"e"!==t.charAt(t.length-1))break;this.throwError("Invalid exponent")}}this.index++}this.tokens.push({index:n,text:t,constant:!0,value:Number(t)})},readIdent:function(){var t=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var n=this.peekMultichar();if(!this.isIdentifierContinue(n))break;this.index+=n.length}this.tokens.push({index:t,text:this.text.slice(t,this.index),identifier:!0})},readString:function(t){var n=this.index;this.index++;for(var e="",r=t,i=!1;this.index<this.text.length;){var o=this.text.charAt(this.index);if(r+=o,i){if("u"===o){var a=this.text.substring(this.index+1,this.index+5);a.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+a+"]"),this.index+=4,e+=String.fromCharCode(parseInt(a,16))}else{var u=yo[o];e+=u||o}i=!1}else if("\\"===o)i=!0;else{if(o===t)return this.index++,void this.tokens.push({index:n,text:r,constant:!0,value:e});e+=o}this.index++}this.throwError("Unterminated quote",n)}};var bo=function(t,n){this.lexer=t,this.options=n};bo.Program="Program",bo.ExpressionStatement="ExpressionStatement",bo.AssignmentExpression="AssignmentExpression",bo.ConditionalExpression="ConditionalExpression",bo.LogicalExpression="LogicalExpression",bo.BinaryExpression="BinaryExpression",bo.UnaryExpression="UnaryExpression",bo.CallExpression="CallExpression",bo.MemberExpression="MemberExpression",bo.Identifier="Identifier",bo.Literal="Literal",bo.ArrayExpression="ArrayExpression",bo.Property="Property",bo.ObjectExpression="ObjectExpression",bo.ThisExpression="ThisExpression",bo.LocalsExpression="LocalsExpression",bo.NGValueParameter="NGValueParameter",bo.prototype={ast:function(t){this.text=t,this.tokens=this.lexer.lex(t);var n=this.program();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),n},program:function(){for(var t=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&t.push(this.expressionStatement()),!this.expect(";"))return{type:bo.Program,body:t}},expressionStatement:function(){return{type:bo.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var t=this.expression();this.expect("|");)t=this.filter(t);return t},expression:function(){return this.assignment()},assignment:function(){var t=this.ternary();return this.expect("=")&&(t={type:bo.AssignmentExpression,left:t,right:this.assignment(),operator:"="}),t},ternary:function(){var t,n,e=this.logicalOR();return this.expect("?")&&(t=this.expression(),this.consume(":"))?(n=this.expression(),{type:bo.ConditionalExpression,test:e,alternate:t,consequent:n}):e},logicalOR:function(){for(var t=this.logicalAND();this.expect("||");)t={type:bo.LogicalExpression,operator:"||",left:t,right:this.logicalAND()};return t},logicalAND:function(){for(var t=this.equality();this.expect("&&");)t={type:bo.LogicalExpression,operator:"&&",left:t,right:this.equality()};return t},equality:function(){for(var t,n=this.relational();t=this.expect("==","!=","===","!==");)n={type:bo.BinaryExpression,operator:t.text,left:n,right:this.relational()};return n},relational:function(){for(var t,n=this.additive();t=this.expect("<",">","<=",">=");)n={type:bo.BinaryExpression,operator:t.text,left:n,right:this.additive()};return n},additive:function(){for(var t,n=this.multiplicative();t=this.expect("+","-");)n={type:bo.BinaryExpression,operator:t.text,left:n,right:this.multiplicative()};return n},multiplicative:function(){for(var t,n=this.unary();t=this.expect("*","/","%");)n={type:bo.BinaryExpression,operator:t.text,left:n,right:this.unary()};return n},unary:function(){var t;return(t=this.expect("+","-","!"))?{type:bo.UnaryExpression,operator:t.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var t;this.expect("(")?(t=this.filterChain(),this.consume(")")):this.expect("[")?t=this.arrayDeclaration():this.expect("{")?t=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?t=I(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?t={type:bo.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?t=this.identifier():this.peek().constant?t=this.constant():this.throwError("not a primary expression",this.peek());for(var n;n=this.expect("(","[",".");)"("===n.text?(t={type:bo.CallExpression,callee:t,arguments:this.parseArguments()},this.consume(")")):"["===n.text?(t={type:bo.MemberExpression,object:t,property:this.expression(),computed:!0},this.consume("]")):"."===n.text?t={type:bo.MemberExpression,object:t,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return t},filter:function(t){for(var n=[t],e={type:bo.CallExpression,callee:this.identifier(),arguments:n,filter:!0};this.expect(":");)n.push(this.expression());return e},parseArguments:function(){var t=[];if(")"!==this.peekToken().text)do t.push(this.filterChain());while(this.expect(","));return t},identifier:function(){var t=this.consume();return t.identifier||this.throwError("is not a valid identifier",t),{type:bo.Identifier,name:t.text}},constant:function(){return{type:bo.Literal,value:this.consume().value}},arrayDeclaration:function(){var t=[];if("]"!==this.peekToken().text)do{if(this.peek("]"))break;t.push(this.expression())}while(this.expect(","));return this.consume("]"),{type:bo.ArrayExpression,elements:t}},object:function(){var t,n=[];if("}"!==this.peekToken().text)do{if(this.peek("}"))break;t={type:bo.Property,kind:"init"},this.peek().constant?(t.key=this.constant(),t.computed=!1,this.consume(":"),t.value=this.expression()):this.peek().identifier?(t.key=this.identifier(),t.computed=!1,this.peek(":")?(this.consume(":"),t.value=this.expression()):t.value=t.key):this.peek("[")?(this.consume("["),t.key=this.expression(),this.consume("]"),t.computed=!0,this.consume(":"),t.value=this.expression()):this.throwError("invalid key",this.peek()),n.push(t)}while(this.expect(","));return this.consume("}"),{type:bo.ObjectExpression,properties:n}},throwError:function(t,n){throw ho("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",n.text,t,n.index+1,this.text,this.text.substring(n.index))},consume:function(t){if(0===this.tokens.length)throw ho("ueoe","Unexpected end of expression: {0}",this.text);var n=this.expect(t);return n||this.throwError("is unexpected, expecting ["+t+"]",this.peek()),n},peekToken:function(){if(0===this.tokens.length)throw ho("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(t,n,e,r){return this.peekAhead(0,t,n,e,r)},peekAhead:function(t,n,e,r,i){if(this.tokens.length>t){var o=this.tokens[t],a=o.text;if(a===n||a===e||a===r||a===i||!n&&!e&&!r&&!i)return o}return!1},expect:function(t,n,e,r){var i=this.peek(t,n,e,r);return!!i&&(this.tokens.shift(),i)},selfReferential:{"this":{type:bo.ThisExpression},$locals:{type:bo.LocalsExpression}}},me.prototype={compile:function(t,n){var e=this,i=this.astBuilder.ast(t);this.state={nextId:0,filters:{},expensiveChecks:n,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},fe(i,e.$filter);var o,a="";if(this.stage="assign",o=de(i)){this.state.computing="assign";var u=this.nextId();this.recurse(o,u),this.return_(u),a="fn.assign="+this.generateFunction("assign","s,v,l")}var s=he(i.body);e.stage="inputs",r(s,function(t,n){var r="fn"+n;e.state[r]={vars:[],body:[],own:{}},e.state.computing=r;var i=e.nextId();e.recurse(t,i),e.return_(i),e.state.inputs.push(r),t.watchId=n}),this.state.computing="fn",this.stage="main",this.recurse(i);var l='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+a+this.watchFns()+"return fn;",c=new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",l)(this.$filter,re,oe,ae,ie,ue,se,le,t);
-return this.state=this.stage=void 0,c.literal=ve(i),c.constant=ge(i),c},USE:"use",STRICT:"strict",watchFns:function(){var t=[],n=this.state.inputs,e=this;return r(n,function(n){t.push("var "+n+"="+e.generateFunction(n,"s"))}),n.length&&t.push("fn.inputs=["+n.join(",")+"];"),t.join("")},generateFunction:function(t,n){return"function("+n+"){"+this.varsPrefix(t)+this.body(t)+"};"},filterPrefix:function(){var t=[],n=this;return r(this.state.filters,function(e,r){t.push(e+"=$filter("+n.escape(r)+")")}),t.length?"var "+t.join(",")+";":""},varsPrefix:function(t){return this.state[t].vars.length?"var "+this.state[t].vars.join(",")+";":""},body:function(t){return this.state[t].body.join("")},recurse:function(t,n,e,i,o,a){var u,s,l,c,f,h=this;if(i=i||p,!a&&y(t.watchId))return n=n||this.nextId(),void this.if_("i",this.lazyAssign(n,this.computedMember("i",t.watchId)),this.lazyRecurse(t,n,e,i,o,!0));switch(t.type){case bo.Program:r(t.body,function(n,e){h.recurse(n.expression,void 0,void 0,function(t){s=t}),e!==t.body.length-1?h.current().body.push(s,";"):h.return_(s)});break;case bo.Literal:c=this.escape(t.value),this.assign(n,c),i(n||c);break;case bo.UnaryExpression:this.recurse(t.argument,void 0,void 0,function(t){s=t}),c=t.operator+"("+this.ifDefined(s,0)+")",this.assign(n,c),i(c);break;case bo.BinaryExpression:this.recurse(t.left,void 0,void 0,function(t){u=t}),this.recurse(t.right,void 0,void 0,function(t){s=t}),c="+"===t.operator?this.plus(u,s):"-"===t.operator?this.ifDefined(u,0)+t.operator+this.ifDefined(s,0):"("+u+")"+t.operator+"("+s+")",this.assign(n,c),i(c);break;case bo.LogicalExpression:n=n||this.nextId(),h.recurse(t.left,n),h.if_("&&"===t.operator?n:h.not(n),h.lazyRecurse(t.right,n)),i(n);break;case bo.ConditionalExpression:n=n||this.nextId(),h.recurse(t.test,n),h.if_(n,h.lazyRecurse(t.alternate,n),h.lazyRecurse(t.consequent,n)),i(n);break;case bo.Identifier:n=n||this.nextId(),e&&(e.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",t.name)+"?l:s"),e.computed=!1,e.name=t.name),re(t.name),h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",t.name)),function(){h.if_("inputs"===h.stage||"s",function(){o&&1!==o&&h.if_(h.not(h.nonComputedMember("s",t.name)),h.lazyAssign(h.nonComputedMember("s",t.name),"{}")),h.assign(n,h.nonComputedMember("s",t.name))})},n&&h.lazyAssign(n,h.nonComputedMember("l",t.name))),(h.state.expensiveChecks||$e(t.name))&&h.addEnsureSafeObject(n),i(n);break;case bo.MemberExpression:u=e&&(e.context=this.nextId())||this.nextId(),n=n||this.nextId(),h.recurse(t.object,u,void 0,function(){h.if_(h.notNull(u),function(){o&&1!==o&&h.addEnsureSafeAssignContext(u),t.computed?(s=h.nextId(),h.recurse(t.property,s),h.getStringValue(s),h.addEnsureSafeMemberName(s),o&&1!==o&&h.if_(h.not(h.computedMember(u,s)),h.lazyAssign(h.computedMember(u,s),"{}")),c=h.ensureSafeObject(h.computedMember(u,s)),h.assign(n,c),e&&(e.computed=!0,e.name=s)):(re(t.property.name),o&&1!==o&&h.if_(h.not(h.nonComputedMember(u,t.property.name)),h.lazyAssign(h.nonComputedMember(u,t.property.name),"{}")),c=h.nonComputedMember(u,t.property.name),(h.state.expensiveChecks||$e(t.property.name))&&(c=h.ensureSafeObject(c)),h.assign(n,c),e&&(e.computed=!1,e.name=t.property.name))},function(){h.assign(n,"undefined")}),i(n)},!!o);break;case bo.CallExpression:n=n||this.nextId(),t.filter?(s=h.filter(t.callee.name),l=[],r(t.arguments,function(t){var n=h.nextId();h.recurse(t,n),l.push(n)}),c=s+"("+l.join(",")+")",h.assign(n,c),i(n)):(s=h.nextId(),u={},l=[],h.recurse(t.callee,s,u,function(){h.if_(h.notNull(s),function(){h.addEnsureSafeFunction(s),r(t.arguments,function(n){h.recurse(n,t.constant?void 0:h.nextId(),void 0,function(t){l.push(h.ensureSafeObject(t))})}),u.name?(h.state.expensiveChecks||h.addEnsureSafeObject(u.context),c=h.member(u.context,u.name,u.computed)+"("+l.join(",")+")"):c=s+"("+l.join(",")+")",c=h.ensureSafeObject(c),h.assign(n,c)},function(){h.assign(n,"undefined")}),i(n)}));break;case bo.AssignmentExpression:if(s=this.nextId(),u={},!pe(t.left))throw ho("lval","Trying to assign a value to a non l-value");this.recurse(t.left,void 0,u,function(){h.if_(h.notNull(u.context),function(){h.recurse(t.right,s),h.addEnsureSafeObject(h.member(u.context,u.name,u.computed)),h.addEnsureSafeAssignContext(u.context),c=h.member(u.context,u.name,u.computed)+t.operator+s,h.assign(n,c),i(n||c)})},1);break;case bo.ArrayExpression:l=[],r(t.elements,function(n){h.recurse(n,t.constant?void 0:h.nextId(),void 0,function(t){l.push(t)})}),c="["+l.join(",")+"]",this.assign(n,c),i(n||c);break;case bo.ObjectExpression:l=[],f=!1,r(t.properties,function(t){t.computed&&(f=!0)}),f?(n=n||this.nextId(),this.assign(n,"{}"),r(t.properties,function(t){t.computed?(u=h.nextId(),h.recurse(t.key,u)):u=t.key.type===bo.Identifier?t.key.name:""+t.key.value,s=h.nextId(),h.recurse(t.value,s),h.assign(h.member(n,u,t.computed),s)})):(r(t.properties,function(n){h.recurse(n.value,t.constant?void 0:h.nextId(),void 0,function(t){l.push(h.escape(n.key.type===bo.Identifier?n.key.name:""+n.key.value)+":"+t)})}),c="{"+l.join(",")+"}",this.assign(n,c)),i(n||c);break;case bo.ThisExpression:this.assign(n,"s"),i(n||"s");break;case bo.LocalsExpression:this.assign(n,"l"),i(n||"l");break;case bo.NGValueParameter:this.assign(n,"v"),i(n||"v")}},getHasOwnProperty:function(t,n){var e=t+"."+n,r=this.current().own;return r.hasOwnProperty(e)||(r[e]=this.nextId(!1,t+"&&("+this.escape(n)+" in "+t+")")),r[e]},assign:function(t,n){if(t)return this.current().body.push(t,"=",n,";"),t},filter:function(t){return this.state.filters.hasOwnProperty(t)||(this.state.filters[t]=this.nextId(!0)),this.state.filters[t]},ifDefined:function(t,n){return"ifDefined("+t+","+this.escape(n)+")"},plus:function(t,n){return"plus("+t+","+n+")"},return_:function(t){this.current().body.push("return ",t,";")},if_:function(t,n,e){if(t===!0)n();else{var r=this.current().body;r.push("if(",t,"){"),n(),r.push("}"),e&&(r.push("else{"),e(),r.push("}"))}},not:function(t){return"!("+t+")"},notNull:function(t){return t+"!=null"},nonComputedMember:function(t,n){var e=/^[$_a-zA-Z][$_a-zA-Z0-9]*$/,r=/[^$_a-zA-Z0-9]/g;return e.test(n)?t+"."+n:t+'["'+n.replace(r,this.stringEscapeFn)+'"]'},computedMember:function(t,n){return t+"["+n+"]"},member:function(t,n,e){return e?this.computedMember(t,n):this.nonComputedMember(t,n)},addEnsureSafeObject:function(t){this.current().body.push(this.ensureSafeObject(t),";")},addEnsureSafeMemberName:function(t){this.current().body.push(this.ensureSafeMemberName(t),";")},addEnsureSafeFunction:function(t){this.current().body.push(this.ensureSafeFunction(t),";")},addEnsureSafeAssignContext:function(t){this.current().body.push(this.ensureSafeAssignContext(t),";")},ensureSafeObject:function(t){return"ensureSafeObject("+t+",text)"},ensureSafeMemberName:function(t){return"ensureSafeMemberName("+t+",text)"},ensureSafeFunction:function(t){return"ensureSafeFunction("+t+",text)"},getStringValue:function(t){this.assign(t,"getStringValue("+t+")")},ensureSafeAssignContext:function(t){return"ensureSafeAssignContext("+t+",text)"},lazyRecurse:function(t,n,e,r,i,o){var a=this;return function(){a.recurse(t,n,e,r,i,o)}},lazyAssign:function(t,n){var e=this;return function(){e.assign(t,n)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)},escape:function(t){if(x(t))return"'"+t.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(w(t))return t.toString();if(t===!0)return"true";if(t===!1)return"false";if(null===t)return"null";if("undefined"==typeof t)return"undefined";throw ho("esc","IMPOSSIBLE")},nextId:function(t,n){var e="v"+this.state.nextId++;return t||this.current().vars.push(e+(n?"="+n:"")),e},current:function(){return this.state[this.state.computing]}},ye.prototype={compile:function(t,n){var e=this,i=this.astBuilder.ast(t);this.expression=t,this.expensiveChecks=n,fe(i,e.$filter);var o,a;(o=de(i))&&(a=this.recurse(o));var u,s=he(i.body);s&&(u=[],r(s,function(t,n){var r=e.recurse(t);t.input=r,u.push(r),t.watchId=n}));var l=[];r(i.body,function(t){l.push(e.recurse(t.expression))});var c=0===i.body.length?p:1===i.body.length?l[0]:function(t,n){var e;return r(l,function(r){e=r(t,n)}),e};return a&&(c.assign=function(t,n,e){return a(t,e,n)}),u&&(c.inputs=u),c.literal=ve(i),c.constant=ge(i),c},recurse:function(t,n,e){var i,o,a,u=this;if(t.input)return this.inputs(t.input,t.watchId);switch(t.type){case bo.Literal:return this.value(t.value,n);case bo.UnaryExpression:return o=this.recurse(t.argument),this["unary"+t.operator](o,n);case bo.BinaryExpression:return i=this.recurse(t.left),o=this.recurse(t.right),this["binary"+t.operator](i,o,n);case bo.LogicalExpression:return i=this.recurse(t.left),o=this.recurse(t.right),this["binary"+t.operator](i,o,n);case bo.ConditionalExpression:return this["ternary?:"](this.recurse(t.test),this.recurse(t.alternate),this.recurse(t.consequent),n);case bo.Identifier:return re(t.name,u.expression),u.identifier(t.name,u.expensiveChecks||$e(t.name),n,e,u.expression);case bo.MemberExpression:return i=this.recurse(t.object,!1,!!e),t.computed||(re(t.property.name,u.expression),o=t.property.name),t.computed&&(o=this.recurse(t.property)),t.computed?this.computedMember(i,o,n,e,u.expression):this.nonComputedMember(i,o,u.expensiveChecks,n,e,u.expression);case bo.CallExpression:return a=[],r(t.arguments,function(t){a.push(u.recurse(t))}),t.filter&&(o=this.$filter(t.callee.name)),t.filter||(o=this.recurse(t.callee,!0)),t.filter?function(t,e,r,i){for(var u=[],s=0;s<a.length;++s)u.push(a[s](t,e,r,i));var l=o.apply(void 0,u,i);return n?{context:void 0,name:void 0,value:l}:l}:function(t,e,r,i){var s,l=o(t,e,r,i);if(null!=l.value){oe(l.context,u.expression),ae(l.value,u.expression);for(var c=[],f=0;f<a.length;++f)c.push(oe(a[f](t,e,r,i),u.expression));s=oe(l.value.apply(l.context,c),u.expression)}return n?{value:s}:s};case bo.AssignmentExpression:return i=this.recurse(t.left,!0,1),o=this.recurse(t.right),function(t,e,r,a){var s=i(t,e,r,a),l=o(t,e,r,a);return oe(s.value,u.expression),ue(s.context),s.context[s.name]=l,n?{value:l}:l};case bo.ArrayExpression:return a=[],r(t.elements,function(t){a.push(u.recurse(t))}),function(t,e,r,i){for(var o=[],u=0;u<a.length;++u)o.push(a[u](t,e,r,i));return n?{value:o}:o};case bo.ObjectExpression:return a=[],r(t.properties,function(t){t.computed?a.push({key:u.recurse(t.key),computed:!0,value:u.recurse(t.value)}):a.push({key:t.key.type===bo.Identifier?t.key.name:""+t.key.value,computed:!1,value:u.recurse(t.value)})}),function(t,e,r,i){for(var o={},u=0;u<a.length;++u)a[u].computed?o[a[u].key(t,e,r,i)]=a[u].value(t,e,r,i):o[a[u].key]=a[u].value(t,e,r,i);return n?{value:o}:o};case bo.ThisExpression:return function(t){return n?{value:t}:t};case bo.LocalsExpression:return function(t,e){return n?{value:e}:e};case bo.NGValueParameter:return function(t,e,r){return n?{value:r}:r}}},"unary+":function(t,n){return function(e,r,i,o){var a=t(e,r,i,o);return a=y(a)?+a:0,n?{value:a}:a}},"unary-":function(t,n){return function(e,r,i,o){var a=t(e,r,i,o);return a=y(a)?-a:-0,n?{value:a}:a}},"unary!":function(t,n){return function(e,r,i,o){var a=!t(e,r,i,o);return n?{value:a}:a}},"binary+":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a),s=n(r,i,o,a),l=le(u,s);return e?{value:l}:l}},"binary-":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a),s=n(r,i,o,a),l=(y(u)?u:0)-(y(s)?s:0);return e?{value:l}:l}},"binary*":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)*n(r,i,o,a);return e?{value:u}:u}},"binary/":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)/n(r,i,o,a);return e?{value:u}:u}},"binary%":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)%n(r,i,o,a);return e?{value:u}:u}},"binary===":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)===n(r,i,o,a);return e?{value:u}:u}},"binary!==":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)!==n(r,i,o,a);return e?{value:u}:u}},"binary==":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)==n(r,i,o,a);return e?{value:u}:u}},"binary!=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)!=n(r,i,o,a);return e?{value:u}:u}},"binary<":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)<n(r,i,o,a);return e?{value:u}:u}},"binary>":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)>n(r,i,o,a);return e?{value:u}:u}},"binary<=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)<=n(r,i,o,a);return e?{value:u}:u}},"binary>=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)>=n(r,i,o,a);return e?{value:u}:u}},"binary&&":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)&&n(r,i,o,a);return e?{value:u}:u}},"binary||":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)||n(r,i,o,a);return e?{value:u}:u}},"ternary?:":function(t,n,e,r){return function(i,o,a,u){var s=t(i,o,a,u)?n(i,o,a,u):e(i,o,a,u);return r?{value:s}:s}},value:function(t,n){return function(){return n?{context:void 0,name:void 0,value:t}:t}},identifier:function(t,n,e,r,i){return function(o,a,u,s){var l=a&&t in a?a:o;r&&1!==r&&l&&!l[t]&&(l[t]={});var c=l?l[t]:void 0;return n&&oe(c,i),e?{context:l,name:t,value:c}:c}},computedMember:function(t,n,e,r,i){return function(o,a,u,s){var l,c,f=t(o,a,u,s);return null!=f&&(l=n(o,a,u,s),l=ie(l),re(l,i),r&&1!==r&&(ue(f),f&&!f[l]&&(f[l]={})),c=f[l],oe(c,i)),e?{context:f,name:l,value:c}:c}},nonComputedMember:function(t,n,e,r,i,o){return function(a,u,s,l){var c=t(a,u,s,l);i&&1!==i&&(ue(c),c&&!c[n]&&(c[n]={}));var f=null!=c?c[n]:void 0;return(e||$e(n))&&oe(f,o),r?{context:c,name:n,value:f}:f}},inputs:function(t,n){return function(e,r,i,o){return o?o[n]:t(e,r,i)}}};var xo=function(t,n,e){this.lexer=t,this.$filter=n,this.options=e,this.ast=new bo(t,e),this.astCompiler=e.csp?new ye(this.ast,n):new me(this.ast,n)};xo.prototype={constructor:xo,parse:function(t){return this.astCompiler.compile(t,this.options.expensiveChecks)}};var wo=Object.prototype.valueOf,Co=n("$sce"),So={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Mo=n("$compile"),_o=t.document.createElement("a"),ko=Re(t.location.href);Ie.$inject=["$document"],qe.$inject=["$provide"];var Ao=22,Eo=".",Po="0";He.$inject=["$locale"],Ye.$inject=["$locale"];var Oo={yyyy:Ke("FullYear",4,0,!1,!0),yy:Ke("FullYear",2,0,!0,!0),y:Ke("FullYear",1,0,!1,!0),MMMM:Qe("Month"),MMM:Qe("Month",!0),MM:Ke("Month",2,1),M:Ke("Month",1,1),LLLL:Qe("Month",!1,!0),dd:Ke("Date",2),d:Ke("Date",1),HH:Ke("Hours",2),H:Ke("Hours",1),hh:Ke("Hours",2,-12),h:Ke("Hours",1,-12),mm:Ke("Minutes",2),m:Ke("Minutes",1),ss:Ke("Seconds",2),s:Ke("Seconds",1),sss:Ke("Milliseconds",3),EEEE:Qe("Day"),EEE:Qe("Day",!0),a:ir,Z:tr,ww:rr(2),w:rr(1),G:or,GG:or,GGG:or,GGGG:ar},To=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,Lo=/^\-?\d+$/;ur.$inject=["$locale"];var No=v(Rr),jo=v(Dr);fr.$inject=["$parse"];var Ro=v({restrict:"E",compile:function(t,n){if(!n.href&&!n.xlinkHref)return function(t,n){if("a"===n[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===Yr.call(n.prop("href"))?"xlink:href":"href";n.on("click",function(t){n.attr(e)||t.preventDefault()})}}}}),Do={};r(Ai,function(t,n){function e(t,e,i){t.$watch(i[r],function(t){i.$set(n,!!t)})}if("multiple"!==t){var r=yn("ng-"+n),i=e;"checked"===t&&(i=function(t,n,i){i.ngModel!==i[r]&&e(t,n,i)}),Do[r]=function(){return{restrict:"A",priority:100,link:i}}}}),r(Pi,function(t,n){Do[n]=function(){return{priority:100,link:function(t,e,r){if("ngPattern"===n&&"/"===r.ngPattern.charAt(0)){var i=r.ngPattern.match(Lr);if(i)return void r.$set("ngPattern",new RegExp(i[1],i[2]))}t.$watch(r[n],function(t){r.$set(n,t)})}}}}),r(["src","srcset","href"],function(t){var n=yn("ng-"+t);Do[n]=function(){return{priority:99,link:function(e,r,i){var o=t,a=t;"href"===t&&"[object SVGAnimatedString]"===Yr.call(r.prop("href"))&&(a="xlinkHref",i.$attr[a]="xlink:href",o=null),i.$observe(n,function(n){return n?(i.$set(a,n),void(Vr&&o&&r.prop(o,i[a]))):void("href"===t&&i.$set(a,null))})}}}});var Fo={$addControl:p,$$renameControl:pr,$removeControl:p,$setValidity:p,$setDirty:p,$setPristine:p,$setSubmitted:p},Io="ng-submitted";dr.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Vo=function(t){return["$timeout","$parse",function(n,e){function r(t){return""===t?e('this[""]').assign:e(t).assign||p}var i={name:"form",restrict:t?"EAC":"E",require:["form","^^?form"],controller:dr,compile:function(e,i){e.addClass(wa).addClass(ba);var o=i.name?"name":!(!t||!i.ngForm)&&"ngForm";return{pre:function(t,e,i,a){var u=a[0];if(!("action"in i)){var s=function(n){t.$apply(function(){u.$commitViewValue(),u.$setSubmitted()}),n.preventDefault()};e[0].addEventListener("submit",s),e.on("$destroy",function(){n(function(){e[0].removeEventListener("submit",s)},0,!1)})}var c=a[1]||u.$$parentForm;c.$addControl(u);var f=o?r(u.$name):p;o&&(f(t,u),i.$observe(o,function(n){u.$name!==n&&(f(t,void 0),u.$$parentForm.$$renameControl(u,n),(f=r(u.$name))(t,u))})),e.on("$destroy",function(){u.$$parentForm.$removeControl(u),f(t,void 0),l(u,Fo)})}}}};return i}]},qo=Vo(),zo=Vo(!0),Bo=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Uo=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:\/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Wo=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Ho=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Yo=/^(\d{4,})-(\d{2})-(\d{2})$/,Go=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Zo=/^(\d{4,})-W(\d\d)$/,Xo=/^(\d{4,})-(\d\d)$/,Jo=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Ko="keydown wheel mousedown",Qo=dt();r("date,datetime-local,month,time,week".split(","),function(t){Qo[t]=!0});var ta={text:gr,date:br("date",Yo,$r(Yo,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":br("datetimelocal",Go,$r(Go,["yyyy","MM","dd","HH","mm","ss","sss"]),"yyyy-MM-ddTHH:mm:ss.sss"),time:br("time",Jo,$r(Jo,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:br("week",Zo,yr,"yyyy-Www"),month:br("month",Xo,$r(Xo,["yyyy","MM"]),"yyyy-MM"),number:Cr,url:Mr,email:_r,radio:kr,range:Sr,checkbox:Er,hidden:p,button:p,submit:p,reset:p,file:p},na=["$browser","$sniffer","$filter","$parse",function(t,n,e,r){return{restrict:"E",require:["?ngModel"],link:{pre:function(i,o,a,u){u[0]&&(ta[Rr(a.type)]||ta.text)(i,o,a,u[0],n,t,e,r)}}}}],ea=/^(true|false|\d+)$/,ra=function(){return{restrict:"A",priority:100,compile:function(t,n){return ea.test(n.ngValue)?function(t,n,e){e.$set("value",t.$eval(e.ngValue))}:function(t,n,e){t.$watch(e.ngValue,function(t){e.$set("value",t)})}}}},ia=["$compile",function(t){return{restrict:"AC",compile:function(n){return t.$$addBindingClass(n),function(n,e,r){t.$$addBindingInfo(e,r.ngBind),e=e[0],n.$watch(r.ngBind,function(t){e.textContent=vt(t)})}}}}],oa=["$interpolate","$compile",function(t,n){return{compile:function(e){return n.$$addBindingClass(e),function(e,r,i){var o=t(r.attr(i.$attr.ngBindTemplate));n.$$addBindingInfo(r,o.expressions),r=r[0],i.$observe("ngBindTemplate",function(t){r.textContent=m(t)?"":t})}}}}],aa=["$sce","$parse","$compile",function(t,n,e){return{restrict:"A",compile:function(r,i){var o=n(i.ngBindHtml),a=n(i.ngBindHtml,function(n){return t.valueOf(n)});return e.$$addBindingClass(r),function(n,r,i){e.$$addBindingInfo(r,i.ngBindHtml),n.$watch(a,function(){var e=o(n);r.html(t.getTrustedHtml(e)||"")})}}}}],ua=v({restrict:"A",require:"ngModel",link:function(t,n,e,r){r.$viewChangeListeners.push(function(){t.$eval(e.ngChange)})}}),sa=Pr("",!0),la=Pr("Odd",0),ca=Pr("Even",1),fa=hr({compile:function(t,n){n.$set("ngCloak",void 0),t.removeClass("ng-cloak")}}),ha=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],pa={},da={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(t){var n=yn("ng-"+t);pa[n]=["$parse","$rootScope",function(e,r){return{restrict:"A",compile:function(i,o){var a=e(o[n],null,!0);return function(n,e){e.on(t,function(e){var i=function(){a(n,{$event:e})};da[t]&&r.$$phase?n.$evalAsync(i):n.$apply(i)})}}}}]});var va=["$animate","$compile",function(t,n){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(e,r,i,o,a){var u,s,l;e.$watch(i.ngIf,function(e){e?s||a(function(e,o){s=o,e[e.length++]=n.$$createComment("end ngIf",i.ngIf),u={clone:e},t.enter(e,r.parent(),r)}):(l&&(l.remove(),l=null),s&&(s.$destroy(),s=null),u&&(l=pt(u.clone),t.leave(l).then(function(){l=null}),u=null))})}}}],ga=["$templateRequest","$anchorScroll","$animate",function(t,n,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Xr.noop,compile:function(r,i){var o=i.ngInclude||i.src,a=i.onload||"",u=i.autoscroll;return function(r,i,s,l,c){var f,h,p,d=0,v=function(){h&&(h.remove(),h=null),f&&(f.$destroy(),f=null),p&&(e.leave(p).then(function(){h=null}),h=p,p=null)};r.$watch(o,function(o){var s=function(){!y(u)||u&&!r.$eval(u)||n()},h=++d;o?(t(o,!0).then(function(t){if(!r.$$destroyed&&h===d){var n=r.$new();l.template=t;var u=c(n,function(t){v(),e.enter(t,null,i).then(s)});f=n,p=u,f.$emit("$includeContentLoaded",o),r.$eval(a)}},function(){r.$$destroyed||h===d&&(v(),r.$emit("$includeContentError",o))}),r.$emit("$includeContentRequested",o)):(v(),l.template=null)})}}}}],ma=["$compile",function(n){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(e,r,i,o){return Yr.call(r[0]).match(/SVG/)?(r.empty(),void n(kt(o.template,t.document).childNodes)(e,function(t){r.append(t)},{futureParentElement:r})):(r.html(o.template),void n(r.contents())(e))}}}],ya=hr({priority:450,compile:function(){return{pre:function(t,n,e){t.$eval(e.ngInit)}}}}),$a=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(t,n,e,i){var o=e.ngList||", ",a="false"!==e.ngTrim,u=a?ti(o):o,s=function(t){if(!m(t)){var n=[];return t&&r(t.split(u),function(t){t&&n.push(a?ti(t):t)}),n}};i.$parsers.push(s),i.$formatters.push(function(t){if(Kr(t))return t.join(o)}),i.$isEmpty=function(t){return!t||!t.length}}}},ba="ng-valid",xa="ng-invalid",wa="ng-pristine",Ca="ng-dirty",Sa="ng-untouched",Ma="ng-touched",_a="ng-pending",ka="ng-empty",Aa="ng-not-empty",Ea=n("ngModel"),Pa=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(t,n,e,i,o,a,u,s,l,c){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=void 0,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=void 0,this.$name=c(e.name||"",!1)(t),this.$$parentForm=Fo;var f,h=o(e.ngModel),d=h.assign,v=h,g=d,$=null,b=this;this.$$setOptions=function(t){if(b.$options=t,t&&t.getterSetter){var n=o(e.ngModel+"()"),r=o(e.ngModel+"($$$p)");v=function(t){var e=h(t);return S(e)&&(e=n(t)),e},g=function(t,n){S(h(t))?r(t,{$$$p:n}):d(t,n)}}else if(!h.assign)throw Ea("nonassign","Expression '{0}' is non-assignable. Element: {1}",e.ngModel,X(i))},this.$render=p,this.$isEmpty=function(t){return m(t)||""===t||null===t||t!==t},this.$$updateEmptyClasses=function(t){b.$isEmpty(t)?(a.removeClass(i,Aa),a.addClass(i,ka)):(a.removeClass(i,ka),a.addClass(i,Aa))};var x=0;Or({ctrl:this,$element:i,set:function(t,n){t[n]=!0},unset:function(t,n){delete t[n]},$animate:a}),this.$setPristine=function(){b.$dirty=!1,b.$pristine=!0,a.removeClass(i,Ca),a.addClass(i,wa)},this.$setDirty=function(){b.$dirty=!0,b.$pristine=!1,a.removeClass(i,wa),a.addClass(i,Ca),b.$$parentForm.$setDirty()},this.$setUntouched=function(){b.$touched=!1,b.$untouched=!0,a.setClass(i,Sa,Ma)},this.$setTouched=function(){b.$touched=!0,b.$untouched=!1,a.setClass(i,Ma,Sa)},this.$rollbackViewValue=function(){u.cancel($),b.$viewValue=b.$$lastCommittedViewValue,b.$render()},this.$validate=function(){if(!w(b.$modelValue)||!isNaN(b.$modelValue)){var t=b.$$lastCommittedViewValue,n=b.$$rawModelValue,e=b.$valid,r=b.$modelValue,i=b.$options&&b.$options.allowInvalid;b.$$runValidators(n,t,function(t){i||e===t||(b.$modelValue=t?n:void 0,b.$modelValue!==r&&b.$$writeModelToScope())})}},this.$$runValidators=function(t,n,e){function i(){var t=b.$$parserName||"parse";return m(f)?(u(t,null),!0):(f||(r(b.$validators,function(t,n){u(n,null)}),r(b.$asyncValidators,function(t,n){u(n,null)})),u(t,f),f)}function o(){var e=!0;return r(b.$validators,function(r,i){var o=r(t,n);e=e&&o,u(i,o)}),!!e||(r(b.$asyncValidators,function(t,n){u(n,null)}),!1)}function a(){var e=[],i=!0;r(b.$asyncValidators,function(r,o){var a=r(t,n);if(!T(a))throw Ea("nopromise","Expected asynchronous validator to return a promise but got '{0}' instead.",a);u(o,void 0),e.push(a.then(function(){u(o,!0)},function(){i=!1,u(o,!1)}))}),e.length?l.all(e).then(function(){s(i)},p):s(!0)}function u(t,n){c===x&&b.$setValidity(t,n)}function s(t){c===x&&e(t)}x++;var c=x;return i()&&o()?void a():void s(!1)},this.$commitViewValue=function(){var t=b.$viewValue;u.cancel($),(b.$$lastCommittedViewValue!==t||""===t&&b.$$hasNativeValidators)&&(b.$$updateEmptyClasses(t),b.$$lastCommittedViewValue=t,b.$pristine&&this.$setDirty(),this.$$parseAndValidate())},this.$$parseAndValidate=function(){function n(){b.$modelValue!==o&&b.$$writeModelToScope()}var e=b.$$lastCommittedViewValue,r=e;if(f=!m(r)||void 0)for(var i=0;i<b.$parsers.length;i++)if(r=b.$parsers[i](r),m(r)){f=!1;break}w(b.$modelValue)&&isNaN(b.$modelValue)&&(b.$modelValue=v(t));var o=b.$modelValue,a=b.$options&&b.$options.allowInvalid;b.$$rawModelValue=r,a&&(b.$modelValue=r,n()),b.$$runValidators(r,b.$$lastCommittedViewValue,function(t){a||(b.$modelValue=t?r:void 0,n())})},this.$$writeModelToScope=function(){g(t,b.$modelValue),r(b.$viewChangeListeners,function(t){try{t()}catch(e){n(e)}})},this.$setViewValue=function(t,n){b.$viewValue=t,b.$options&&!b.$options.updateOnDefault||b.$$debounceViewValueCommit(n)},this.$$debounceViewValueCommit=function(n){var e,r=0,i=b.$options;i&&y(i.debounce)&&(e=i.debounce,w(e)?r=e:w(e[n])?r=e[n]:w(e["default"])&&(r=e["default"])),u.cancel($),r?$=u(function(){b.$commitViewValue()},r):s.$$phase?b.$commitViewValue():t.$apply(function(){b.$commitViewValue()})},t.$watch(function(){var n=v(t);if(n!==b.$modelValue&&(b.$modelValue===b.$modelValue||n===n)){b.$modelValue=b.$$rawModelValue=n,f=void 0;for(var e=b.$formatters,r=e.length,i=n;r--;)i=e[r](i);b.$viewValue!==i&&(b.$$updateEmptyClasses(i),b.$viewValue=b.$$lastCommittedViewValue=i,b.$render(),b.$$runValidators(b.$modelValue,b.$viewValue,p))}return n})}],Oa=["$rootScope",function(t){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Pa,priority:1,compile:function(n){return n.addClass(wa).addClass(Sa).addClass(ba),{pre:function(t,n,e,r){var i=r[0],o=r[1]||i.$$parentForm;i.$$setOptions(r[2]&&r[2].$options),o.$addControl(i),e.$observe("name",function(t){i.$name!==t&&i.$$parentForm.$$renameControl(i,t)}),t.$on("$destroy",function(){i.$$parentForm.$removeControl(i)})},post:function(n,e,r,i){var o=i[0];o.$options&&o.$options.updateOn&&e.on(o.$options.updateOn,function(t){o.$$debounceViewValueCommit(t&&t.type)}),e.on("blur",function(){o.$touched||(t.$$phase?n.$evalAsync(o.$setTouched):n.$apply(o.$setTouched))})}}}}}],Ta=/(\s+|^)default(\s+|$)/,La=function(){return{restrict:"A",controller:["$scope","$attrs",function(t,n){var e=this;this.$options=I(t.$eval(n.ngModelOptions)),y(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=ti(this.$options.updateOn.replace(Ta,function(){return e.$options.updateOnDefault=!0," "}))):this.$options.updateOnDefault=!0}]}},Na=hr({terminal:!0,priority:1e3}),ja=n("ngOptions"),Ra=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,Da=["$compile","$document","$parse",function(n,i,o){function a(t,n,r){function i(t,n,e,r,i){this.selectValue=t,this.viewValue=n,this.label=e,this.group=r,this.disabled=i}function a(t){var n;if(!l&&e(t))n=t;else{n=[];for(var r in t)t.hasOwnProperty(r)&&"$"!==r.charAt(0)&&n.push(r)}return n}var u=t.match(Ra);if(!u)throw ja("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",t,X(n));var s=u[5]||u[7],l=u[6],c=/ as /.test(u[0])&&u[1],f=u[9],h=o(u[2]?u[1]:s),p=c&&o(c),d=p||h,v=f&&o(f),g=f?function(t,n){return v(r,n)}:function(t){return Kt(t)},m=function(t,n){return g(t,C(t,n))},y=o(u[2]||u[1]),$=o(u[3]||""),b=o(u[4]||""),x=o(u[8]),w={},C=l?function(t,n){return w[l]=n,w[s]=t,w}:function(t){return w[s]=t,w};return{trackBy:f,getTrackByValue:m,getWatchables:o(x,function(t){var n=[];t=t||[];for(var e=a(t),i=e.length,o=0;o<i;o++){var s=t===e?o:e[o],l=t[s],c=C(l,s),f=g(l,c);if(n.push(f),u[2]||u[1]){var h=y(r,c);n.push(h)}if(u[4]){var p=b(r,c);n.push(p)}}return n}),getOptions:function(){for(var t=[],n={},e=x(r)||[],o=a(e),u=o.length,s=0;s<u;s++){var l=e===o?s:o[s],c=e[l],h=C(c,l),p=d(r,h),v=g(p,h),w=y(r,h),S=$(r,h),M=b(r,h),_=new i(v,p,w,S,M);t.push(_),n[v]=_}return{items:t,selectValueMap:n,getOptionFromViewValue:function(t){return n[m(t)]},getViewValueFromOption:function(t){return f?Xr.copy(t.viewValue):t.viewValue}}}}}function u(t,e,o,u){function c(t,n){var e=s.cloneNode(!1);n.appendChild(e),f(t,e)}function f(t,n){t.element=n,n.disabled=t.disabled,t.label!==n.label&&(n.label=t.label,n.textContent=t.label),t.value!==n.value&&(n.value=t.selectValue)}function h(){var t=C&&d.readValue();if(C)for(var n=C.items.length-1;n>=0;n--){var r=C.items[n];Ut(y(r.group)?r.element.parentNode:r.element)}C=S.getOptions();var i={};if(x&&e.prepend(p),C.items.forEach(function(t){var n;y(t.group)?(n=i[t.group],n||(n=l.cloneNode(!1),M.appendChild(n),n.label=null===t.group?"null":t.group,i[t.group]=n),c(t,n)):c(t,M)}),e[0].appendChild(M),v.$render(),!v.$isEmpty(t)){var o=d.readValue(),a=S.trackBy||g;(a?V(t,o):t===o)||(v.$setViewValue(o),v.$render())}}for(var p,d=u[0],v=u[1],g=o.multiple,m=0,$=e.children(),b=$.length;m<b;m++)if(""===$[m].value){p=$.eq(m);break}var x=!!p,w=qr(s.cloneNode(!1));w.val("?");var C,S=a(o.ngOptions,e,t),M=i[0].createDocumentFragment(),_=function(){x||e.prepend(p),e.val(""),p.prop("selected",!0),p.attr("selected",!0)},k=function(){x?p.removeAttr("selected"):p.remove()},A=function(){e.prepend(w),e.val("?"),w.prop("selected",!0),w.attr("selected",!0)},E=function(){w.remove()};g?(v.$isEmpty=function(t){return!t||0===t.length},d.writeValue=function(t){C.items.forEach(function(t){t.element.selected=!1}),t&&t.forEach(function(t){var n=C.getOptionFromViewValue(t);n&&(n.element.selected=!0)})},d.readValue=function(){var t=e.val()||[],n=[];return r(t,function(t){var e=C.selectValueMap[t];e&&!e.disabled&&n.push(C.getViewValueFromOption(e))}),n},S.trackBy&&t.$watchCollection(function(){if(Kr(v.$viewValue))return v.$viewValue.map(function(t){return S.getTrackByValue(t)})},function(){v.$render()})):(d.writeValue=function(t){var n=C.selectValueMap[e.val()],r=C.getOptionFromViewValue(t);n&&n.element.removeAttribute("selected"),r?(e[0].value!==r.selectValue&&(E(),k(),e[0].value=r.selectValue,r.element.selected=!0),r.element.setAttribute("selected","selected")):null===t||x?(E(),_()):(k(),A())},d.readValue=function(){var t=C.selectValueMap[e.val()];return t&&!t.disabled?(k(),E(),C.getViewValueFromOption(t)):null},S.trackBy&&t.$watch(function(){return S.getTrackByValue(v.$viewValue)},function(){v.$render()})),x?(p.remove(),n(p)(t),p.removeClass("ng-scope")):p=qr(s.cloneNode(!1)),e.empty(),h(),t.$watchCollection(S.getWatchables,h)}var s=t.document.createElement("option"),l=t.document.createElement("optgroup");
-return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(t,n,e,r){r[0].registerOption=p},post:u}}}],Fa=["$locale","$interpolate","$log",function(t,n,e){var i=/{}/g,o=/^when(Minus)?(.+)$/;return{link:function(a,u,s){function l(t){u.text(t||"")}var c,f=s.count,h=s.$attr.when&&u.attr(s.$attr.when),d=s.offset||0,v=a.$eval(h)||{},g={},y=n.startSymbol(),$=n.endSymbol(),b=y+f+"-"+d+$,x=Xr.noop;r(s,function(t,n){var e=o.exec(n);if(e){var r=(e[1]?"-":"")+Rr(e[2]);v[r]=u.attr(s.$attr[n])}}),r(v,function(t,e){g[e]=n(t.replace(i,b))}),a.$watch(f,function(n){var r=parseFloat(n),i=isNaN(r);if(i||r in v||(r=t.pluralCat(r-d)),r!==c&&!(i&&w(c)&&isNaN(c))){x();var o=g[r];m(o)?(null!=n&&e.debug("ngPluralize: no rule defined for '"+r+"' in "+h),x=p,l()):x=a.$watch(o,l),c=r}})}}}],Ia=["$parse","$animate","$compile",function(t,i,o){var a="$$NG_REMOVED",u=n("ngRepeat"),s=function(t,n,e,r,i,o,a){t[e]=r,i&&(t[i]=o),t.$index=n,t.$first=0===n,t.$last=n===a-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&n))},l=function(t){return t.clone[0]},c=function(t){return t.clone[t.clone.length-1]};return{restrict:"A",multiElement:!0,transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,compile:function(n,f){var h=f.ngRepeat,p=o.$$createComment("end ngRepeat",h),d=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!d)throw u("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",h);var v=d[1],g=d[2],m=d[3],y=d[4];if(d=v.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/),!d)throw u("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",v);var $=d[3]||d[1],b=d[2];if(m&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(m)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(m)))throw u("badident","alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",m);var x,w,C,S,M={$id:Kt};return y?x=t(y):(C=function(t,n){return Kt(n)},S=function(t){return t}),function(t,n,o,f,d){x&&(w=function(n,e,r){return b&&(M[b]=n),M[$]=e,M.$index=r,x(t,M)});var v=dt();t.$watchCollection(g,function(o){var f,g,y,x,M,_,k,A,E,P,O,T,L=n[0],N=dt();if(m&&(t[m]=o),e(o))E=o,A=w||C;else{A=w||S,E=[];for(var j in o)jr.call(o,j)&&"$"!==j.charAt(0)&&E.push(j)}for(x=E.length,O=new Array(x),f=0;f<x;f++)if(M=o===E?f:E[f],_=o[M],k=A(M,_,f),v[k])P=v[k],delete v[k],N[k]=P,O[f]=P;else{if(N[k])throw r(O,function(t){t&&t.scope&&(v[t.id]=t)}),u("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",h,k,_);O[f]={id:k,scope:void 0,clone:void 0},N[k]=!0}for(var R in v){if(P=v[R],T=pt(P.clone),i.leave(T),T[0].parentNode)for(f=0,g=T.length;f<g;f++)T[f][a]=!0;P.scope.$destroy()}for(f=0;f<x;f++)if(M=o===E?f:E[f],_=o[M],P=O[f],P.scope){y=L;do y=y.nextSibling;while(y&&y[a]);l(P)!==y&&i.move(pt(P.clone),null,L),L=c(P),s(P.scope,f,$,_,b,M,x)}else d(function(t,n){P.scope=n;var e=p.cloneNode(!1);t[t.length++]=e,i.enter(t,null,L),L=e,P.clone=t,N[P.id]=P,s(P.scope,f,$,_,b,M,x)});v=N})}}}}],Va="ng-hide",qa="ng-hide-animate",za=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(n,e,r){n.$watch(r.ngShow,function(n){t[n?"removeClass":"addClass"](e,Va,{tempClasses:qa})})}}}],Ba=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(n,e,r){n.$watch(r.ngHide,function(n){t[n?"addClass":"removeClass"](e,Va,{tempClasses:qa})})}}}],Ua=hr(function(t,n,e){t.$watch(e.ngStyle,function(t,e){e&&t!==e&&r(e,function(t,e){n.css(e,"")}),t&&n.css(t)},!0)}),Wa=["$animate","$compile",function(t,n){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(e,i,o,a){var u=o.ngSwitch||o.on,s=[],l=[],c=[],f=[],h=function(t,n){return function(){t.splice(n,1)}};e.$watch(u,function(e){var i,o;for(i=0,o=c.length;i<o;++i)t.cancel(c[i]);for(c.length=0,i=0,o=f.length;i<o;++i){var u=pt(l[i].clone);f[i].$destroy();var p=c[i]=t.leave(u);p.then(h(c,i))}l.length=0,f.length=0,(s=a.cases["!"+e]||a.cases["?"])&&r(s,function(e){e.transclude(function(r,i){f.push(i);var o=e.element;r[r.length++]=n.$$createComment("end ngSwitchWhen");var a={clone:r};l.push(a),t.enter(r,o.parent(),o)})})})}}}],Ha=hr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,n,e,r,i){r.cases["!"+e.ngSwitchWhen]=r.cases["!"+e.ngSwitchWhen]||[],r.cases["!"+e.ngSwitchWhen].push({transclude:i,element:n})}}),Ya=hr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,n,e,r,i){r.cases["?"]=r.cases["?"]||[],r.cases["?"].push({transclude:i,element:n})}}),Ga=n("ngTransclude"),Za=["$compile",function(t){return{restrict:"EAC",terminal:!0,compile:function(n){var e=t(n.contents());return n.empty(),function(t,n,r,i,o){function a(t,e){t.length?n.append(t):(u(),e.$destroy())}function u(){e(t,function(t){n.append(t)})}if(!o)throw Ga("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",X(n));r.ngTransclude===r.$attr.ngTransclude&&(r.ngTransclude="");var s=r.ngTransclude||r.ngTranscludeSlot;o(a,null,s),s&&!o.isSlotFilled(s)&&u()}}}}],Xa=["$templateCache",function(t){return{restrict:"E",terminal:!0,compile:function(n,e){if("text/ng-template"===e.type){var r=e.id,i=n[0].text;t.put(r,i)}}}}],Ja={$setViewValue:p,$render:p},Ka=["$element","$scope",function(n,e){function r(){u||(u=!0,e.$$postDigest(function(){u=!1,o.ngModelCtrl.$render()}))}function i(t){s||(s=!0,e.$$postDigest(function(){s=!1,o.ngModelCtrl.$setViewValue(o.readValue()),t&&o.ngModelCtrl.$render()}))}var o=this,a=new Qt;o.selectValueMap={},o.ngModelCtrl=Ja,o.multiple=!1,o.unknownOption=qr(t.document.createElement("option")),o.renderUnknownOption=function(t){var e="? "+Kt(t)+" ?";o.unknownOption.val(e),n.prepend(o.unknownOption),n.val(e)},o.updateUnknownOption=function(t){var e="? "+Kt(t)+" ?";o.unknownOption.val(e),n.val(e)},e.$on("$destroy",function(){o.renderUnknownOption=p}),o.removeUnknownOption=function(){o.unknownOption.parent()&&o.unknownOption.remove()},o.readValue=function(){var t=n.val(),e=t in o.selectValueMap?o.selectValueMap[t]:t;return o.hasOption(e)?e:null},o.writeValue=function(t){if(o.hasOption(t)){o.removeUnknownOption();var e=Kt(t);n.val(e in o.selectValueMap?e:t),""===t&&o.emptyOption.prop("selected",!0)}else null==t&&o.emptyOption?(o.removeUnknownOption(),n.val("")):o.unknownOption.parent().length?o.updateUnknownOption(t):o.renderUnknownOption(t)},o.addOption=function(t,n){if(n[0].nodeType!==fi){ft(t,'"option value"'),""===t&&(o.emptyOption=n);var e=a.get(t)||0;a.put(t,e+1),r()}},o.removeOption=function(t){var n=a.get(t);n&&(1===n?(a.remove(t),""===t&&(o.emptyOption=void 0)):a.put(t,n-1))},o.hasOption=function(t){return!!a.get(t)};var u=!1,s=!1;o.registerOption=function(t,n,e,r,a){if(e.$attr.ngValue){var u,s=NaN;e.$observe("value",function(t){var e,r=n.prop("selected");y(s)&&(o.removeOption(u),delete o.selectValueMap[s],e=!0),s=Kt(t),u=t,o.selectValueMap[s]=t,o.addOption(t,n),n.attr("value",s),e&&r&&i()})}else r?e.$observe("value",function(t){var e,r,a=(o.readValue(),n.prop("selected"));y(u)&&(o.removeOption(u),e=!0,r=u),u=t,o.addOption(t,n),e&&a&&i()}):a?t.$watch(a,function(t,r){e.$set("value",t);var a=n.prop("selected");r!==t&&o.removeOption(r),o.addOption(t,n),r&&a&&i()}):o.addOption(e.value,n);var l;e.$observe("disabled",function(t){("true"===t||t&&n.prop("selected"))&&(o.multiple?i(!0):(o.ngModelCtrl.$setViewValue(null),o.ngModelCtrl.$render()),l=t)}),n.on("$destroy",function(){var t=o.readValue(),n=e.value;o.removeOption(n),o.ngModelCtrl.$render(),(o.multiple&&t&&t.indexOf(n)!==-1||t===n)&&i(!0)})}}],Qa=function(){function t(t,n,e,i){var o=i[0],a=i[1];if(!a)return void(o.registerOption=p);if(o.ngModelCtrl=a,n.on("change",function(){o.removeUnknownOption(),t.$apply(function(){a.$setViewValue(o.readValue())})}),e.multiple){o.multiple=!0,o.readValue=function(){var t=[];return r(n.find("option"),function(n){if(n.selected&&!n.disabled){var e=n.value;t.push(e in o.selectValueMap?o.selectValueMap[e]:e)}}),t},o.writeValue=function(t){var e=new Qt(t);r(n.find("option"),function(t){t.selected=y(e.get(t.value))||y(e.get(o.selectValueMap[t.value]))})};var u,s=NaN;t.$watch(function(){s!==a.$viewValue||V(u,a.$viewValue)||(u=mt(a.$viewValue),a.$render()),s=a.$viewValue}),a.$isEmpty=function(t){return!t||0===t.length}}}function n(t,n,e,r){var i=r[1];if(i){var o=r[0];i.$render=function(){o.writeValue(i.$viewValue)}}}return{restrict:"E",require:["select","?ngModel"],controller:Ka,priority:1,link:{pre:t,post:n}}},tu=["$interpolate",function(t){return{restrict:"E",priority:100,compile:function(n,e){var r,i;return y(e.ngValue)||(y(e.value)?r=t(e.value,!0):(i=t(n.text(),!0),i||e.$set("value",n.text()))),function(t,n,e){var o="$selectController",a=n.parent(),u=a.data(o)||a.parent().data(o);u&&u.registerOption(t,n,e,r,i)}}}}],nu=v({restrict:"E",terminal:!1}),eu=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){r&&(e.required=!0,r.$validators.required=function(t,n){return!e.required||!r.$isEmpty(n)},e.$observe("required",function(){r.$validate()}))}}},ru=function(){return{restrict:"A",require:"?ngModel",link:function(t,e,r,i){if(i){var o,a=r.ngPattern||r.pattern;r.$observe("pattern",function(t){if(x(t)&&t.length>0&&(t=new RegExp("^"+t+"$")),t&&!t.test)throw n("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",a,t,X(e));o=t||void 0,i.$validate()}),i.$validators.pattern=function(t,n){return i.$isEmpty(n)||m(o)||o.test(n)}}}}},iu=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){if(r){var i=-1;e.$observe("maxlength",function(t){var n=f(t);i=isNaN(n)?-1:n,r.$validate()}),r.$validators.maxlength=function(t,n){return i<0||r.$isEmpty(n)||n.length<=i}}}}},ou=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){if(r){var i=0;e.$observe("minlength",function(t){i=f(t)||0,r.$validate()}),r.$validators.minlength=function(t,n){return r.$isEmpty(n)||n.length>=i}}}}};return t.angular.bootstrap?void(t.console&&console.log("WARNING: Tried to load angular more than once.")):(st(),bt(Xr),Xr.module("ngLocale",[],["$provide",function(t){function n(t){t+="";var n=t.indexOf(".");return n==-1?0:t.length-n-1}function e(t,e){var r=e;void 0===r&&(r=Math.min(n(t),3));var i=Math.pow(10,r),o=(t*i|0)%i;return{v:r,f:o}}var r={ZERO:"zero",ONE:"one",TWO:"two",FEW:"few",MANY:"many",OTHER:"other"};t.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],SHORTDAY:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SHORTMONTH:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],STANDALONEMONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-¤",negSuf:"",posPre:"¤",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(t,n){var i=0|t,o=e(t,n);return 1==i&&0==o.v?r.ONE:r.OTHER}})}]),void qr(t.document).ready(function(){rt(t.document,it)}))}(window),!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>'),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(t,n,e){"use strict";function r(t,n){return I(new(I(function(){},{prototype:t})),n)}function i(t){return F(arguments,function(n){n!==t&&F(n,function(n,e){t.hasOwnProperty(e)||(t[e]=n)})}),t}function o(t,n){var e=[];for(var r in t.path){if(t.path[r]!==n.path[r])break;e.push(t.path[r])}return e}function a(t){if(Object.keys)return Object.keys(t);var n=[];return F(t,function(t,e){n.push(e)}),n}function u(t,n){if(Array.prototype.indexOf)return t.indexOf(n,Number(arguments[2])||0);var e=t.length>>>0,r=Number(arguments[2])||0;for(r=r<0?Math.ceil(r):Math.floor(r),r<0&&(r+=e);r<e;r++)if(r in t&&t[r]===n)return r;return-1}function s(t,n,e,r){var i,s=o(e,r),l={},c=[];for(var f in s)if(s[f].params&&(i=a(s[f].params),i.length))for(var h in i)u(c,i[h])>=0||(c.push(i[h]),l[i[h]]=t[i[h]]);return I({},l,n)}function l(t,n,e){if(!e){e=[];for(var r in t)e.push(r)}for(var i=0;i<e.length;i++){var o=e[i];if(t[o]!=n[o])return!1}return!0}function c(t,n){var e={};return F(t,function(t){e[t]=n[t]}),e}function f(t){var n={},e=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return F(e,function(e){e in t&&(n[e]=t[e])}),n}function h(t){var n={},e=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var r in t)u(e,r)==-1&&(n[r]=t[r]);return n}function p(t,n){var e=D(t),r=e?[]:{};return F(t,function(t,i){n(t,i)&&(r[e?r.length:i]=t)}),r}function d(t,n){var e=D(t)?[]:{};return F(t,function(t,r){e[r]=n(t,r)}),e}function v(t,n){var r=1,o=2,s={},l=[],c=s,f=I(t.when(s),{$$promises:s,$$values:s});this.study=function(s){function p(t,e){if(y[e]!==o){if(m.push(e),y[e]===r)throw m.splice(0,u(m,e)),new Error("Cyclic dependency: "+m.join(" -> "));if(y[e]=r,j(t))g.push(e,[function(){return n.get(t)}],l);else{var i=n.annotate(t);F(i,function(t){t!==e&&s.hasOwnProperty(t)&&p(s[t],t)}),g.push(e,t,i)}m.pop(),y[e]=o}}function d(t){return R(t)&&t.then&&t.$$promises}if(!R(s))throw new Error("'invocables' must be an object");var v=a(s||{}),g=[],m=[],y={};return F(s,p),s=m=y=null,function(r,o,a){function u(){--b||(x||i($,o.$$values),m.$$values=$,m.$$promises=m.$$promises||!0,delete m.$$inheritedValues,p.resolve($))}function s(t){m.$$failure=t,p.reject(t)}function l(e,i,o){function l(t){f.reject(t),s(t)}function c(){if(!L(m.$$failure))try{f.resolve(n.invoke(i,a,$)),f.promise.then(function(t){$[e]=t,u()},l)}catch(t){l(t)}}var f=t.defer(),h=0;F(o,function(t){y.hasOwnProperty(t)&&!r.hasOwnProperty(t)&&(h++,y[t].then(function(n){$[t]=n,--h||c()},l))}),h||c(),y[e]=f.promise}if(d(r)&&a===e&&(a=o,o=r,r=null),r){if(!R(r))throw new Error("'locals' must be an object")}else r=c;if(o){if(!d(o))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else o=f;var p=t.defer(),m=p.promise,y=m.$$promises={},$=I({},r),b=1+g.length/3,x=!1;if(L(o.$$failure))return s(o.$$failure),m;o.$$inheritedValues&&i($,h(o.$$inheritedValues,v)),I(y,o.$$promises),o.$$values?(x=i($,h(o.$$values,v)),m.$$inheritedValues=h(o.$$values,v),u()):(o.$$inheritedValues&&(m.$$inheritedValues=h(o.$$inheritedValues,v)),o.then(u,s));for(var w=0,C=g.length;w<C;w+=3)r.hasOwnProperty(g[w])?u():l(g[w],g[w+1],g[w+2]);return m}},this.resolve=function(t,n,e,r){return this.study(t)(n,e,r)}}function g(t,n,e){this.fromConfig=function(t,n,e){return L(t.template)?this.fromString(t.template,n):L(t.templateUrl)?this.fromUrl(t.templateUrl,n):L(t.templateProvider)?this.fromProvider(t.templateProvider,n,e):null},this.fromString=function(t,n){return N(t)?t(n):t},this.fromUrl=function(e,r){return N(e)&&(e=e(r)),null==e?null:t.get(e,{cache:n,headers:{Accept:"text/html"}}).then(function(t){return t.data})},this.fromProvider=function(t,n,r){return e.invoke(t,null,r||{params:n})}}function m(t,n,i){function o(n,e,r,i){if(g.push(n),d[n])return d[n];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(n))throw new Error("Invalid parameter name '"+n+"' in pattern '"+t+"'");if(v[n])throw new Error("Duplicate parameter name '"+n+"' in pattern '"+t+"'");return v[n]=new q.Param(n,e,r,i),v[n]}function a(t,n,e,r){var i=["",""],o=t.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!n)return o;switch(e){case!1:i=["(",")"+(r?"?":"")];break;case!0:i=["?(",")?"];break;default:i=["("+e+"|",")?"]}return o+i[0]+n+i[1]}function u(i,o){var a,u,s,l,c;return a=i[2]||i[3],c=n.params[a],s=t.substring(h,i.index),u=o?i[4]:i[4]||("*"==i[1]?".*":null),l=q.type(u||"string")||r(q.type("string"),{pattern:new RegExp(u,n.caseInsensitive?"i":e)}),{id:a,regexp:u,segment:s,type:l,cfg:c}}n=I({params:{}},R(n)?n:{});var s,l=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,c=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f="^",h=0,p=this.segments=[],d=i?i.params:{},v=this.params=i?i.params.$$new():new q.ParamSet,g=[];this.source=t;for(var m,y,$;(s=l.exec(t))&&(m=u(s,!1),!(m.segment.indexOf("?")>=0));)y=o(m.id,m.type,m.cfg,"path"),f+=a(m.segment,y.type.pattern.source,y.squash,y.isOptional),p.push(m.segment),h=l.lastIndex;$=t.substring(h);var b=$.indexOf("?");if(b>=0){var x=this.sourceSearch=$.substring(b);if($=$.substring(0,b),this.sourcePath=t.substring(0,h+b),x.length>0)for(h=0;s=c.exec(x);)m=u(s,!0),y=o(m.id,m.type,m.cfg,"search"),h=l.lastIndex}else this.sourcePath=t,this.sourceSearch="";f+=a($)+(n.strict===!1?"/?":"")+"$",p.push($),this.regexp=new RegExp(f,n.caseInsensitive?"i":e),this.prefix=p[0],this.$$paramNames=g}function y(t){I(this,t)}function $(){function t(t){return null!=t?t.toString().replace(/\//g,"%2F"):t}function i(t){return null!=t?t.toString().replace(/%2F/g,"/"):t}function o(){return{strict:v,caseInsensitive:h}}function s(t){return N(t)||D(t)&&N(t[t.length-1])}function l(){for(;w.length;){var t=w.shift();if(t.pattern)throw new Error("You cannot override a type's .pattern at runtime.");n.extend(b[t.name],f.invoke(t.def))}}function c(t){I(this,t||{})}q=this;var f,h=!1,v=!0,g=!1,b={},x=!0,w=[],C={string:{encode:t,decode:i,is:function(t){return null==t||!L(t)||"string"==typeof t},pattern:/[^\/]*/},"int":{encode:t,decode:function(t){return parseInt(t,10)},is:function(t){return L(t)&&this.decode(t.toString())===t},pattern:/\d+/},bool:{encode:function(t){return t?1:0},decode:function(t){return 0!==parseInt(t,10)},is:function(t){return t===!0||t===!1},pattern:/0|1/},date:{encode:function(t){return this.is(t)?[t.getFullYear(),("0"+(t.getMonth()+1)).slice(-2),("0"+t.getDate()).slice(-2)].join("-"):e},decode:function(t){if(this.is(t))return t;var n=this.capture.exec(t);return n?new Date(n[1],n[2]-1,n[3]):e},is:function(t){return t instanceof Date&&!isNaN(t.valueOf())},equals:function(t,n){return this.is(t)&&this.is(n)&&t.toISOString()===n.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:n.toJson,decode:n.fromJson,is:n.isObject,equals:n.equals,pattern:/[^\/]*/},any:{encode:n.identity,decode:n.identity,equals:n.equals,pattern:/.*/}};$.$$getDefaultValue=function(t){if(!s(t.value))return t.value;if(!f)throw new Error("Injectable functions cannot be called at configuration time");return f.invoke(t.value)},this.caseInsensitive=function(t){return L(t)&&(h=t),h},this.strictMode=function(t){return L(t)&&(v=t),v},this.defaultSquashPolicy=function(t){if(!L(t))return g;if(t!==!0&&t!==!1&&!j(t))throw new Error("Invalid squash policy: "+t+". Valid policies: false, true, arbitrary-string");return g=t,t},this.compile=function(t,n){return new m(t,I(o(),n))},this.isMatcher=function(t){if(!R(t))return!1;var n=!0;return F(m.prototype,function(e,r){N(e)&&(n=n&&L(t[r])&&N(t[r]))}),n},this.type=function(t,n,e){if(!L(n))return b[t];if(b.hasOwnProperty(t))throw new Error("A type named '"+t+"' has already been defined.");return b[t]=new y(I({name:t},n)),e&&(w.push({name:t,def:e}),x||l()),this},F(C,function(t,n){b[n]=new y(I({name:n},t))}),b=r(b,{}),this.$get=["$injector",function(t){return f=t,x=!1,l(),F(C,function(t,n){b[n]||(b[n]=new y(t))}),this}],this.Param=function(t,n,r,i){function o(t){var n=R(t)?a(t):[],e=u(n,"value")===-1&&u(n,"type")===-1&&u(n,"squash")===-1&&u(n,"array")===-1;return e&&(t={value:t}),t.$$fn=s(t.value)?t.value:function(){return t.value},t}function l(n,e,r){if(n.type&&e)throw new Error("Param '"+t+"' has two type configurations.");return e?e:n.type?n.type instanceof y?n.type:new y(n.type):"config"===r?b.any:b.string}function c(){var n={array:"search"===i&&"auto"},e=t.match(/\[\]$/)?{array:!0}:{};return I(n,e,r).array}function h(t,n){var e=t.squash;if(!n||e===!1)return!1;if(!L(e)||null==e)return g;if(e===!0||j(e))return e;throw new Error("Invalid squash policy: '"+e+"'. Valid policies: false, true, or arbitrary string")}function v(t,n,r,i){var o,a,s=[{from:"",to:r||n?e:""},{from:null,to:r||n?e:""}];return o=D(t.replace)?t.replace:[],j(i)&&o.push({from:i,to:e}),a=d(o,function(t){return t.from}),p(s,function(t){return u(a,t.from)===-1}).concat(o)}function m(){if(!f)throw new Error("Injectable functions cannot be called at configuration time");var t=f.invoke(r.$$fn);if(null!==t&&t!==e&&!w.type.is(t))throw new Error("Default value ("+t+") for parameter '"+w.id+"' is not an instance of Type ("+w.type.name+")");return t}function $(t){function n(t){return function(n){return n.from===t}}function e(t){var e=d(p(w.replace,n(t)),function(t){return t.to});return e.length?e[0]:t}return t=e(t),L(t)?w.type.$normalize(t):m()}function x(){return"{Param:"+t+" "+n+" squash: '"+M+"' optional: "+S+"}"}var w=this;r=o(r),n=l(r,n,i);var C=c();n=C?n.$asArray(C,"search"===i):n,"string"!==n.name||C||"path"!==i||r.value!==e||(r.value="");var S=r.value!==e,M=h(r,S),_=v(r,C,S,M);I(this,{id:t,type:n,location:i,array:C,squash:M,replace:_,isOptional:S,value:$,dynamic:e,config:r,toString:x})},c.prototype={$$new:function(){return r(this,I(new c,{$$parent:this}))},$$keys:function(){for(var t=[],n=[],e=this,r=a(c.prototype);e;)n.push(e),e=e.$$parent;return n.reverse(),F(n,function(n){F(a(n),function(n){u(t,n)===-1&&u(r,n)===-1&&t.push(n)})}),t},$$values:function(t){var n={},e=this;return F(e.$$keys(),function(r){n[r]=e[r].value(t&&t[r])}),n},$$equals:function(t,n){var e=!0,r=this;return F(r.$$keys(),function(i){var o=t&&t[i],a=n&&n[i];r[i].type.equals(o,a)||(e=!1)}),e},$$validates:function(t){var r,i,o,a,u,s=this.$$keys();for(r=0;r<s.length&&(i=this[s[r]],o=t[s[r]],o!==e&&null!==o||!i.isOptional);r++){if(a=i.type.$normalize(o),!i.type.is(a))return!1;if(u=i.type.encode(a),n.isString(u)&&!i.type.pattern.exec(u))return!1}return!0},$$parent:e},this.ParamSet=c}function b(t,r){function i(t){var n=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(t.source);return null!=n?n[1].replace(/\\(.)/g,"$1"):""}function o(t,n){return t.replace(/\$(\$|\d{1,2})/,function(t,e){return n["$"===e?0:Number(e)]})}function a(t,n,e){if(!e)return!1;var r=t.invoke(n,n,{$match:e});return!L(r)||r}function u(r,i,o,a){function u(t,n,e){return"/"===v?t:n?v.slice(0,-1)+t:e?v.slice(1)+t:t}function h(t){function n(t){var n=t(o,r);return!!n&&(j(n)&&r.replace().url(n),!0)}if(!t||!t.defaultPrevented){d&&r.url()===d;d=e;var i,a=l.length;for(i=0;i<a;i++)if(n(l[i]))return;c&&n(c)}}function p(){return s=s||i.$on("$locationChangeSuccess",h)}var d,v=a.baseHref(),g=r.url();return f||p(),{sync:function(){h()},listen:function(){return p()},update:function(t){return t?void(g=r.url()):void(r.url()!==g&&(r.url(g),r.replace()))},push:function(t,n,i){var o=t.format(n||{});null!==o&&n&&n["#"]&&(o+="#"+n["#"]),r.url(o),d=i&&i.$$avoidResync?r.url():e,i&&i.replace&&r.replace()},href:function(e,i,o){if(!e.validates(i))return null;var a=t.html5Mode();n.isObject(a)&&(a=a.enabled);var s=e.format(i);if(o=o||{},a||null===s||(s="#"+t.hashPrefix()+s),null!==s&&i&&i["#"]&&(s+="#"+i["#"]),s=u(s,a,o.absolute),!o.absolute||!s)return s;var l=!a&&s?"/":"",c=r.port();return c=80===c||443===c?"":":"+c,[r.protocol(),"://",r.host(),c,l,s].join("")}}}var s,l=[],c=null,f=!1;this.rule=function(t){if(!N(t))throw new Error("'rule' must be a function");return l.push(t),this},this.otherwise=function(t){if(j(t)){var n=t;t=function(){return n}}else if(!N(t))throw new Error("'rule' must be a function");return c=t,this},this.when=function(t,n){var e,u=j(n);if(j(t)&&(t=r.compile(t)),!u&&!N(n)&&!D(n))throw new Error("invalid 'handler' in when()");var s={matcher:function(t,n){return u&&(e=r.compile(n),n=["$match",function(t){return e.format(t)}]),I(function(e,r){return a(e,n,t.exec(r.path(),r.search()))},{prefix:j(t.prefix)?t.prefix:""})},regex:function(t,n){if(t.global||t.sticky)throw new Error("when() RegExp must not be global or sticky");return u&&(e=n,n=["$match",function(t){return o(e,t)}]),I(function(e,r){return a(e,n,t.exec(r.path()))},{prefix:i(t)})}},l={matcher:r.isMatcher(t),regex:t instanceof RegExp};for(var c in l)if(l[c])return this.rule(s[c](t,n));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(t){t===e&&(t=!0),f=t},this.$get=u,u.$inject=["$location","$rootScope","$injector","$browser"]}function x(t,i){function o(t){return 0===t.indexOf(".")||0===t.indexOf("^")}function h(t,n){if(!t)return e;var r=j(t),i=r?t:t.name,a=o(i);if(a){if(!n)throw new Error("No reference point given for path '"+i+"'");n=h(n);for(var u=i.split("."),s=0,l=u.length,c=n;s<l;s++)if(""!==u[s]||0!==s){if("^"!==u[s])break;if(!c.parent)throw new Error("Path '"+i+"' not valid for state '"+n.name+"'");c=c.parent}else c=n;u=u.slice(s).join("."),i=c.name+(c.name&&u?".":"")+u}var f=M[i];return!f||!r&&(r||f!==t&&f.self!==t)?e:f}function p(t,n){_[t]||(_[t]=[]),_[t].push(n)}function v(t){for(var n=_[t]||[];n.length;)g(n.shift())}function g(n){n=r(n,{self:n,resolve:n.resolve||{},toString:function(){return this.name}});var e=n.name;if(!j(e)||e.indexOf("@")>=0)throw new Error("State must have a valid name");if(M.hasOwnProperty(e))throw new Error("State '"+e+"'' is already defined");var i=e.indexOf(".")!==-1?e.substring(0,e.lastIndexOf(".")):j(n.parent)?n.parent:R(n.parent)&&j(n.parent.name)?n.parent.name:"";if(i&&!M[i])return p(i,n.self);for(var o in A)N(A[o])&&(n[o]=A[o](n,A.$delegates[o]));return M[e]=n,!n[k]&&n.url&&t.when(n.url,["$match","$stateParams",function(t,e){S.$current.navigable==n&&l(t,e)||S.transitionTo(n,t,{inherit:!0,location:!1})}]),v(e),n}function m(t){return t.indexOf("*")>-1}function y(t){for(var n=t.split("."),e=S.$current.name.split("."),r=0,i=n.length;r<i;r++)"*"===n[r]&&(e[r]="*");return"**"===n[0]&&(e=e.slice(u(e,n[1])),e.unshift("**")),"**"===n[n.length-1]&&(e.splice(u(e,n[n.length-2])+1,Number.MAX_VALUE),e.push("**")),n.length==e.length&&e.join("")===n.join("")}function $(t,n){return j(t)&&!L(n)?A[t]:N(n)&&j(t)?(A[t]&&!A.$delegates[t]&&(A.$delegates[t]=A[t]),A[t]=n,this):this}function b(t,n){return R(t)?n=t:n.name=t,g(n),this}function x(t,i,o,u,f,p,v,g,$){function b(n,e,r,o){var a=t.$broadcast("$stateNotFound",n,e,r);if(a.defaultPrevented)return v.update(),E;if(!a.retry)return null;if(o.$retry)return v.update(),P;var u=S.transition=i.when(a.retry);return u.then(function(){return u!==S.transition?_:(n.options.$retry=!0,S.transitionTo(n.to,n.toParams,n.options))},function(){return E}),v.update(),u}function x(t,e,r,a,s,l){function h(){var e=[];return F(t.views,function(r,i){var a=r.resolve&&r.resolve!==t.resolve?r.resolve:{};a.$template=[function(){return o.load(i,{view:r,locals:s.globals,params:p,notify:l.notify})||""}],e.push(f.resolve(a,s.globals,s.resolve,t).then(function(e){if(N(r.controllerProvider)||D(r.controllerProvider)){var o=n.extend({},a,s.globals);e.$$controller=u.invoke(r.controllerProvider,null,o)}else e.$$controller=r.controller;e.$$state=t,e.$$controllerAs=r.controllerAs,s[i]=e}))}),i.all(e).then(function(){return s.globals})}var p=r?e:c(t.params.$$keys(),e),d={$stateParams:p};s.resolve=f.resolve(t.resolve,d,s.resolve,t);var v=[s.resolve.then(function(t){s.globals=t})];return a&&v.push(a),i.all(v).then(h).then(function(t){return s})}var _=i.reject(new Error("transition superseded")),A=i.reject(new Error("transition prevented")),E=i.reject(new Error("transition aborted")),P=i.reject(new Error("transition failed"));return C.locals={resolve:null,globals:{$stateParams:{}}},S={params:{},current:C.self,$current:C,transition:null},S.reload=function(t){return S.transitionTo(S.current,p,{reload:t||!0,inherit:!1,notify:!0})},S.go=function(t,n,e){return S.transitionTo(t,n,I({inherit:!0,relative:S.$current},e))},S.transitionTo=function(n,e,o){e=e||{},o=I({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},o||{});var a,l=S.$current,f=S.params,d=l.path,g=h(n,o.relative),m=e["#"];if(!L(g)){var y={to:n,toParams:e,options:o},$=b(y,l.self,f,o);if($)return $;if(n=y.to,e=y.toParams,o=y.options,g=h(n,o.relative),!L(g)){if(!o.relative)throw new Error("No such state '"+n+"'");throw new Error("Could not resolve '"+n+"' from state '"+o.relative+"'")}}if(g[k])throw new Error("Cannot transition to abstract state '"+n+"'");if(o.inherit&&(e=s(p,e||{},S.$current,g)),!g.params.$$validates(e))return P;e=g.params.$$values(e),n=g;var M=n.path,E=0,O=M[E],T=C.locals,N=[];if(o.reload){if(j(o.reload)||R(o.reload)){if(R(o.reload)&&!o.reload.name)throw new Error("Invalid reload state object");var D=o.reload===!0?d[0]:h(o.reload);if(o.reload&&!D)throw new Error("No such reload state '"+(j(o.reload)?o.reload:o.reload.name)+"'");for(;O&&O===d[E]&&O!==D;)T=N[E]=O.locals,E++,O=M[E]}}else for(;O&&O===d[E]&&O.ownParams.$$equals(e,f);)T=N[E]=O.locals,E++,O=M[E];if(w(n,e,l,f,T,o))return m&&(e["#"]=m),S.params=e,V(S.params,p),o.location&&n.navigable&&n.navigable.url&&(v.push(n.navigable.url,e,{$$avoidResync:!0,replace:"replace"===o.location}),v.update(!0)),S.transition=null,i.when(S.current);if(e=c(n.params.$$keys(),e||{}),o.notify&&t.$broadcast("$stateChangeStart",n.self,e,l.self,f).defaultPrevented)return t.$broadcast("$stateChangeCancel",n.self,e,l.self,f),v.update(),A;for(var F=i.when(T),q=E;q<M.length;q++,O=M[q])T=N[q]=r(T),F=x(O,e,O===n,F,T,o);var z=S.transition=F.then(function(){var r,i,a;if(S.transition!==z)return _;for(r=d.length-1;r>=E;r--)a=d[r],a.self.onExit&&u.invoke(a.self.onExit,a.self,a.locals.globals),a.locals=null;for(r=E;r<M.length;r++)i=M[r],i.locals=N[r],i.self.onEnter&&u.invoke(i.self.onEnter,i.self,i.locals.globals);return m&&(e["#"]=m),S.transition!==z?_:(S.$current=n,S.current=n.self,S.params=e,V(S.params,p),S.transition=null,o.location&&n.navigable&&v.push(n.navigable.url,n.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:"replace"===o.location}),o.notify&&t.$broadcast("$stateChangeSuccess",n.self,e,l.self,f),v.update(!0),S.current)},function(r){return S.transition!==z?_:(S.transition=null,a=t.$broadcast("$stateChangeError",n.self,e,l.self,f,r),a.defaultPrevented||v.update(),i.reject(r))});return z},S.is=function(t,n,r){r=I({relative:S.$current},r||{});var i=h(t,r.relative);return L(i)?S.$current===i&&(!n||l(i.params.$$values(n),p)):e},S.includes=function(t,n,r){if(r=I({relative:S.$current},r||{}),j(t)&&m(t)){if(!y(t))return!1;t=S.$current.name}var i=h(t,r.relative);return L(i)?!!L(S.$current.includes[i.name])&&(!n||l(i.params.$$values(n),p,a(n))):e},S.href=function(t,n,r){r=I({lossy:!0,inherit:!0,absolute:!1,relative:S.$current},r||{});var i=h(t,r.relative);if(!L(i))return null;r.inherit&&(n=s(p,n||{},S.$current,i));var o=i&&r.lossy?i.navigable:i;return o&&o.url!==e&&null!==o.url?v.href(o.url,c(i.params.$$keys().concat("#"),n||{}),{absolute:r.absolute}):null},S.get=function(t,n){if(0===arguments.length)return d(a(M),function(t){return M[t].self});var e=h(t,n||S.$current);return e&&e.self?e.self:null},S}function w(t,n,e,r,i,o){function a(t,n,e){function r(n){return"search"!=t.params[n].location}var i=t.params.$$keys().filter(r),o=f.apply({},[t.params].concat(i)),a=new q.ParamSet(o);return a.$$equals(n,e);
-}if(!o.reload&&t===e&&(i===e.locals||t.self.reloadOnSearch===!1&&a(e,r,n)))return!0}var C,S,M={},_={},k="abstract",A={parent:function(t){if(L(t.parent)&&t.parent)return h(t.parent);var n=/^(.+)\.[^.]+$/.exec(t.name);return n?h(n[1]):C},data:function(t){return t.parent&&t.parent.data&&(t.data=t.self.data=I({},t.parent.data,t.data)),t.data},url:function(t){var n=t.url,e={params:t.params||{}};if(j(n))return"^"==n.charAt(0)?i.compile(n.substring(1),e):(t.parent.navigable||C).url.concat(n,e);if(!n||i.isMatcher(n))return n;throw new Error("Invalid url '"+n+"' in state '"+t+"'")},navigable:function(t){return t.url?t:t.parent?t.parent.navigable:null},ownParams:function(t){var n=t.url&&t.url.params||new q.ParamSet;return F(t.params||{},function(t,e){n[e]||(n[e]=new q.Param(e,null,t,"config"))}),n},params:function(t){return t.parent&&t.parent.params?I(t.parent.params.$$new(),t.ownParams):new q.ParamSet},views:function(t){var n={};return F(L(t.views)?t.views:{"":t},function(e,r){r.indexOf("@")<0&&(r+="@"+t.parent.name),n[r]=e}),n},path:function(t){return t.parent?t.parent.path.concat(t):[]},includes:function(t){var n=t.parent?I({},t.parent.includes):{};return n[t.name]=!0,n},$delegates:{}};C=g({name:"",url:"^",views:null,"abstract":!0}),C.navigable=null,this.decorator=$,this.state=b,this.$get=x,x.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$urlRouter","$location","$urlMatcherFactory"]}function w(){function t(t,n){return{load:function(e,r){var i,o={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return r=I(o,r),r.view&&(i=n.fromConfig(r.view,r.params,r.locals)),i&&r.notify&&t.$broadcast("$viewContentLoading",r),i}}}this.$get=t,t.$inject=["$rootScope","$templateFactory"]}function C(){var t=!1;this.useAnchorScroll=function(){t=!0},this.$get=["$anchorScroll","$timeout",function(n,e){return t?n:function(t){return e(function(){t[0].scrollIntoView()},0,!1)}}]}function S(t,e,r,i){function o(){return e.has?function(t){return e.has(t)?e.get(t):null}:function(t){try{return e.get(t)}catch(n){return null}}}function a(t,n){var e=function(){return{enter:function(t,n,e){n.after(t),e()},leave:function(t,n){t.remove(),n()}}};if(l)return{enter:function(t,n,e){var r=l.enter(t,null,n,e);r&&r.then&&r.then(e)},leave:function(t,n){var e=l.leave(t,n);e&&e.then&&e.then(n)}};if(s){var r=s&&s(n,t);return{enter:function(t,n,e){r.enter(t,null,n),e()},leave:function(t,n){r.leave(t),n()}}}return e()}var u=o(),s=u("$animator"),l=u("$animate"),c={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(e,o,u){return function(e,o,s){function l(){f&&(f.remove(),f=null),p&&(p.$destroy(),p=null),h&&(m.leave(h,function(){f=null}),f=h,h=null)}function c(a){var c,f=_(e,s,o,i),y=f&&t.$current&&t.$current.locals[f];if(a||y!==d){c=e.$new(),d=t.$current.locals[f];var $=u(c,function(t){m.enter(t,o,function(){p&&p.$emit("$viewContentAnimationEnded"),(n.isDefined(g)&&!g||e.$eval(g))&&r(t)}),l()});h=$,p=c,p.$emit("$viewContentLoaded"),p.$eval(v)}}var f,h,p,d,v=s.onload||"",g=s.autoscroll,m=a(s,e);e.$on("$stateChangeSuccess",function(){c(!1)}),e.$on("$viewContentLoading",function(){c(!1)}),c(!0)}}};return c}function M(t,n,e,r){return{restrict:"ECA",priority:-400,compile:function(i){var o=i.html();return function(i,a,u){var s=e.$current,l=_(i,u,a,r),c=s&&s.locals[l];if(c){a.data("$uiView",{name:l,state:c.$$state}),a.html(c.$template?c.$template:o);var f=t(a.contents());if(c.$$controller){c.$scope=i,c.$element=a;var h=n(c.$$controller,c);c.$$controllerAs&&(i[c.$$controllerAs]=h),a.data("$ngControllerController",h),a.children().data("$ngControllerController",h)}f(i)}}}}}function _(t,n,e,r){var i=r(n.uiView||n.name||"")(t),o=e.inheritedData("$uiView");return i.indexOf("@")>=0?i:i+"@"+(o?o.state.name:"")}function k(t,n){var e,r=t.match(/^\s*({[^}]*})\s*$/);if(r&&(t=n+"("+r[1]+")"),e=t.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!e||4!==e.length)throw new Error("Invalid state ref '"+t+"'");return{state:e[1],paramExpr:e[3]||null}}function A(t){var n=t.parent().inheritedData("$uiView");if(n&&n.state&&n.state.name)return n.state}function E(t,e){var r=["location","inherit","reload","absolute"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(i,o,a,u){var s=k(a.uiSref,t.current.name),l=null,c=A(o)||t.$current,f="[object SVGAnimatedString]"===Object.prototype.toString.call(o.prop("href"))?"xlink:href":"href",h=null,p="A"===o.prop("tagName").toUpperCase(),d="FORM"===o[0].nodeName,v=d?"action":f,g=!0,m={relative:c,inherit:!0},y=i.$eval(a.uiSrefOpts)||{};n.forEach(r,function(t){t in y&&(m[t]=y[t])});var $=function(e){if(e&&(l=n.copy(e)),g){h=t.href(s.state,l,m);var r=u[1]||u[0];return r&&r.$$addStateInfo(s.state,l),null===h?(g=!1,!1):void a.$set(v,h)}};s.paramExpr&&(i.$watch(s.paramExpr,function(t,n){t!==l&&$(t)},!0),l=n.copy(i.$eval(s.paramExpr))),$(),d||o.bind("click",function(n){var r=n.which||n.button;if(!(r>1||n.ctrlKey||n.metaKey||n.shiftKey||o.attr("target"))){var i=e(function(){t.go(s.state,l,m)});n.preventDefault();var a=p&&!h?1:0;n.preventDefault=function(){a--<=0&&e.cancel(i)}}})}}}function P(t,n,e){return{restrict:"A",controller:["$scope","$element","$attrs",function(n,r,i){function o(){a()?r.addClass(s):r.removeClass(s)}function a(){for(var t=0;t<l.length;t++)if(u(l[t].state,l[t].params))return!0;return!1}function u(n,e){return"undefined"!=typeof i.uiSrefActiveEq?t.is(n.name,e):t.includes(n.name,e)}var s,l=[];s=e(i.uiSrefActiveEq||i.uiSrefActive||"",!1)(n),this.$$addStateInfo=function(n,e){var i=t.get(n,A(r));l.push({state:i||{name:n},params:e}),o()},n.$on("$stateChangeSuccess",o)}]}}function O(t){var n=function(n){return t.is(n)};return n.$stateful=!0,n}function T(t){var n=function(n){return t.includes(n)};return n.$stateful=!0,n}var L=n.isDefined,N=n.isFunction,j=n.isString,R=n.isObject,D=n.isArray,F=n.forEach,I=n.extend,V=n.copy;n.module("ui.router.util",["ng"]),n.module("ui.router.router",["ui.router.util"]),n.module("ui.router.state",["ui.router.router","ui.router.util"]),n.module("ui.router",["ui.router.state"]),n.module("ui.router.compat",["ui.router"]),v.$inject=["$q","$injector"],n.module("ui.router.util").service("$resolve",v),g.$inject=["$http","$templateCache","$injector"],n.module("ui.router.util").service("$templateFactory",g);var q;m.prototype.concat=function(t,n){var e={caseInsensitive:q.caseInsensitive(),strict:q.strictMode(),squash:q.defaultSquashPolicy()};return new m(this.sourcePath+t+this.sourceSearch,I(e,n),this)},m.prototype.toString=function(){return this.source},m.prototype.exec=function(t,n){function e(t){function n(t){return t.split("").reverse().join("")}function e(t){return t.replace(/\\-/g,"-")}var r=n(t).split(/-(?!\\)/),i=d(r,n);return d(i,e).reverse()}var r=this.regexp.exec(t);if(!r)return null;n=n||{};var i,o,a,u=this.parameters(),s=u.length,l=this.segments.length-1,c={};if(l!==r.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(i=0;i<l;i++){a=u[i];var f=this.params[a],h=r[i+1];for(o=0;o<f.replace;o++)f.replace[o].from===h&&(h=f.replace[o].to);h&&f.array===!0&&(h=e(h)),c[a]=f.value(h)}for(;i<s;i++)a=u[i],c[a]=this.params[a].value(n[a]);return c},m.prototype.parameters=function(t){return L(t)?this.params[t]||null:this.$$paramNames},m.prototype.validates=function(t){return this.params.$$validates(t)},m.prototype.format=function(t){function n(t){return encodeURIComponent(t).replace(/-/g,function(t){return"%5C%"+t.charCodeAt(0).toString(16).toUpperCase()})}t=t||{};var e=this.segments,r=this.parameters(),i=this.params;if(!this.validates(t))return null;var o,a=!1,u=e.length-1,s=r.length,l=e[0];for(o=0;o<s;o++){var c=o<u,f=r[o],h=i[f],p=h.value(t[f]),v=h.isOptional&&h.type.equals(h.value(),p),g=!!v&&h.squash,m=h.type.encode(p);if(c){var y=e[o+1];if(g===!1)null!=m&&(l+=D(m)?d(m,n).join("-"):encodeURIComponent(m)),l+=y;else if(g===!0){var $=l.match(/\/$/)?/\/?(.*)/:/(.*)/;l+=y.match($)[1]}else j(g)&&(l+=g+y)}else{if(null==m||v&&g!==!1)continue;D(m)||(m=[m]),m=d(m,encodeURIComponent).join("&"+f+"="),l+=(a?"&":"?")+(f+"="+m),a=!0}}return l},y.prototype.is=function(t,n){return!0},y.prototype.encode=function(t,n){return t},y.prototype.decode=function(t,n){return t},y.prototype.equals=function(t,n){return t==n},y.prototype.$subPattern=function(){var t=this.pattern.toString();return t.substr(1,t.length-2)},y.prototype.pattern=/.*/,y.prototype.toString=function(){return"{Type:"+this.name+"}"},y.prototype.$normalize=function(t){return this.is(t)?t:this.decode(t)},y.prototype.$asArray=function(t,n){function r(t,n){function r(t,n){return function(){return t[n].apply(t,arguments)}}function i(t){return D(t)?t:L(t)?[t]:[]}function o(t){switch(t.length){case 0:return e;case 1:return"auto"===n?t[0]:t;default:return t}}function a(t){return!t}function u(t,n){return function(e){e=i(e);var r=d(e,t);return n===!0?0===p(r,a).length:o(r)}}function s(t){return function(n,e){var r=i(n),o=i(e);if(r.length!==o.length)return!1;for(var a=0;a<r.length;a++)if(!t(r[a],o[a]))return!1;return!0}}this.encode=u(r(t,"encode")),this.decode=u(r(t,"decode")),this.is=u(r(t,"is"),!0),this.equals=s(r(t,"equals")),this.pattern=t.pattern,this.$normalize=u(r(t,"$normalize")),this.name=t.name,this.$arrayMode=n}if(!t)return this;if("auto"===t&&!n)throw new Error("'auto' array mode is for query parameters only");return new r(this,t)},n.module("ui.router.util").provider("$urlMatcherFactory",$),n.module("ui.router.util").run(["$urlMatcherFactory",function(t){}]),b.$inject=["$locationProvider","$urlMatcherFactoryProvider"],n.module("ui.router.router").provider("$urlRouter",b),x.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider"],n.module("ui.router.state").value("$stateParams",{}).provider("$state",x),w.$inject=[],n.module("ui.router.state").provider("$view",w),n.module("ui.router.state").provider("$uiViewScroll",C),S.$inject=["$state","$injector","$uiViewScroll","$interpolate"],M.$inject=["$compile","$controller","$state","$interpolate"],n.module("ui.router.state").directive("uiView",S),n.module("ui.router.state").directive("uiView",M),E.$inject=["$state","$timeout"],P.$inject=["$state","$stateParams","$interpolate"],n.module("ui.router.state").directive("uiSref",E).directive("uiSrefActive",P).directive("uiSrefActiveEq",P),O.$inject=["$state"],T.$inject=["$state"],n.module("ui.router.state").filter("isState",O).filter("includedByState",T)}(window,window.angular),function(t,n){"use strict";function e(t){return null!=t&&""!==t&&"hasOwnProperty"!==t&&a.test("."+t)}function r(t,r){if(!e(r))throw o("badmember",'Dotted member path "@{0}" is invalid.',r);for(var i=r.split("."),a=0,u=i.length;a<u&&n.isDefined(t);a++){var s=i[a];t=null!==t?t[s]:void 0}return t}function i(t,e){e=e||{},n.forEach(e,function(t,n){delete e[n]});for(var r in t)!t.hasOwnProperty(r)||"$"===r.charAt(0)&&"$"===r.charAt(1)||(e[r]=t[r]);return e}var o=n.$$minErr("$resource"),a=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;n.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/[^\/]*/,e=this;this.defaults={stripTrailingSlashes:!0,cancellable:!1,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}},this.$get=["$http","$log","$q","$timeout",function(a,u,s,l){function c(t,n){this.template=t,this.defaults=d({},e.defaults,n),this.urlParams={}}function f(t,m,y,$){function b(t,n){var e={};return n=d({},m,n),p(n,function(n,i){g(n)&&(n=n(t)),e[i]=n&&n.charAt&&"@"===n.charAt(0)?r(t,n.substr(1)):n}),e}function x(t){return t.resource}function w(t){i(t||{},this)}var C=new c(t,$);return y=d({},e.defaults.actions,y),w.prototype.toJSON=function(){var t=d({},this);return delete t.$promise,delete t.$resolved,t},p(y,function(t,r){var c=/^(POST|PUT|PATCH)$/i.test(t.method),f=t.timeout,m=n.isDefined(t.cancellable)?t.cancellable:$&&n.isDefined($.cancellable)?$.cancellable:e.defaults.cancellable;f&&!n.isNumber(f)&&(u.debug("ngResource:\n  Only numeric values are allowed as `timeout`.\n  Promises are not supported in $resource, because the same value would be used for multiple requests. If you are looking for a way to cancel requests, you should use the `cancellable` option."),delete t.timeout,f=null),w[r]=function(e,u,y,$){function S(t){F["catch"](h),E.resolve(t)}var M,_,k,A={};switch(arguments.length){case 4:k=$,_=y;case 3:case 2:if(!g(u)){A=e,M=u,_=y;break}if(g(e)){_=e,k=u;break}_=u,k=y;case 1:g(e)?_=e:c?M=e:A=e;break;case 0:break;default:throw o("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var E,P,O=this instanceof w,T=O?M:t.isArray?[]:new w(M),L={},N=t.interceptor&&t.interceptor.response||x,j=t.interceptor&&t.interceptor.responseError||void 0,R=!!k,D=!!j;p(t,function(t,n){switch(n){default:L[n]=v(t);break;case"params":case"isArray":case"interceptor":case"cancellable":}}),!O&&m&&(E=s.defer(),L.timeout=E.promise,f&&(P=l(E.resolve,f))),c&&(L.data=M),C.setUrlParams(L,d({},b(M,t.params||{}),A),t.url);var F=a(L).then(function(e){var a=e.data;if(a){if(n.isArray(a)!==!!t.isArray)throw o("badcfg","Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})",r,t.isArray?"array":"object",n.isArray(a)?"array":"object",L.method,L.url);if(t.isArray)T.length=0,p(a,function(t){"object"==typeof t?T.push(new w(t)):T.push(t)});else{var u=T.$promise;i(a,T),T.$promise=u}}return e.resource=T,e});return F=F["finally"](function(){T.$resolved=!0,!O&&m&&(T.$cancelRequest=n.noop,l.cancel(P),E=P=L.timeout=null)}),F=F.then(function(t){var n=N(t);return(_||h)(n,t.headers),n},R||D?function(t){return R&&k(t),D?j(t):s.reject(t)}:void 0),R&&!D&&F["catch"](h),O?F:(T.$promise=F,T.$resolved=!1,m&&(T.$cancelRequest=S),T)},w.prototype["$"+r]=function(t,n,e){g(t)&&(e=n,n=t,t={});var i=w[r].call(this,t,this,n,e);return i.$promise||i}}),w.bind=function(n){return f(t,d({},m,n),y)},w}var h=n.noop,p=n.forEach,d=n.extend,v=n.copy,g=n.isFunction,m=n.$$encodeUriQuery,y=n.$$encodeUriSegment;return c.prototype={setUrlParams:function(e,r,i){var a,u,s=this,l=i||s.template,c="",f=s.urlParams=Object.create(null);p(l.split(/\W/),function(t){if("hasOwnProperty"===t)throw o("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(t)&&t&&new RegExp("(^|[^\\\\]):"+t+"(\\W|$)").test(l)&&(f[t]={isQueryParamValue:new RegExp("\\?.*=:"+t+"(?:\\W|$)").test(l)})}),l=l.replace(/\\:/g,":"),l=l.replace(t,function(t){return c=t,""}),r=r||{},p(s.urlParams,function(t,e){a=r.hasOwnProperty(e)?r[e]:s.defaults[e],n.isDefined(a)&&null!==a?(u=t.isQueryParamValue?m(a,!0):y(a),l=l.replace(new RegExp(":"+e+"(\\W|$)","g"),function(t,n){return u+n})):l=l.replace(new RegExp("(/?):"+e+"(\\W|$)","g"),function(t,n,e){return"/"===e.charAt(0)?e:n+e})}),s.defaults.stripTrailingSlashes&&(l=l.replace(/\/+$/,"")||"/"),l=l.replace(/\/\.(?=\w+($|\?))/,"."),e.url=c+l.replace(/\/\\\./,"/."),p(r,function(t,n){s.urlParams[n]||(e.params=e.params||{},e.params[n]=t)})}},f}]})}(window,window.angular),function(t,n){"use strict";function e(t,e,r){function i(t,r,i){var a,u;i=i||{},u=i.expires,a=n.isDefined(i.path)?i.path:o,n.isUndefined(r)&&(u="Thu, 01 Jan 1970 00:00:00 GMT",r=""),n.isString(u)&&(u=new Date(u));var s=encodeURIComponent(t)+"="+encodeURIComponent(r);s+=a?";path="+a:"",s+=i.domain?";domain="+i.domain:"",s+=u?";expires="+u.toUTCString():"",s+=i.secure?";secure":"";var l=s.length+1;return l>4096&&e.warn("Cookie '"+t+"' possibly not set or overflowed because it was too large ("+l+" > 4096 bytes)!"),s}var o=r.baseHref(),a=t[0];return function(t,n,e){a.cookie=i(t,n,e)}}n.module("ngCookies",["ng"]).provider("$cookies",[function(){function t(t){return t?n.extend({},e,t):e}var e=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function(e,r){return{get:function(t){return e()[t]},getObject:function(t){var e=this.get(t);return e?n.fromJson(e):e},getAll:function(){return e()},put:function(n,e,i){r(n,e,t(i))},putObject:function(t,e,r){this.put(t,n.toJson(e),r)},remove:function(n,e){r(n,void 0,t(e))}}}]}]),n.module("ngCookies").factory("$cookieStore",["$cookies",function(t){return{get:function(n){return t.getObject(n)},put:function(n,e){t.putObject(n,e)},remove:function(n){t.remove(n)}}}]),e.$inject=["$document","$log","$browser"],n.module("ngCookies").provider("$$cookieWriter",function(){this.$get=e})}(window,window.angular),function(t,n){"use strict";function e(t,n,e){if(!t)throw vt("areq","Argument '{0}' is {1}",n||"?",e||"required");return t}function r(t,n){return t||n?t?n?(Z(t)&&(t=t.join(" ")),Z(n)&&(n=n.join(" ")),t+" "+n):t:n:""}function i(t){var n={};return t&&(t.to||t.from)&&(n.to=t.to,n.from=t.from),n}function o(t,n,e){var r="";return t=Z(t)?t:t&&tt(t)&&t.length?t.split(/\s+/):[],G(t,function(t,i){t&&t.length>0&&(r+=i>0?" ":"",r+=e?n+t:t+n)}),r}function a(t,n){var e=t.indexOf(n);n>=0&&t.splice(e,1)}function u(t){if(t instanceof et)switch(t.length){case 0:return t;case 1:if(t[0].nodeType===D)return t;break;default:return et(s(t))}if(t.nodeType===D)return et(t)}function s(t){if(!t[0])return t;for(var n=0;n<t.length;n++){var e=t[n];if(e.nodeType==D)return e}}function l(t,n,e){G(n,function(n){t.addClass(n,e)})}function c(t,n,e){G(n,function(n){t.removeClass(n,e)})}function f(t){return function(n,e){e.addClass&&(l(t,n,e.addClass),e.addClass=null),e.removeClass&&(c(t,n,e.removeClass),e.removeClass=null)}}function h(t){if(t=t||{},!t.$$prepared){var n=t.domOperation||rt;t.domOperation=function(){t.$$domOperationFired=!0,n(),n=rt},t.$$prepared=!0}return t}function p(t,n){d(t,n),v(t,n)}function d(t,n){n.from&&(t.css(n.from),n.from=null)}function v(t,n){n.to&&(t.css(n.to),n.to=null)}function g(t,n,e){var r=n.options||{},i=e.options||{},o=(r.addClass||"")+" "+(i.addClass||""),a=(r.removeClass||"")+" "+(i.removeClass||""),u=m(t.attr("class"),o,a);i.preparationClasses&&(r.preparationClasses=S(i.preparationClasses,r.preparationClasses),delete i.preparationClasses);var s=r.domOperation!==rt?r.domOperation:null;return Y(r,i),s&&(r.domOperation=s),u.addClass?r.addClass=u.addClass:r.addClass=null,u.removeClass?r.removeClass=u.removeClass:r.removeClass=null,n.addClass=r.addClass,n.removeClass=r.removeClass,r}function m(t,n,e){function r(t){tt(t)&&(t=t.split(" "));var n={};return G(t,function(t){t.length&&(n[t]=!0)}),n}var i=1,o=-1,a={};t=r(t),n=r(n),G(n,function(t,n){a[n]=i}),e=r(e),G(e,function(t,n){a[n]=a[n]===i?null:o});var u={addClass:"",removeClass:""};return G(a,function(n,e){var r,a;n===i?(r="addClass",a=!t[e]||t[e+I]):n===o&&(r="removeClass",a=t[e]||t[e+F]),a&&(u[r].length&&(u[r]+=" "),u[r]+=e)}),u}function y(t){return t instanceof et?t[0]:t}function $(t,n,e){var r="";n&&(r=o(n,V,!0)),e.addClass&&(r=S(r,o(e.addClass,F))),e.removeClass&&(r=S(r,o(e.removeClass,I))),r.length&&(e.preparationClasses=r,t.addClass(r))}function b(t,n){n.preparationClasses&&(t.removeClass(n.preparationClasses),n.preparationClasses=null),n.activeClasses&&(t.removeClass(n.activeClasses),n.activeClasses=null)}function x(t,n){var e=n?"-"+n+"s":"";return C(t,[pt,e]),[pt,e]}function w(t,n){var e=n?"paused":"",r=j+lt;return C(t,[r,e]),[r,e]}function C(t,n){var e=n[0],r=n[1];t.style[e]=r}function S(t,n){return t?n?t+" "+n:t:n}function M(t){return[ht,t+"s"]}function _(t,n){var e=n?ft:pt;return[e,t+"s"]}function k(t,n,e){var r=Object.create(null),i=t.getComputedStyle(n)||{};return G(e,function(t,n){var e=i[t];if(e){var o=e.charAt(0);("-"===o||"+"===o||o>=0)&&(e=A(e)),0===e&&(e=null),r[n]=e}}),r}function A(t){var n=0,e=t.split(/\s*,\s*/);return G(e,function(t){"s"===t.charAt(t.length-1)&&(t=t.substring(0,t.length-1)),t=parseFloat(t)||0,n=n?Math.max(t,n):t}),n}function E(t){return 0===t||null!=t}function P(t,n){var e=L,r=t+"s";return n?e+=it:r+=" linear all",[e,r]}function O(){var t=Object.create(null);return{flush:function(){t=Object.create(null)},count:function(n){var e=t[n];return e?e.total:0},get:function(n){var e=t[n];return e&&e.value},put:function(n,e){t[n]?t[n].total++:t[n]={total:1,value:e}}}}function T(t,n,e){G(e,function(e){t[e]=X(t[e])?t[e]:n.style.getPropertyValue(e)})}var L,N,j,R,D=1,F="-add",I="-remove",V="ng-",q="-active",z="-prepare",B="ng-animate",U="$$ngAnimateChildren",W="";void 0===t.ontransitionend&&void 0!==t.onwebkittransitionend?(W="-webkit-",L="WebkitTransition",N="webkitTransitionEnd transitionend"):(L="transition",N="transitionend"),void 0===t.onanimationend&&void 0!==t.onwebkitanimationend?(W="-webkit-",j="WebkitAnimation",R="webkitAnimationEnd animationend"):(j="animation",R="animationend");var H,Y,G,Z,X,J,K,Q,tt,nt,et,rt,it="Duration",ot="Property",at="Delay",ut="TimingFunction",st="IterationCount",lt="PlayState",ct=9999,ft=j+at,ht=j+it,pt=L+at,dt=L+it,vt=n.$$minErr("ng"),gt=["$$rAF",function(t){function n(t){r=r.concat(t),e()}function e(){if(r.length){for(var n=r.shift(),o=0;o<n.length;o++)n[o]();i||t(function(){i||e()})}}var r,i;return r=n.queue=[],n.waitUntilQuiet=function(n){i&&i(),i=t(function(){i=null,n(),e()})},n}],mt=["$interpolate",function(t){return{link:function(n,e,r){function i(t){t="on"===t||"true"===t,e.data(U,t)}var o=r.ngAnimateChildren;tt(o)&&0===o.length?e.data(U,!0):(i(t(o)(n)),r.$observe("ngAnimateChildren",i))}}}],yt="$$animateCss",$t=1e3,bt=3,xt=1.5,wt={transitionDuration:dt,transitionDelay:pt,transitionProperty:L+ot,animationDuration:ht,animationDelay:ft,animationIterationCount:j+st},Ct={transitionDuration:dt,transitionDelay:pt,animationDuration:ht,animationDelay:ft},St=["$animateProvider",function(t){var n=O(),e=O();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(t,r,u,s,l,c,g,m){function $(t,n){var e="$$ngAnimateParentKey",r=t.parentNode,i=r[e]||(r[e]=++z);return i+"-"+t.getAttribute("class")+"-"+n}function b(e,r,i,o){var a=n.get(i);return a||(a=k(t,e,o),"infinite"===a.animationIterationCount&&(a.animationIterationCount=1)),n.put(i,a),a}function S(i,a,u,s){var l;if(n.count(u)>0&&(l=e.get(u),!l)){var c=o(a,"-stagger");r.addClass(i,c),l=k(t,i,s),l.animationDuration=Math.max(l.animationDuration,0),l.transitionDuration=Math.max(l.transitionDuration,0),r.removeClass(i,c),e.put(u,l)}return l||{}}function A(t){B.push(t),g.waitUntilQuiet(function(){n.flush(),e.flush();for(var t=l(),r=0;r<B.length;r++)B[r](t);B.length=0})}function O(t,n,e){var r=b(t,n,e,wt),i=r.animationDelay,o=r.transitionDelay;return r.maxDelay=i&&o?Math.max(i,o):i||o,r.maxDuration=Math.max(r.animationDuration*r.animationIterationCount,r.transitionDuration),r}var D=f(r),z=0,B=[];return function(t,e){function l(){g()}function f(){g(!0)}function g(n){if(!(X||K&&J)){X=!0,J=!1,U.$$skipPreparationClasses||r.removeClass(t,wt),r.removeClass(t,Mt),w(Y,!1),x(Y,!1),G(lt,function(t){Y.style[t[0]]=""}),D(t,U),p(t,U),Object.keys(W).length&&G(W,function(t,n){t?Y.style.setProperty(n,t):Y.style.removeProperty(n)}),U.onDone&&U.onDone(),pt&&pt.length&&t.off(pt.join(" "),z);var e=t.data(yt);e&&(s.cancel(e[0].timer),t.removeData(yt)),Q&&Q.complete(!n)}}function b(t){It.blockTransition&&x(Y,t),It.blockKeyframeAnimation&&w(Y,!!t)}function k(){return Q=new u({end:l,cancel:f}),A(rt),g(),{$$willAnimate:!1,start:function(){return Q},end:l}}function z(t){t.stopPropagation();var n=t.originalEvent||t,e=n.$manualTimeStamp||Date.now(),r=parseFloat(n.elapsedTime.toFixed(bt));Math.max(e-st,0)>=et&&r>=it&&(K=!0,g())}function B(){function n(){if(!X){if(b(!1),G(lt,function(t){var n=t[0],e=t[1];Y.style[n]=e}),D(t,U),r.addClass(t,Mt),It.recalculateTimingStyles){if(St=Y.getAttribute("class")+" "+wt,At=$(Y,St),Dt=O(Y,St,At),Ft=Dt.maxDelay,nt=Math.max(Ft,0),it=Dt.maxDuration,0===it)return void g();It.hasTransitions=Dt.transitionDuration>0,It.hasAnimations=Dt.animationDuration>0}if(It.applyAnimationDelay&&(Ft="boolean"!=typeof U.delay&&E(U.delay)?parseFloat(U.delay):Ft,nt=Math.max(Ft,0),Dt.animationDelay=Ft,Vt=_(Ft,!0),lt.push(Vt),Y.style[Vt[0]]=Vt[1]),et=nt*$t,at=it*$t,U.easing){var n,i=U.easing;It.hasTransitions&&(n=L+ut,lt.push([n,i]),Y.style[n]=i),It.hasAnimations&&(n=j+ut,lt.push([n,i]),Y.style[n]=i)}Dt.transitionDuration&&pt.push(N),Dt.animationDuration&&pt.push(R),st=Date.now();var o=et+xt*at,a=st+o,u=t.data(yt)||[],l=!0;if(u.length){var c=u[0];l=a>c.expectedEndTime,l?s.cancel(c.timer):u.push(g)}if(l){var f=s(e,o,!1);u[0]={timer:f,expectedEndTime:a},u.push(g),t.data(yt,u)}pt.length&&t.on(pt.join(" "),z),U.to&&(U.cleanupStyles&&T(W,Y,Object.keys(U.to)),v(t,U))}}function e(){var n=t.data(yt);if(n){for(var e=1;e<n.length;e++)n[e]();t.removeData(yt)}}if(!X){if(!Y.parentNode)return void g();var i=function(t){if(K)J&&t&&(J=!1,g());else if(J=!t,Dt.animationDuration){var n=w(Y,J);J?lt.push(n):a(lt,n)}},o=jt>0&&(Dt.transitionDuration&&0===Et.transitionDuration||Dt.animationDuration&&0===Et.animationDuration)&&Math.max(Et.animationDelay,Et.transitionDelay);o?s(n,Math.floor(o*jt*$t),!1):n(),tt.resume=function(){i(!0)},tt.pause=function(){i(!1)}}}var U=e||{};U.$$prepared||(U=h(H(U)));var W={},Y=y(t);if(!Y||!Y.parentNode||!m.enabled())return k();var X,J,K,Q,tt,nt,et,it,at,st,lt=[],ft=t.attr("class"),ht=i(U),pt=[];if(0===U.duration||!c.animations&&!c.transitions)return k();var dt=U.event&&Z(U.event)?U.event.join(" "):U.event,vt=dt&&U.structural,gt="",mt="";vt?gt=o(dt,V,!0):dt&&(gt=dt),U.addClass&&(mt+=o(U.addClass,F)),U.removeClass&&(mt.length&&(mt+=" "),mt+=o(U.removeClass,I)),U.applyClassesEarly&&mt.length&&D(t,U);var wt=[gt,mt].join(" ").trim(),St=ft+" "+wt,Mt=o(wt,q),_t=ht.to&&Object.keys(ht.to).length>0,kt=(U.keyframeStyle||"").length>0;if(!kt&&!_t&&!wt)return k();var At,Et;if(U.stagger>0){var Pt=parseFloat(U.stagger);Et={transitionDelay:Pt,animationDelay:Pt,transitionDuration:0,animationDuration:0}}else At=$(Y,St),Et=S(Y,wt,At,Ct);U.$$skipPreparationClasses||r.addClass(t,wt);var Ot;if(U.transitionStyle){var Tt=[L,U.transitionStyle];C(Y,Tt),lt.push(Tt)}if(U.duration>=0){Ot=Y.style[L].length>0;var Lt=P(U.duration,Ot);C(Y,Lt),lt.push(Lt)}if(U.keyframeStyle){var Nt=[j,U.keyframeStyle];C(Y,Nt),lt.push(Nt)}var jt=Et?U.staggerIndex>=0?U.staggerIndex:n.count(At):0,Rt=0===jt;Rt&&!U.skipBlocking&&x(Y,ct);var Dt=O(Y,St,At),Ft=Dt.maxDelay;nt=Math.max(Ft,0),it=Dt.maxDuration;var It={};if(It.hasTransitions=Dt.transitionDuration>0,It.hasAnimations=Dt.animationDuration>0,It.hasTransitionAll=It.hasTransitions&&"all"===Dt.transitionProperty,It.applyTransitionDuration=_t&&(It.hasTransitions&&!It.hasTransitionAll||It.hasAnimations&&!It.hasTransitions),It.applyAnimationDuration=U.duration&&It.hasAnimations,It.applyTransitionDelay=E(U.delay)&&(It.applyTransitionDuration||It.hasTransitions),It.applyAnimationDelay=E(U.delay)&&It.hasAnimations,It.recalculateTimingStyles=mt.length>0,(It.applyTransitionDuration||It.applyAnimationDuration)&&(it=U.duration?parseFloat(U.duration):it,It.applyTransitionDuration&&(It.hasTransitions=!0,Dt.transitionDuration=it,Ot=Y.style[L+ot].length>0,lt.push(P(it,Ot))),It.applyAnimationDuration&&(It.hasAnimations=!0,Dt.animationDuration=it,lt.push(M(it)))),0===it&&!It.recalculateTimingStyles)return k();if(null!=U.delay){var Vt;"boolean"!=typeof U.delay&&(Vt=parseFloat(U.delay),nt=Math.max(Vt,0)),It.applyTransitionDelay&&lt.push(_(Vt)),It.applyAnimationDelay&&lt.push(_(Vt,!0))}return null==U.duration&&Dt.transitionDuration>0&&(It.recalculateTimingStyles=It.recalculateTimingStyles||Rt),et=nt*$t,at=it*$t,U.skipBlocking||(It.blockTransition=Dt.transitionDuration>0,It.blockKeyframeAnimation=Dt.animationDuration>0&&Et.animationDelay>0&&0===Et.animationDuration),U.from&&(U.cleanupStyles&&T(W,Y,Object.keys(U.from)),d(t,U)),It.blockTransition||It.blockKeyframeAnimation?b(it):U.skipBlocking||x(Y,!1),{$$willAnimate:!0,end:l,start:function(){if(!X)return tt={end:l,cancel:f,resume:null,pause:null},Q=new u(tt),A(B),Q}}}}]}],Mt=["$$animationProvider",function(t){function n(t){return t.parentNode&&11===t.parentNode.nodeType}t.drivers.push("$$animateCssDriver");var e="ng-animate-shim",r="ng-anchor",i="ng-anchor-out",o="ng-anchor-in";this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(t,a,u,s,l,c,h){function p(t){return t.replace(/\bng-\S+\b/g,"")}function d(t,n){return tt(t)&&(t=t.split(" ")),tt(n)&&(n=n.split(" ")),t.filter(function(t){return n.indexOf(t)===-1}).join(" ")}function v(n,a,s){function l(t){var n={},e=y(t).getBoundingClientRect();return G(["width","height","top","left"],function(t){var r=e[t];switch(t){case"top":r+=$.scrollTop;break;case"left":r+=$.scrollLeft}n[t]=Math.floor(r)+"px"}),n}function c(){var n=t(g,{addClass:i,delay:!0,from:l(a)});return n.$$willAnimate?n:null}function f(t){return t.attr("class")||""}function h(){var n=p(f(s)),e=d(n,m),r=d(m,n),a=t(g,{to:l(s),addClass:o+" "+e,removeClass:i+" "+r,delay:!0});return a.$$willAnimate?a:null}function v(){g.remove(),a.removeClass(e),s.removeClass(e)}var g=et(y(a).cloneNode(!0)),m=p(f(g));a.addClass(e),s.addClass(e),g.addClass(r),x.append(g);var b,w=c();if(!w&&(b=h(),!b))return v();var C=w||b;return{start:function(){function t(){e&&e.end()}var n,e=C.start();return e.done(function(){return e=null,!b&&(b=h())?(e=b.start(),e.done(function(){e=null,v(),n.complete()}),e):(v(),void n.complete())}),n=new u({end:t,cancel:t})}}}function g(t,n,e,r){var i=m(t,rt),o=m(n,rt),a=[];if(G(r,function(t){var n=t.out,r=t["in"],i=v(e,n,r);i&&a.push(i)}),i||o||0!==a.length)return{start:function(){function t(){G(n,function(t){t.end()})}var n=[];i&&n.push(i.start()),o&&n.push(o.start()),G(a,function(t){n.push(t.start())});var e=new u({end:t,cancel:t});return u.all(n,function(t){e.complete(t)}),e}}}function m(n){var e=n.element,r=n.options||{};n.structural&&(r.event=n.event,r.structural=!0,r.applyClassesEarly=!0,"leave"===n.event&&(r.onDone=r.domOperation)),r.preparationClasses&&(r.event=S(r.event,r.preparationClasses));var i=t(e,r);return i.$$willAnimate?i:null}if(!l.animations&&!l.transitions)return rt;var $=h[0].body,b=y(s),x=et(n(b)||$.contains(b)?b:$);f(c);return function(t){return t.from&&t.to?g(t.from,t.to,t.classes,t.anchors):m(t)}}]}],_t=["$animateProvider",function(t){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(n,e,r){function i(e){e=Z(e)?e:e.split(" ");for(var r=[],i={},o=0;o<e.length;o++){var a=e[o],u=t.$$registeredAnimations[a];u&&!i[a]&&(r.push(n.get(u)),i[a]=!0)}return r}var o=f(r);return function(t,n,r,a){function u(){a.domOperation(),o(t,a)}function s(){d=!0,u(),p(t,a)}function l(t,n,r,i,o){var a;switch(r){case"animate":a=[n,i.from,i.to,o];break;case"setClass":a=[n,m,y,o];break;case"addClass":a=[n,m,o];break;case"removeClass":a=[n,y,o];break;default:a=[n,o]}a.push(i);var u=t.apply(t,a);if(u)if(K(u.start)&&(u=u.start()),u instanceof e)u.done(o);else if(K(u))return u;return rt}function c(t,n,r,i,o){var a=[];return G(i,function(i){var u=i[o];u&&a.push(function(){var i,o,a=!1,s=function(t){a||(a=!0,(o||rt)(t),i.complete(!t))};return i=new e({end:function(){s()},cancel:function(){s(!0)}}),o=l(u,t,n,r,function(t){var n=t===!1;s(n)}),i})}),a}function f(t,n,r,i,o){var a=c(t,n,r,i,o);if(0===a.length){var u,s;"beforeSetClass"===o?(u=c(t,"removeClass",r,i,"beforeRemoveClass"),s=c(t,"addClass",r,i,"beforeAddClass")):"setClass"===o&&(u=c(t,"removeClass",r,i,"removeClass"),s=c(t,"addClass",r,i,"addClass")),u&&(a=a.concat(u)),s&&(a=a.concat(s))}if(0!==a.length)return function(t){var n=[];return a.length&&G(a,function(t){n.push(t())}),n.length?e.all(n,t):t(),function(t){G(n,function(n){t?n.cancel():n.end()})}}}var d=!1;3===arguments.length&&Q(r)&&(a=r,r=null),a=h(a),r||(r=t.attr("class")||"",a.addClass&&(r+=" "+a.addClass),a.removeClass&&(r+=" "+a.removeClass));var v,g,m=a.addClass,y=a.removeClass,$=i(r);if($.length){var b,x;"leave"===n?(x="leave",b="afterLeave"):(x="before"+n.charAt(0).toUpperCase()+n.substr(1),b=n),"enter"!==n&&"move"!==n&&(v=f(t,n,a,$,x)),g=f(t,n,a,$,b)}if(v||g){var w;return{$$willAnimate:!0,end:function(){return w?w.end():(s(),w=new e,w.complete(!0)),w},start:function(){function t(t){s(t),w.complete(t)}function n(n){d||((r||rt)(n),t(n))}if(w)return w;w=new e;var r,i=[];
-return v&&i.push(function(t){r=v(t)}),i.length?i.push(function(t){u(),t(!0)}):u(),g&&i.push(function(t){r=g(t)}),w.setHost({end:function(){n()},cancel:function(){n(!0)}}),e.chain(i,t),w}}}}}]}],kt=["$$animationProvider",function(t){t.drivers.push("$$animateJsDriver"),this.$get=["$$animateJs","$$AnimateRunner",function(t,n){function e(n){var e=n.element,r=n.event,i=n.options,o=n.classes;return t(e,r,o,i)}return function(t){if(t.from&&t.to){var r=e(t.from),i=e(t.to);if(!r&&!i)return;return{start:function(){function t(){return function(){G(o,function(t){t.end()})}}function e(t){a.complete(t)}var o=[];r&&o.push(r.start()),i&&o.push(i.start()),n.all(o,e);var a=new n({end:t(),cancel:t()});return a}}}return e(t)}}]}],At="data-ng-animate",Et="$ngAnimatePin",Pt=["$animateProvider",function(n){function r(t){if(!t)return null;var n=t.split(d),e=Object.create(null);return G(n,function(t){e[t]=!0}),e}function i(t,n){if(t&&n){var e=r(n);return t.split(d).some(function(t){return e[t]})}}function o(t,n,e,r){return v[t].some(function(t){return t(n,e,r)})}function a(t,n){var e=(t.addClass||"").length>0,r=(t.removeClass||"").length>0;return n?e&&r:e||r}var l=1,c=2,d=" ",v=this.rules={skip:[],cancel:[],join:[]};v.join.push(function(t,n,e){return!n.structural&&a(n)}),v.skip.push(function(t,n,e){return!n.structural&&!a(n)}),v.skip.push(function(t,n,e){return"leave"===e.event&&n.structural}),v.skip.push(function(t,n,e){return e.structural&&e.state===c&&!n.structural}),v.cancel.push(function(t,n,e){return e.structural&&n.structural}),v.cancel.push(function(t,n,e){return e.state===c&&n.structural}),v.cancel.push(function(t,n,e){if(e.structural)return!1;var r=n.addClass,o=n.removeClass,a=e.addClass,u=e.removeClass;return!(nt(r)&&nt(o)||nt(a)&&nt(u))&&(i(r,u)||i(o,a))}),this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow","$$isDocumentHidden",function(r,i,d,v,m,x,w,C,S,M,_){function k(){var t=!1;return function(n){t?n():i.$$postDigest(function(){t=!0,n()})}}function A(t,n){return g(t,n,{})}function E(t,n,e){var r=y(n),i=y(t),o=[],a=B[e];return a&&G(a,function(t){it.call(t.node,r)?o.push(t.callback):"leave"===e&&it.call(t.node,i)&&o.push(t.callback)}),o}function P(t,n,e){var r=s(n);return t.filter(function(t){var n=t.node===r&&(!e||t.callback===e);return!n})}function O(t,n){"close"!==t||n[0].parentNode||ot.off(n)}function T(t,n,e){function s(n,e,i,o){S(function(){var n=E(v,t,e);n.length?r(function(){G(n,function(n){n(t,i,o)}),O(i,t)}):O(i,t)}),n.progress(e,i,o)}function f(n){b(t,m),rt(t,m),p(t,m),m.domOperation(),C.complete(!n)}var d,v,m=H(e);t=u(t),t&&(d=y(t),v=t.parent()),m=h(m);var C=new w,S=k();if(Z(m.addClass)&&(m.addClass=m.addClass.join(" ")),m.addClass&&!tt(m.addClass)&&(m.addClass=null),Z(m.removeClass)&&(m.removeClass=m.removeClass.join(" ")),m.removeClass&&!tt(m.removeClass)&&(m.removeClass=null),m.from&&!Q(m.from)&&(m.from=null),m.to&&!Q(m.to)&&(m.to=null),!d)return f(),C;var M=[d.getAttribute("class"),m.addClass,m.removeClass].join(" ");if(!K(M))return f(),C;var P=["enter","move","leave"].indexOf(n)>=0,T=_(),j=!q||T||V.get(d),D=!j&&I.get(d)||{},z=!!D.state;if(j||z&&D.state===l||(j=!R(t,v,n)),j)return T&&s(C,n,"start"),f(),T&&s(C,n,"close"),C;P&&L(t);var B={structural:P,element:t,event:n,addClass:m.addClass,removeClass:m.removeClass,close:f,options:m,runner:C};if(z){var U=o("skip",t,B,D);if(U)return D.state===c?(f(),C):(g(t,D,B),D.runner);var W=o("cancel",t,B,D);if(W)if(D.state===c)D.runner.end();else{if(!D.structural)return g(t,D,B),D.runner;D.close()}else{var Y=o("join",t,B,D);if(Y){if(D.state!==c)return $(t,P?n:null,m),n=B.event=D.event,m=g(t,D,B),D.runner;A(t,B)}}}else A(t,B);var X=B.structural;if(X||(X="animate"===B.event&&Object.keys(B.options.to||{}).length>0||a(B)),!X)return f(),N(t),C;var J=(D.counter||0)+1;return B.counter=J,F(t,l,B),i.$$postDigest(function(){var e=I.get(d),r=!e;e=e||{};var i=t.parent()||[],o=i.length>0&&("animate"===e.event||e.structural||a(e));if(r||e.counter!==J||!o)return r&&(rt(t,m),p(t,m)),(r||P&&e.event!==n)&&(m.domOperation(),C.end()),void(o||N(t));n=!e.structural&&a(e,!0)?"setClass":e.event,F(t,c);var u=x(t,n,e.options);C.setHost(u),s(C,n,"start",{}),u.done(function(e){f(!e);var r=I.get(d);r&&r.counter===J&&N(y(t)),s(C,n,"close",{})})}),C}function L(t){var n=y(t),e=n.querySelectorAll("["+At+"]");G(e,function(t){var n=parseInt(t.getAttribute(At)),e=I.get(t);if(e)switch(n){case c:e.runner.end();case l:I.remove(t)}})}function N(t){var n=y(t);n.removeAttribute(At),I.remove(n)}function j(t,n){return y(t)===y(n)}function R(t,n,e){var r,i=et(v[0].body),o=j(t,i)||"HTML"===t[0].nodeName,a=j(t,d),u=!1,s=V.get(y(t)),l=et.data(t[0],Et);for(l&&(n=l),n=y(n);n&&(a||(a=j(n,d)),n.nodeType===D);){var c=I.get(n)||{};if(!u){var f=V.get(n);if(f===!0&&s!==!1){s=!0;break}f===!1&&(s=!1),u=c.structural}if(nt(r)||r===!0){var h=et.data(n,U);X(h)&&(r=h)}if(u&&r===!1)break;if(o||(o=j(n,i)),o&&a)break;n=a||!(l=et.data(n,Et))?n.parentNode:y(l)}var p=(!u||r)&&s!==!0;return p&&a&&o}function F(t,n,e){e=e||{},e.state=n;var r=y(t);r.setAttribute(At,n);var i=I.get(r),o=i?Y(i,e):e;I.put(r,o)}var I=new m,V=new m,q=null,z=i.$watch(function(){return 0===C.totalPendingRequests},function(t){t&&(z(),i.$$postDigest(function(){i.$$postDigest(function(){null===q&&(q=!0)})}))}),B=Object.create(null),W=n.classNameFilter(),K=W?function(t){return W.test(t)}:function(){return!0},rt=f(S),it=t.Node.prototype.contains||function(t){return this===t||!!(16&this.compareDocumentPosition(t))},ot={on:function(t,n,e){var r=s(n);B[t]=B[t]||[],B[t].push({node:r,callback:e}),et(n).on("$destroy",function(){var i=I.get(r);i||ot.off(t,n,e)})},off:function(t,n,e){if(1!==arguments.length||tt(arguments[0])){var r=B[t];r&&(B[t]=1===arguments.length?null:P(r,n,e))}else{n=arguments[0];for(var i in B)B[i]=P(B[i],n)}},pin:function(t,n){e(J(t),"element","not an element"),e(J(n),"parentElement","not an element"),t.data(Et,n)},push:function(t,n,e,r){return e=e||{},e.domOperation=r,T(t,n,e)},enabled:function(t,n){var e=arguments.length;if(0===e)n=!!q;else{var r=J(t);if(r){var i=y(t);1===e?n=!V.get(i):V.put(i,!n)}else n=q=!!t}return n}};return ot}]}],Ot=["$animateProvider",function(t){function n(t,n){t.data(u,n)}function e(t){t.removeData(u)}function i(t){return t.data(u)}var o="ng-animate-ref",a=this.drivers=[],u="$$animationRunner";this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(t,u,s,l,c,d){function v(t){function n(t){if(t.processed)return t;t.processed=!0;var e=t.domNode,r=e.parentNode;o.put(e,t);for(var a;r;){if(a=o.get(r)){a.processed||(a=n(a));break}r=r.parentNode}return(a||i).children.push(t),t}function e(t){var n,e=[],r=[];for(n=0;n<t.children.length;n++)r.push(t.children[n]);var i=r.length,o=0,a=[];for(n=0;n<r.length;n++){var u=r[n];i<=0&&(i=o,o=0,e.push(a),a=[]),a.push(u.fn),u.children.forEach(function(t){o++,r.push(t)}),i--}return a.length&&e.push(a),e}var r,i={children:[]},o=new c;for(r=0;r<t.length;r++){var a=t[r];o.put(a.domNode,t[r]={domNode:a.domNode,fn:a.fn,children:[]})}for(r=0;r<t.length;r++)n(t[r]);return e(i)}var g=[],m=f(t);return function(c,f,$){function b(t){var n="["+o+"]",e=t.hasAttribute(o)?[t]:t.querySelectorAll(n),r=[];return G(e,function(t){var n=t.getAttribute(o);n&&n.length&&r.push(t)}),r}function x(t){var n=[],e={};G(t,function(t,r){var i=t.element,a=y(i),u=t.event,s=["enter","move"].indexOf(u)>=0,l=t.structural?b(a):[];if(l.length){var c=s?"to":"from";G(l,function(t){var n=t.getAttribute(o);e[n]=e[n]||{},e[n][c]={animationID:r,element:et(t)}})}else n.push(t)});var r={},i={};return G(e,function(e,o){var a=e.from,u=e.to;if(!a||!u){var s=a?a.animationID:u.animationID,l=s.toString();return void(r[l]||(r[l]=!0,n.push(t[s])))}var c=t[a.animationID],f=t[u.animationID],h=a.animationID.toString();if(!i[h]){var p=i[h]={structural:!0,beforeStart:function(){c.beforeStart(),f.beforeStart()},close:function(){c.close(),f.close()},classes:w(c.classes,f.classes),from:c,to:f,anchors:[]};p.classes.length?n.push(p):(n.push(c),n.push(f))}i[h].anchors.push({out:a.element,"in":u.element})}),n}function w(t,n){t=t.split(" "),n=n.split(" ");for(var e=[],r=0;r<t.length;r++){var i=t[r];if("ng-"!==i.substring(0,3))for(var o=0;o<n.length;o++)if(i===n[o]){e.push(i);break}}return e.join(" ")}function C(t){for(var n=a.length-1;n>=0;n--){var e=a[n],r=s.get(e),i=r(t);if(i)return i}}function S(){c.addClass(B),O&&t.addClass(c,O),T&&(t.removeClass(c,T),T=null)}function M(t,n){function e(t){var e=i(t);e&&e.setHost(n)}t.from&&t.to?(e(t.from.element),e(t.to.element)):e(t.element)}function _(){var t=i(c);!t||"leave"===f&&$.$$domOperationFired||t.end()}function k(n){c.off("$destroy",_),e(c),m(c,$),p(c,$),$.domOperation(),O&&t.removeClass(c,O),c.removeClass(B),E.complete(!n)}$=h($);var A=["enter","move","leave"].indexOf(f)>=0,E=new l({end:function(){k()},cancel:function(){k(!0)}});if(!a.length)return k(),E;n(c,E);var P=r(c.attr("class"),r($.addClass,$.removeClass)),O=$.tempClasses;O&&(P+=" "+O,$.tempClasses=null);var T;return A&&(T="ng-"+f+z,t.addClass(c,T)),g.push({element:c,classes:P,event:f,structural:A,options:$,beforeStart:S,close:k}),c.on("$destroy",_),g.length>1?E:(u.$$postDigest(function(){var t=[];G(g,function(n){i(n.element)?t.push(n):n.close()}),g.length=0;var n=x(t),e=[];G(n,function(t){e.push({domNode:y(t.from?t.from.element:t.element),fn:function(){t.beforeStart();var n,e=t.close,r=t.anchors?t.from.element||t.to.element:t.element;if(i(r)){var o=C(t);o&&(n=o.start)}if(n){var a=n();a.done(function(t){e(!t)}),M(t,a)}else e()}})}),d(v(e))}),E)}}]}],Tt=["$animate","$rootScope",function(t,n){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(n,e,r,i,o){var a,u;n.$watchCollection(r.ngAnimateSwap||r["for"],function(r){a&&t.leave(a),u&&(u.$destroy(),u=null),(r||0===r)&&(u=n.$new(),o(u,function(n){a=n,t.enter(n,null,e)}))})}}}];n.module("ngAnimate",[],function(){rt=n.noop,H=n.copy,Y=n.extend,et=n.element,G=n.forEach,Z=n.isArray,tt=n.isString,Q=n.isObject,nt=n.isUndefined,X=n.isDefined,K=n.isFunction,J=n.isElement}).directive("ngAnimateSwap",Tt).directive("ngAnimateChildren",mt).factory("$$rAFScheduler",gt).provider("$$animateQueue",Pt).provider("$$animation",Ot).provider("$animateCss",St).provider("$$animateCssDriver",Mt).provider("$$animateJs",_t).provider("$$animateJsDriver",kt)}(window,window.angular),function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function e(t,n,e){var r=e.length;switch(r){case 0:return t.call(n);case 1:return t.call(n,e[0]);case 2:return t.call(n,e[0],e[1]);case 3:return t.call(n,e[0],e[1],e[2])}return t.apply(n,e)}function r(t,n,e,r){for(var i=-1,o=t.length;++i<o;){var a=t[i];n(r,a,e(a),t)}return r}function i(t,n){for(var e=-1,r=t.length,i=-1,o=n.length,a=Array(r+o);++e<r;)a[e]=t[e];for(;++i<o;)a[e++]=n[i];return a}function o(t,n){for(var e=-1,r=t.length;++e<r&&n(t[e],e,t)!==!1;);return t}function a(t,n){for(var e=t.length;e--&&n(t[e],e,t)!==!1;);return t}function u(t,n){for(var e=-1,r=t.length;++e<r;)if(!n(t[e],e,t))return!1;return!0}function s(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e];n(a,e,t)&&(o[i++]=a)}return o}function l(t,n){return!!t.length&&y(t,n,0)>-1}function c(t,n,e){for(var r=-1,i=t.length;++r<i;)if(e(n,t[r]))return!0;return!1}function f(t,n){for(var e=-1,r=t.length,i=Array(r);++e<r;)i[e]=n(t[e],e,t);return i}function h(t,n){for(var e=-1,r=n.length,i=t.length;++e<r;)t[i+e]=n[e];return t}function p(t,n,e,r){var i=-1,o=t.length;for(r&&o&&(e=t[++i]);++i<o;)e=n(e,t[i],i,t);return e}function d(t,n,e,r){var i=t.length;for(r&&i&&(e=t[--i]);i--;)e=n(e,t[i],i,t);return e}function v(t,n){for(var e=-1,r=t.length;++e<r;)if(n(t[e],e,t))return!0;return!1}function g(t,n,e,r){var i;return e(t,function(t,e,o){if(n(t,e,o))return i=r?e:t,!1}),i}function m(t,n,e){for(var r=t.length,i=e?r:-1;e?i--:++i<r;)if(n(t[i],i,t))return i;return-1}function y(t,n,e){if(n!==n)return j(t,e);for(var r=e-1,i=t.length;++r<i;)if(t[r]===n)return r;return-1}function $(t,n,e,r){for(var i=e-1,o=t.length;++i<o;)if(r(t[i],n))return i;return-1}function b(t,n){var e=t?t.length:0;return e?C(t,n)/e:$t}function x(t,n,e,r,i){return i(t,function(t,i,o){e=r?(r=!1,t):n(e,t,i,o)}),e}function w(t,n){var e=t.length;for(t.sort(n);e--;)t[e]=t[e].value;return t}function C(t,n){for(var e,r=-1,i=t.length;++r<i;){var o=n(t[r]);o!==W&&(e=e===W?o:e+o)}return e}function S(t,n){for(var e=-1,r=Array(t);++e<t;)r[e]=n(e);return r}function M(t,n){return f(n,function(n){return[n,t[n]]})}function _(t){return function(n){return t(n)}}function k(t,n){return f(n,function(n){return t[n]})}function A(t,n){for(var e=-1,r=t.length;++e<r&&y(n,t[e],0)>-1;);return e}function E(t,n){for(var e=t.length;e--&&y(n,t[e],0)>-1;);return e}function P(t){return t&&t.Object===Object?t:null}function O(t,n){for(var e=t.length,r=0;e--;)t[e]===n&&r++;return r}function T(t){return we[t]}function L(t){return Ce[t]}function N(t){return"\\"+_e[t]}function j(t,n,e){for(var r=t.length,i=n+(e?0:-1);e?i--:++i<r;){var o=t[i];if(o!==o)return i}return-1}function R(t){var n=!1;if(null!=t&&"function"!=typeof t.toString)try{n=!!(t+"")}catch(e){}return n}function D(t){for(var n,e=[];!(n=t.next()).done;)e.push(n.value);return e}function F(t){var n=-1,e=Array(t.size);return t.forEach(function(t,r){e[++n]=[r,t]}),e}function I(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e];a!==n&&a!==X||(t[e]=X,o[i++]=e)}return o}function V(t){var n=-1,e=Array(t.size);return t.forEach(function(t){e[++n]=t}),e}function q(t){if(!t||!ge.test(t))return t.length;for(var n=de.lastIndex=0;de.test(t);)n++;return n}function z(t){return t.match(de)}function B(t){return Se[t]}function U(P){function En(t){if(lu(t)&&!tf(t)&&!(t instanceof Tn)){if(t instanceof On)return t;if(dl.call(t,"__wrapped__"))return no(t)}return new On(t)}function Pn(){}function On(t,n){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!n,this.__index__=0,this.__values__=W}function Tn(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=bt,this.__views__=[]}function Ln(){var t=new Tn(this.__wrapped__);return t.__actions__=Xr(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Xr(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Xr(this.__views__),t}function Nn(){if(this.__filtered__){var t=new Tn(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function jn(){var t=this.__wrapped__.value(),n=this.__dir__,e=tf(t),r=n<0,i=e?t.length:0,o=Li(0,i,this.__views__),a=o.start,u=o.end,s=u-a,l=r?u:a-1,c=this.__iteratees__,f=c.length,h=0,p=Il(s,this.__takeCount__);if(!e||i<Y||i==s&&p==s)return Or(t,this.__actions__);var d=[];t:for(;s--&&h<p;){l+=n;for(var v=-1,g=t[l];++v<f;){var m=c[v],y=m.iteratee,$=m.type,b=y(g);if($==dt)g=b;else if(!b){if($==pt)continue t;break t}}d[h++]=g}return d}function Rn(){}function Dn(t,n){return In(t,n)&&delete t[n]}function Fn(t,n){if(Xl){var e=t[n];return e===Z?W:e}return dl.call(t,n)?t[n]:W}function In(t,n){return Xl?t[n]!==W:dl.call(t,n)}function Vn(t,n,e){t[n]=Xl&&e===W?Z:e}function qn(t){var n=-1,e=t?t.length:0;for(this.clear();++n<e;){var r=t[n];this.set(r[0],r[1])}}function zn(){this.__data__={hash:new Rn,map:Hl?new Hl:[],string:new Rn}}function Bn(t){var n=this.__data__;return Ui(t)?Dn("string"==typeof t?n.string:n.hash,t):Hl?n.map["delete"](t):ee(n.map,t)}function Un(t){var n=this.__data__;return Ui(t)?Fn("string"==typeof t?n.string:n.hash,t):Hl?n.map.get(t):re(n.map,t)}function Wn(t){var n=this.__data__;return Ui(t)?In("string"==typeof t?n.string:n.hash,t):Hl?n.map.has(t):ie(n.map,t)}function Hn(t,n){var e=this.__data__;return Ui(t)?Vn("string"==typeof t?e.string:e.hash,t,n):Hl?e.map.set(t,n):ae(e.map,t,n),this}function Yn(t){var n=-1,e=t?t.length:0;for(this.__data__=new qn;++n<e;)this.push(t[n])}function Gn(t,n){var e=t.__data__;if(Ui(n)){var r=e.__data__,i="string"==typeof n?r.string:r.hash;return i[n]===Z}return e.has(n)}function Zn(t){var n=this.__data__;if(Ui(t)){var e=n.__data__,r="string"==typeof t?e.string:e.hash;r[t]=Z}else n.set(t,Z)}function Xn(t){var n=-1,e=t?t.length:0;for(this.clear();++n<e;){var r=t[n];this.set(r[0],r[1])}}function Jn(){this.__data__={array:[],map:null}}function Kn(t){var n=this.__data__,e=n.array;return e?ee(e,t):n.map["delete"](t)}function Qn(t){var n=this.__data__,e=n.array;return e?re(e,t):n.map.get(t)}function te(t){var n=this.__data__,e=n.array;return e?ie(e,t):n.map.has(t)}function ne(t,n){var e=this.__data__,r=e.array;r&&(r.length<Y-1?ae(r,t,n):(e.array=null,e.map=new qn(r)));var i=e.map;return i&&i.set(t,n),this}function ee(t,n){var e=oe(t,n);if(e<0)return!1;var r=t.length-1;return e==r?t.pop():Ol.call(t,e,1),!0}function re(t,n){var e=oe(t,n);return e<0?W:t[e][1]}function ie(t,n){return oe(t,n)>-1}function oe(t,n){for(var e=t.length;e--;)if(Ha(t[e][0],n))return e;return-1}function ae(t,n,e){var r=oe(t,n);r<0?t.push([n,e]):t[r][1]=e}function ue(t,n,e,r){return t===W||Ha(t,fl[e])&&!dl.call(r,e)?n:t}function se(t,n,e){(e===W||Ha(t[n],e))&&("number"!=typeof n||e!==W||n in t)||(t[n]=e)}function le(t,n,e){var r=t[n];dl.call(t,n)&&Ha(r,e)&&(e!==W||n in t)||(t[n]=e)}function ce(t,n,e,r){return sc(t,function(t,i,o){n(r,t,e(t),o)}),r}function fe(t,n){return t&&Jr(n,Yu(n),t)}function de(t,n){for(var e=-1,r=null==t,i=n.length,o=Array(i);++e<i;)o[e]=r?W:Uu(t,n[e]);return o}function we(t,n,e){return t===t&&(e!==W&&(t=t<=e?t:e),n!==W&&(t=t>=n?t:n)),t}function Ce(t,n,e,r,i,a,u){var s;if(r&&(s=a?r(t,i,a,u):r(t)),s!==W)return s;if(!su(t))return t;var l=tf(t);if(l){if(s=ji(t),!n)return Xr(t,s)}else{var c=Ti(t),f=c==At||c==Et;if(nf(t))return Fr(t,n);if(c==Tt||c==Ct||f&&!a){if(R(t))return a?t:{};if(s=Ri(f?{}:t),!n)return Kr(t,fe(s,t))}else{if(!xe[c])return a?t:{};s=Di(t,c,Ce,n)}}u||(u=new Xn);var h=u.get(t);if(h)return h;if(u.set(t,s),!l)var p=e?Ci(t):Yu(t);return o(p||t,function(i,o){p&&(o=i,i=t[o]),le(s,o,Ce(i,n,e,r,o,t,u))}),s}function Se(t){var n=Yu(t),e=n.length;return function(r){if(null==r)return!e;for(var i=e;i--;){var o=n[i],a=t[o],u=r[o];if(u===W&&!(o in Object(r))||!a(u))return!1}return!0}}function Me(t){return su(t)?Al(t):{}}function _e(t,n,e){if("function"!=typeof t)throw new ll(G);return Pl(function(){t.apply(W,e)},n)}function Ee(t,n,e,r){var i=-1,o=l,a=!0,u=t.length,s=[],h=n.length;if(!u)return s;e&&(n=f(n,_(e))),r?(o=c,a=!1):n.length>=Y&&(o=Gn,a=!1,n=new Yn(n));t:for(;++i<u;){var p=t[i],d=e?e(p):p;if(p=r||0!==p?p:0,a&&d===d){for(var v=h;v--;)if(n[v]===d)continue t;s.push(p)}else o(n,d,r)||s.push(p)}return s}function Pe(t,n){var e=!0;return sc(t,function(t,r,i){return e=!!n(t,r,i)}),e}function Te(t,n,e){for(var r=-1,i=t.length;++r<i;){var o=t[r],a=n(o);if(null!=a&&(u===W?a===a&&!Cu(a):e(a,u)))var u=a,s=o}return s}function Le(t,n,e,r){var i=t.length;for(e=Eu(e),e<0&&(e=-e>i?0:i+e),r=r===W||r>i?i:Eu(r),r<0&&(r+=i),r=e>r?0:Pu(r);e<r;)t[e++]=n;return t}function Ne(t,n){var e=[];return sc(t,function(t,r,i){n(t,r,i)&&e.push(t)}),e}function je(t,n,e,r,i){var o=-1,a=t.length;for(e||(e=Ii),i||(i=[]);++o<a;){var u=t[o];n>0&&e(u)?n>1?je(u,n-1,e,r,i):h(i,u):r||(i[i.length]=u)}return i}function Fe(t,n){return t&&cc(t,n,Yu)}function Ie(t,n){return t&&fc(t,n,Yu)}function Ve(t,n){return s(n,function(n){return ou(t[n])})}function qe(t,n){n=Bi(n,t)?[n]:Rr(n);for(var e=0,r=n.length;null!=t&&e<r;)t=t[Qi(n[e++])];return e&&e==r?t:W}function ze(t,n,e){var r=n(t);return tf(t)?r:h(r,e(t))}function Be(t,n){return t>n}function Ue(t,n){return dl.call(t,n)||"object"==typeof t&&n in t&&null===Pi(t)}function We(t,n){return n in Object(t)}function He(t,n,e){return t>=Il(n,e)&&t<Fl(n,e)}function Ye(t,n,e){for(var r=e?c:l,i=t[0].length,o=t.length,a=o,u=Array(o),s=1/0,h=[];a--;){var p=t[a];a&&n&&(p=f(p,_(n))),s=Il(p.length,s),u[a]=!e&&(n||i>=120&&p.length>=120)?new Yn(a&&p):W}p=t[0];var d=-1,v=u[0];t:for(;++d<i&&h.length<s;){var g=p[d],m=n?n(g):g;if(g=e||0!==g?g:0,!(v?Gn(v,m):r(h,m,e))){for(a=o;--a;){var y=u[a];if(!(y?Gn(y,m):r(t[a],m,e)))continue t}v&&v.push(m),h.push(g)}}return h}function Ge(t,n,e,r){return Fe(t,function(t,i,o){n(r,e(t),i,o)}),r}function Ze(t,n,r){Bi(n,t)||(n=Rr(n),t=Ji(t,n),n=xo(n));var i=null==t?t:t[Qi(n)];return null==i?W:e(i,t,r)}function Xe(t,n,e,r,i){return t===n||(null==t||null==n||!su(t)&&!lu(n)?t!==t&&n!==n:Je(t,n,Xe,e,r,i))}function Je(t,n,e,r,i,o){var a=tf(t),u=tf(n),s=St,l=St;a||(s=Ti(t),s=s==Ct?Tt:s),u||(l=Ti(n),l=l==Ct?Tt:l);var c=s==Tt&&!R(t),f=l==Tt&&!R(n),h=s==l;if(h&&!c)return o||(o=new Xn),a||Su(t)?bi(t,n,e,r,i,o):xi(t,n,s,e,r,i,o);if(!(i&st)){var p=c&&dl.call(t,"__wrapped__"),d=f&&dl.call(n,"__wrapped__");if(p||d){var v=p?t.value():t,g=d?n.value():n;return o||(o=new Xn),e(v,g,r,i,o)}}return!!h&&(o||(o=new Xn),wi(t,n,e,r,i,o))}function Ke(t,n,e,r){var i=e.length,o=i,a=!r;if(null==t)return!o;for(t=Object(t);i--;){var u=e[i];if(a&&u[2]?u[1]!==t[u[0]]:!(u[0]in t))return!1}for(;++i<o;){u=e[i];var s=u[0],l=t[s],c=u[1];if(a&&u[2]){if(l===W&&!(s in t))return!1}else{var f=new Xn;if(r)var h=r(l,c,s,t,n,f);if(!(h===W?Xe(c,l,r,ut|st,f):h))return!1}}return!0}function Qe(t){return"function"==typeof t?t:null==t?Fs:"object"==typeof t?tf(t)?or(t[0],t[1]):ir(t):Hs(t)}function tr(t){return Dl(Object(t))}function nr(t){t=null==t?t:Object(t);var n=[];for(var e in t)n.push(e);return n}function er(t,n){return t<n}function rr(t,n){var e=-1,r=Za(t)?Array(t.length):[];return sc(t,function(t,i,o){r[++e]=n(t,i,o)}),r}function ir(t){var n=ki(t);return 1==n.length&&n[0][2]?Gi(n[0][0],n[0][1]):function(e){return e===t||Ke(e,t,n)}}function or(t,n){return Bi(t)&&Yi(n)?Gi(Qi(t),n):function(e){var r=Uu(e,t);return r===W&&r===n?Hu(e,t):Xe(n,r,W,ut|st)}}function ar(t,n,e,r,i){if(t!==n){if(!tf(n)&&!Su(n))var a=Gu(n);o(a||n,function(o,u){if(a&&(u=o,o=n[u]),su(o))i||(i=new Xn),ur(t,n,u,e,ar,r,i);else{var s=r?r(t[u],o,u+"",t,n,i):W;s===W&&(s=o),se(t,u,s)}})}}function ur(t,n,e,r,i,o,a){var u=t[e],s=n[e],l=a.get(s);if(l)return void se(t,e,l);var c=o?o(u,s,e+"",t,n,a):W,f=c===W;f&&(c=s,tf(s)||Su(s)?tf(u)?c=u:Xa(u)?c=Xr(u):(f=!1,c=Ce(s,!0)):yu(s)||Ya(s)?Ya(u)?c=Tu(u):!su(u)||r&&ou(u)?(f=!1,c=Ce(s,!0)):c=u:f=!1),a.set(s,c),f&&i(c,s,r,o,a),a["delete"](s),se(t,e,c)}function sr(t,n){var e=t.length;if(e)return n+=n<0?e:0,qi(n,e)?t[n]:W}function lr(t,n,e){var r=-1;n=f(n.length?n:[Fs],_(_i()));var i=rr(t,function(t,e,i){var o=f(n,function(n){return n(t)});return{criteria:o,index:++r,value:t}});return w(i,function(t,n){return Yr(t,n,e)})}function cr(t,n){return t=Object(t),p(n,function(n,e){return e in t&&(n[e]=t[e]),n},{})}function fr(t,n){for(var e=-1,r=Si(t),i=r.length,o={};++e<i;){var a=r[e],u=t[a];n(u,a)&&(o[a]=u)}return o}function hr(t){return function(n){return null==n?W:n[t]}}function pr(t){return function(n){return qe(n,t)}}function dr(t,n,e,r){var i=r?$:y,o=-1,a=n.length,u=t;for(e&&(u=f(t,_(e)));++o<a;)for(var s=0,l=n[o],c=e?e(l):l;(s=i(u,c,s,r))>-1;)u!==t&&Ol.call(u,s,1),Ol.call(t,s,1);return t}function vr(t,n){for(var e=t?n.length:0,r=e-1;e--;){var i=n[e];if(e==r||i!==o){var o=i;if(qi(i))Ol.call(t,i,1);else if(Bi(i,t))delete t[Qi(i)];else{var a=Rr(i),u=Ji(t,a);null!=u&&delete u[Qi(xo(a))]}}}return t}function gr(t,n){return t+Ll(ql()*(n-t+1))}function mr(t,n,e,r){for(var i=-1,o=Fl(Tl((n-t)/(e||1)),0),a=Array(o);o--;)a[r?o:++i]=t,t+=e;return a}function yr(t,n){var e="";if(!t||n<1||n>mt)return e;do n%2&&(e+=t),n=Ll(n/2),n&&(t+=t);while(n);return e}function $r(t,n,e,r){n=Bi(n,t)?[n]:Rr(n);for(var i=-1,o=n.length,a=o-1,u=t;null!=u&&++i<o;){var s=Qi(n[i]);if(su(u)){var l=e;if(i!=a){var c=u[s];l=r?r(c,s,u):W,l===W&&(l=null==c?qi(n[i+1])?[]:{}:c)}le(u,s,l)}u=u[s]}return t}function br(t,n,e){var r=-1,i=t.length;n<0&&(n=-n>i?0:i+n),e=e>i?i:e,e<0&&(e+=i),i=n>e?0:e-n>>>0,n>>>=0;for(var o=Array(i);++r<i;)o[r]=t[r+n];return o}function xr(t,n){var e;return sc(t,function(t,r,i){return e=n(t,r,i),!e}),!!e}function wr(t,n,e){var r=0,i=t?t.length:r;if("number"==typeof n&&n===n&&i<=wt){for(;r<i;){var o=r+i>>>1,a=t[o];null!==a&&!Cu(a)&&(e?a<=n:a<n)?r=o+1:i=o}return i}return Cr(t,n,Fs,e)}function Cr(t,n,e,r){n=e(n);for(var i=0,o=t?t.length:0,a=n!==n,u=null===n,s=Cu(n),l=n===W;i<o;){var c=Ll((i+o)/2),f=e(t[c]),h=f!==W,p=null===f,d=f===f,v=Cu(f);if(a)var g=r||d;else g=l?d&&(r||h):u?d&&h&&(r||!p):s?d&&h&&!p&&(r||!v):!p&&!v&&(r?f<=n:f<n);g?i=c+1:o=c}return Il(o,xt)}function Sr(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e],u=n?n(a):a;if(!e||!Ha(u,s)){var s=u;o[i++]=0===a?0:a}}return o}function Mr(t){return"number"==typeof t?t:Cu(t)?$t:+t}function _r(t){if("string"==typeof t)return t;if(Cu(t))return uc?uc.call(t):"";var n=t+"";return"0"==n&&1/t==-gt?"-0":n}function kr(t,n,e){var r=-1,i=l,o=t.length,a=!0,u=[],s=u;if(e)a=!1,i=c;else if(o>=Y){var f=n?null:pc(t);if(f)return V(f);a=!1,i=Gn,s=new Yn}else s=n?[]:u;t:for(;++r<o;){var h=t[r],p=n?n(h):h;if(h=e||0!==h?h:0,a&&p===p){for(var d=s.length;d--;)if(s[d]===p)continue t;n&&s.push(p),u.push(h)}else i(s,p,e)||(s!==u&&s.push(p),u.push(h))}return u}function Ar(t,n){n=Bi(n,t)?[n]:Rr(n),t=Ji(t,n);var e=Qi(xo(n));return!(null!=t&&Ue(t,e))||delete t[e]}function Er(t,n,e,r){return $r(t,n,e(qe(t,n)),r)}function Pr(t,n,e,r){for(var i=t.length,o=r?i:-1;(r?o--:++o<i)&&n(t[o],o,t););return e?br(t,r?0:o,r?o+1:i):br(t,r?o+1:0,r?i:o)}function Or(t,n){var e=t;return e instanceof Tn&&(e=e.value()),p(n,function(t,n){return n.func.apply(n.thisArg,h([t],n.args))},e)}function Tr(t,n,e){for(var r=-1,i=t.length;++r<i;)var o=o?h(Ee(o,t[r],n,e),Ee(t[r],o,n,e)):t[r];return o&&o.length?kr(o,n,e):[]}function Lr(t,n,e){for(var r=-1,i=t.length,o=n.length,a={};++r<i;){var u=r<o?n[r]:W;e(a,t[r],u)}return a}function Nr(t){return Xa(t)?t:[]}function jr(t){return"function"==typeof t?t:Fs}function Rr(t){return tf(t)?t:yc(t)}function Dr(t,n,e){var r=t.length;return e=e===W?r:e,!n&&e>=r?t:br(t,n,e)}function Fr(t,n){if(n)return t.slice();var e=new t.constructor(t.length);return t.copy(e),e}function Ir(t){var n=new t.constructor(t.byteLength);return new Cl(n).set(new Cl(t)),n}function Vr(t,n){var e=n?Ir(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.byteLength)}function qr(n,e,r){var i=e?r(F(n),!0):F(n);return p(i,t,new n.constructor)}function zr(t){var n=new t.constructor(t.source,$n.exec(t));return n.lastIndex=t.lastIndex,n}function Br(t,e,r){var i=e?r(V(t),!0):V(t);return p(i,n,new t.constructor)}function Ur(t){return ac?Object(ac.call(t)):{}}function Wr(t,n){var e=n?Ir(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.length)}function Hr(t,n){if(t!==n){var e=t!==W,r=null===t,i=t===t,o=Cu(t),a=n!==W,u=null===n,s=n===n,l=Cu(n);if(!u&&!l&&!o&&t>n||o&&a&&s&&!u&&!l||r&&a&&s||!e&&s||!i)return 1;if(!r&&!o&&!l&&t<n||l&&e&&i&&!r&&!o||u&&e&&i||!a&&i||!s)return-1}return 0}function Yr(t,n,e){for(var r=-1,i=t.criteria,o=n.criteria,a=i.length,u=e.length;++r<a;){var s=Hr(i[r],o[r]);if(s){if(r>=u)return s;var l=e[r];return s*("desc"==l?-1:1)}}return t.index-n.index}function Gr(t,n,e,r){for(var i=-1,o=t.length,a=e.length,u=-1,s=n.length,l=Fl(o-a,0),c=Array(s+l),f=!r;++u<s;)c[u]=n[u];for(;++i<a;)(f||i<o)&&(c[e[i]]=t[i]);for(;l--;)c[u++]=t[i++];return c}function Zr(t,n,e,r){for(var i=-1,o=t.length,a=-1,u=e.length,s=-1,l=n.length,c=Fl(o-u,0),f=Array(c+l),h=!r;++i<c;)f[i]=t[i];for(var p=i;++s<l;)f[p+s]=n[s];for(;++a<u;)(h||i<o)&&(f[p+e[a]]=t[i++]);return f}function Xr(t,n){var e=-1,r=t.length;for(n||(n=Array(r));++e<r;)n[e]=t[e];return n}function Jr(t,n,e,r){e||(e={});for(var i=-1,o=n.length;++i<o;){var a=n[i],u=r?r(e[a],t[a],a,e,t):t[a];le(e,a,u)}return e}function Kr(t,n){return Jr(t,Oi(t),n)}function Qr(t,n){return function(e,i){var o=tf(e)?r:ce,a=n?n():{};return o(e,t,_i(i),a)}}function ti(t){return Ra(function(n,e){var r=-1,i=e.length,o=i>1?e[i-1]:W,a=i>2?e[2]:W;for(o="function"==typeof o?(i--,o):W,a&&zi(e[0],e[1],a)&&(o=i<3?W:o,i=1),n=Object(n);++r<i;){var u=e[r];u&&t(n,u,r,o)}return n})}function ni(t,n){return function(e,r){if(null==e)return e;if(!Za(e))return t(e,r);for(var i=e.length,o=n?i:-1,a=Object(e);(n?o--:++o<i)&&r(a[o],o,a)!==!1;);return e}}function ei(t){return function(n,e,r){for(var i=-1,o=Object(n),a=r(n),u=a.length;u--;){var s=a[t?u:++i];if(e(o[s],s,o)===!1)break}return n}}function ri(t,n,e){function r(){var n=this&&this!==Re&&this instanceof r?o:t;return n.apply(i?e:this,arguments)}var i=n&J,o=ai(t);return r}function ii(t){return function(n){n=Nu(n);var e=ge.test(n)?z(n):W,r=e?e[0]:n.charAt(0),i=e?Dr(e,1).join(""):n.slice(1);return r[t]()+i}}function oi(t){return function(n){return p(Ns(ds(n).replace(he,"")),t,"")}}function ai(t){return function(){var n=arguments;switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3]);case 5:return new t(n[0],n[1],n[2],n[3],n[4]);case 6:return new t(n[0],n[1],n[2],n[3],n[4],n[5]);case 7:return new t(n[0],n[1],n[2],n[3],n[4],n[5],n[6])}var e=Me(t.prototype),r=t.apply(e,n);return su(r)?r:e}}function ui(t,n,r){function i(){for(var a=arguments.length,u=Array(a),s=a,l=Ei(i);s--;)u[s]=arguments[s];var c=a<3&&u[0]!==l&&u[a-1]!==l?[]:I(u,l);if(a-=c.length,a<r)return mi(t,n,li,i.placeholder,W,u,c,W,W,r-a);var f=this&&this!==Re&&this instanceof i?o:t;return e(f,this,u)}var o=ai(t);return i}function si(t){return Ra(function(n){n=je(n,1);var e=n.length,r=e,i=On.prototype.thru;for(t&&n.reverse();r--;){var o=n[r];if("function"!=typeof o)throw new ll(G);if(i&&!a&&"wrapper"==Mi(o))var a=new On([],(!0))}for(r=a?r:e;++r<e;){o=n[r];var u=Mi(o),s="wrapper"==u?dc(o):W;a=s&&Wi(s[0])&&s[1]==(it|tt|et|ot)&&!s[4].length&&1==s[9]?a[Mi(s[0])].apply(a,s[3]):1==o.length&&Wi(o)?a[u]():a.thru(o)}return function(){var t=arguments,r=t[0];if(a&&1==t.length&&tf(r)&&r.length>=Y)return a.plant(r).value();for(var i=0,o=e?n[i].apply(this,t):r;++i<e;)o=n[i].call(this,o);return o}})}function li(t,n,e,r,i,o,a,u,s,l){function c(){for(var m=arguments.length,y=m,$=Array(m);y--;)$[y]=arguments[y];if(d)var b=Ei(c),x=O($,b);if(r&&($=Gr($,r,i,d)),o&&($=Zr($,o,a,d)),m-=x,d&&m<l){var w=I($,b);return mi(t,n,li,c.placeholder,e,$,w,u,s,l-m)}var C=h?e:this,S=p?C[t]:t;return m=$.length,u?$=Ki($,u):v&&m>1&&$.reverse(),f&&s<m&&($.length=s),this&&this!==Re&&this instanceof c&&(S=g||ai(S)),S.apply(C,$)}var f=n&it,h=n&J,p=n&K,d=n&(tt|nt),v=n&at,g=p?W:ai(t);return c}function ci(t,n){return function(e,r){return Ge(e,t,n(r),{})}}function fi(t){return function(n,e){var r;if(n===W&&e===W)return 0;if(n!==W&&(r=n),e!==W){if(r===W)return e;"string"==typeof n||"string"==typeof e?(n=_r(n),e=_r(e)):(n=Mr(n),e=Mr(e)),r=t(n,e)}return r}}function hi(t){return Ra(function(n){return n=1==n.length&&tf(n[0])?f(n[0],_(_i())):f(je(n,1,Vi),_(_i())),Ra(function(r){var i=this;return t(n,function(t){return e(t,i,r)})})})}function pi(t,n){n=n===W?" ":_r(n);var e=n.length;if(e<2)return e?yr(n,t):n;var r=yr(n,Tl(t/q(n)));return ge.test(n)?Dr(z(r),0,t).join(""):r.slice(0,t)}function di(t,n,r,i){function o(){for(var n=-1,s=arguments.length,l=-1,c=i.length,f=Array(c+s),h=this&&this!==Re&&this instanceof o?u:t;++l<c;)f[l]=i[l];for(;s--;)f[l++]=arguments[++n];return e(h,a?r:this,f)}var a=n&J,u=ai(t);return o}function vi(t){return function(n,e,r){return r&&"number"!=typeof r&&zi(n,e,r)&&(e=r=W),n=Ou(n),n=n===n?n:0,e===W?(e=n,n=0):e=Ou(e)||0,r=r===W?n<e?1:-1:Ou(r)||0,mr(n,e,r,t)}}function gi(t){return function(n,e){return"string"==typeof n&&"string"==typeof e||(n=Ou(n),e=Ou(e)),t(n,e)}}function mi(t,n,e,r,i,o,a,u,s,l){var c=n&tt,f=c?a:W,h=c?W:a,p=c?o:W,d=c?W:o;n|=c?et:rt,n&=~(c?rt:et),n&Q||(n&=~(J|K));var v=[t,n,i,p,f,d,h,u,s,l],g=e.apply(W,v);return Wi(t)&&mc(g,v),g.placeholder=r,g}function yi(t){var n=ul[t];return function(t,e){if(t=Ou(t),e=Eu(e)){var r=(Nu(t)+"e").split("e"),i=n(r[0]+"e"+(+r[1]+e));return r=(Nu(i)+"e").split("e"),+(r[0]+"e"+(+r[1]-e))}return n(t)}}function $i(t,n,e,r,i,o,a,u){var s=n&K;if(!s&&"function"!=typeof t)throw new ll(G);var l=r?r.length:0;if(l||(n&=~(et|rt),r=i=W),a=a===W?a:Fl(Eu(a),0),u=u===W?u:Eu(u),l-=i?i.length:0,n&rt){var c=r,f=i;r=i=W}var h=s?W:dc(t),p=[t,n,e,r,i,c,f,o,a,u];
-if(h&&Zi(p,h),t=p[0],n=p[1],e=p[2],r=p[3],i=p[4],u=p[9]=null==p[9]?s?0:t.length:Fl(p[9]-l,0),!u&&n&(tt|nt)&&(n&=~(tt|nt)),n&&n!=J)d=n==tt||n==nt?ui(t,n,u):n!=et&&n!=(J|et)||i.length?li.apply(W,p):di(t,n,e,r);else var d=ri(t,n,e);var v=h?hc:mc;return v(d,p)}function bi(t,n,e,r,i,o){var a=-1,u=i&st,s=i&ut,l=t.length,c=n.length;if(l!=c&&!(u&&c>l))return!1;var f=o.get(t);if(f)return f==n;var h=!0;for(o.set(t,n);++a<l;){var p=t[a],d=n[a];if(r)var g=u?r(d,p,a,n,t,o):r(p,d,a,t,n,o);if(g!==W){if(g)continue;h=!1;break}if(s){if(!v(n,function(t){return p===t||e(p,t,r,i,o)})){h=!1;break}}else if(p!==d&&!e(p,d,r,i,o)){h=!1;break}}return o["delete"](t),h}function xi(t,n,e,r,i,o,a){switch(e){case qt:if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)return!1;t=t.buffer,n=n.buffer;case Vt:return!(t.byteLength!=n.byteLength||!r(new Cl(t),new Cl(n)));case Mt:case _t:return+t==+n;case kt:return t.name==n.name&&t.message==n.message;case Ot:return t!=+t?n!=+n:t==+n;case Nt:case Rt:return t==n+"";case Pt:var u=F;case jt:var s=o&st;if(u||(u=V),t.size!=n.size&&!s)return!1;var l=a.get(t);return l?l==n:(o|=ut,a.set(t,n),bi(u(t),u(n),r,i,o,a));case Dt:if(ac)return ac.call(t)==ac.call(n)}return!1}function wi(t,n,e,r,i,o){var a=i&st,u=Yu(t),s=u.length,l=Yu(n),c=l.length;if(s!=c&&!a)return!1;for(var f=s;f--;){var h=u[f];if(!(a?h in n:Ue(n,h)))return!1}var p=o.get(t);if(p)return p==n;var d=!0;o.set(t,n);for(var v=a;++f<s;){h=u[f];var g=t[h],m=n[h];if(r)var y=a?r(m,g,h,n,t,o):r(g,m,h,t,n,o);if(!(y===W?g===m||e(g,m,r,i,o):y)){d=!1;break}v||(v="constructor"==h)}if(d&&!v){var $=t.constructor,b=n.constructor;$!=b&&"constructor"in t&&"constructor"in n&&!("function"==typeof $&&$ instanceof $&&"function"==typeof b&&b instanceof b)&&(d=!1)}return o["delete"](t),d}function Ci(t){return ze(t,Yu,Oi)}function Si(t){return ze(t,Gu,gc)}function Mi(t){for(var n=t.name+"",e=Ql[n],r=dl.call(Ql,n)?e.length:0;r--;){var i=e[r],o=i.func;if(null==o||o==t)return i.name}return n}function _i(){var t=En.iteratee||Is;return t=t===Is?Qe:t,arguments.length?t(arguments[0],arguments[1]):t}function ki(t){for(var n=es(t),e=n.length;e--;)n[e][2]=Yi(n[e][1]);return n}function Ai(t,n){var e=t[n];return du(e)?e:W}function Ei(t){var n=dl.call(En,"placeholder")?En:t;return n.placeholder}function Pi(t){return Nl(Object(t))}function Oi(t){return _l(Object(t))}function Ti(t){return ml.call(t)}function Li(t,n,e){for(var r=-1,i=e.length;++r<i;){var o=e[r],a=o.size;switch(o.type){case"drop":t+=a;break;case"dropRight":n-=a;break;case"take":n=Il(n,t+a);break;case"takeRight":t=Fl(t,n-a)}}return{start:t,end:n}}function Ni(t,n,e){n=Bi(n,t)?[n]:Rr(n);for(var r,i=-1,o=n.length;++i<o;){var a=Qi(n[i]);if(!(r=null!=t&&e(t,a)))break;t=t[a]}if(r)return r;var o=t?t.length:0;return!!o&&uu(o)&&qi(a,o)&&(tf(t)||wu(t)||Ya(t))}function ji(t){var n=t.length,e=t.constructor(n);return n&&"string"==typeof t[0]&&dl.call(t,"index")&&(e.index=t.index,e.input=t.input),e}function Ri(t){return"function"!=typeof t.constructor||Hi(t)?{}:Me(Pi(t))}function Di(t,n,e,r){var i=t.constructor;switch(n){case Vt:return Ir(t);case Mt:case _t:return new i((+t));case qt:return Vr(t,r);case zt:case Bt:case Ut:case Wt:case Ht:case Yt:case Gt:case Zt:case Xt:return Wr(t,r);case Pt:return qr(t,r,e);case Ot:case Rt:return new i(t);case Nt:return zr(t);case jt:return Br(t,r,e);case Dt:return Ur(t)}}function Fi(t){var n=t?t.length:W;return uu(n)&&(tf(t)||wu(t)||Ya(t))?S(n,String):null}function Ii(t){return Xa(t)&&(tf(t)||Ya(t))}function Vi(t){return tf(t)&&!(2==t.length&&!ou(t[0]))}function qi(t,n){return n=null==n?mt:n,!!n&&("number"==typeof t||Mn.test(t))&&t>-1&&t%1==0&&t<n}function zi(t,n,e){if(!su(e))return!1;var r=typeof n;return!!("number"==r?Za(e)&&qi(n,e.length):"string"==r&&n in e)&&Ha(e[n],t)}function Bi(t,n){if(tf(t))return!1;var e=typeof t;return!("number"!=e&&"symbol"!=e&&"boolean"!=e&&null!=t&&!Cu(t))||(ln.test(t)||!sn.test(t)||null!=n&&t in Object(n))}function Ui(t){var n=typeof t;return"string"==n||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==t:null===t}function Wi(t){var n=Mi(t),e=En[n];if("function"!=typeof e||!(n in Tn.prototype))return!1;if(t===e)return!0;var r=dc(e);return!!r&&t===r[0]}function Hi(t){var n=t&&t.constructor,e="function"==typeof n&&n.prototype||fl;return t===e}function Yi(t){return t===t&&!su(t)}function Gi(t,n){return function(e){return null!=e&&(e[t]===n&&(n!==W||t in Object(e)))}}function Zi(t,n){var e=t[1],r=n[1],i=e|r,o=i<(J|K|it),a=r==it&&e==tt||r==it&&e==ot&&t[7].length<=n[8]||r==(it|ot)&&n[7].length<=n[8]&&e==tt;if(!o&&!a)return t;r&J&&(t[2]=n[2],i|=e&J?0:Q);var u=n[3];if(u){var s=t[3];t[3]=s?Gr(s,u,n[4]):u,t[4]=s?I(t[3],X):n[4]}return u=n[5],u&&(s=t[5],t[5]=s?Zr(s,u,n[6]):u,t[6]=s?I(t[5],X):n[6]),u=n[7],u&&(t[7]=u),r&it&&(t[8]=null==t[8]?n[8]:Il(t[8],n[8])),null==t[9]&&(t[9]=n[9]),t[0]=n[0],t[1]=i,t}function Xi(t,n,e,r,i,o){return su(t)&&su(n)&&ar(t,n,W,Xi,o.set(n,t)),t}function Ji(t,n){return 1==n.length?t:qe(t,br(n,0,-1))}function Ki(t,n){for(var e=t.length,r=Il(n.length,e),i=Xr(t);r--;){var o=n[r];t[r]=qi(o,e)?i[o]:W}return t}function Qi(t){if("string"==typeof t||Cu(t))return t;var n=t+"";return"0"==n&&1/t==-gt?"-0":n}function to(t){if(null!=t){try{return pl.call(t)}catch(n){}try{return t+""}catch(n){}}return""}function no(t){if(t instanceof Tn)return t.clone();var n=new On(t.__wrapped__,t.__chain__);return n.__actions__=Xr(t.__actions__),n.__index__=t.__index__,n.__values__=t.__values__,n}function eo(t,n,e){n=(e?zi(t,n,e):n===W)?1:Fl(Eu(n),0);var r=t?t.length:0;if(!r||n<1)return[];for(var i=0,o=0,a=Array(Tl(r/n));i<r;)a[o++]=br(t,i,i+=n);return a}function ro(t){for(var n=-1,e=t?t.length:0,r=0,i=[];++n<e;){var o=t[n];o&&(i[r++]=o)}return i}function io(){var t=arguments.length,n=qa(arguments[0]);if(t<2)return t?Xr(n):[];for(var e=Array(t-1);t--;)e[t-1]=arguments[t];return i(n,je(e,1))}function oo(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),br(t,n<0?0:n,r)):[]}function ao(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),n=r-n,br(t,0,n<0?0:n)):[]}function uo(t,n){return t&&t.length?Pr(t,_i(n,3),!0,!0):[]}function so(t,n){return t&&t.length?Pr(t,_i(n,3),!0):[]}function lo(t,n,e,r){var i=t?t.length:0;return i?(e&&"number"!=typeof e&&zi(t,n,e)&&(e=0,r=i),Le(t,n,e,r)):[]}function co(t,n){return t&&t.length?m(t,_i(n,3)):-1}function fo(t,n){return t&&t.length?m(t,_i(n,3),!0):-1}function ho(t){var n=t?t.length:0;return n?je(t,1):[]}function po(t){var n=t?t.length:0;return n?je(t,gt):[]}function vo(t,n){var e=t?t.length:0;return e?(n=n===W?1:Eu(n),je(t,n)):[]}function go(t){for(var n=-1,e=t?t.length:0,r={};++n<e;){var i=t[n];r[i[0]]=i[1]}return r}function mo(t){return t&&t.length?t[0]:W}function yo(t,n,e){var r=t?t.length:0;return r?(e=Eu(e),e<0&&(e=Fl(r+e,0)),y(t,n,e)):-1}function $o(t){return ao(t,1)}function bo(t,n){return t?Rl.call(t,n):""}function xo(t){var n=t?t.length:0;return n?t[n-1]:W}function wo(t,n,e){var r=t?t.length:0;if(!r)return-1;var i=r;if(e!==W&&(i=Eu(e),i=(i<0?Fl(r+i,0):Il(i,r-1))+1),n!==n)return j(t,i,!0);for(;i--;)if(t[i]===n)return i;return-1}function Co(t,n){return t&&t.length?sr(t,Eu(n)):W}function So(t,n){return t&&t.length&&n&&n.length?dr(t,n):t}function Mo(t,n,e){return t&&t.length&&n&&n.length?dr(t,n,_i(e)):t}function _o(t,n,e){return t&&t.length&&n&&n.length?dr(t,n,W,e):t}function ko(t,n){var e=[];if(!t||!t.length)return e;var r=-1,i=[],o=t.length;for(n=_i(n,3);++r<o;){var a=t[r];n(a,r,t)&&(e.push(a),i.push(r))}return vr(t,i),e}function Ao(t){return t?Bl.call(t):t}function Eo(t,n,e){var r=t?t.length:0;return r?(e&&"number"!=typeof e&&zi(t,n,e)?(n=0,e=r):(n=null==n?0:Eu(n),e=e===W?r:Eu(e)),br(t,n,e)):[]}function Po(t,n){return wr(t,n)}function Oo(t,n,e){return Cr(t,n,_i(e))}function To(t,n){var e=t?t.length:0;if(e){var r=wr(t,n);if(r<e&&Ha(t[r],n))return r}return-1}function Lo(t,n){return wr(t,n,!0)}function No(t,n,e){return Cr(t,n,_i(e),!0)}function jo(t,n){var e=t?t.length:0;if(e){var r=wr(t,n,!0)-1;if(Ha(t[r],n))return r}return-1}function Ro(t){return t&&t.length?Sr(t):[]}function Do(t,n){return t&&t.length?Sr(t,_i(n)):[]}function Fo(t){return oo(t,1)}function Io(t,n,e){return t&&t.length?(n=e||n===W?1:Eu(n),br(t,0,n<0?0:n)):[]}function Vo(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),n=r-n,br(t,n<0?0:n,r)):[]}function qo(t,n){return t&&t.length?Pr(t,_i(n,3),!1,!0):[]}function zo(t,n){return t&&t.length?Pr(t,_i(n,3)):[]}function Bo(t){return t&&t.length?kr(t):[]}function Uo(t,n){return t&&t.length?kr(t,_i(n)):[]}function Wo(t,n){return t&&t.length?kr(t,W,n):[]}function Ho(t){if(!t||!t.length)return[];var n=0;return t=s(t,function(t){if(Xa(t))return n=Fl(t.length,n),!0}),S(n,function(n){return f(t,hr(n))})}function Yo(t,n){if(!t||!t.length)return[];var r=Ho(t);return null==n?r:f(r,function(t){return e(n,W,t)})}function Go(t,n){return Lr(t||[],n||[],le)}function Zo(t,n){return Lr(t||[],n||[],$r)}function Xo(t){var n=En(t);return n.__chain__=!0,n}function Jo(t,n){return n(t),t}function Ko(t,n){return n(t)}function Qo(){return Xo(this)}function ta(){return new On(this.value(),this.__chain__)}function na(){this.__values__===W&&(this.__values__=Au(this.value()));var t=this.__index__>=this.__values__.length,n=t?W:this.__values__[this.__index__++];return{done:t,value:n}}function ea(){return this}function ra(t){for(var n,e=this;e instanceof Pn;){var r=no(e);r.__index__=0,r.__values__=W,n?i.__wrapped__=r:n=r;var i=r;e=e.__wrapped__}return i.__wrapped__=t,n}function ia(){var t=this.__wrapped__;if(t instanceof Tn){var n=t;return this.__actions__.length&&(n=new Tn(this)),n=n.reverse(),n.__actions__.push({func:Ko,args:[Ao],thisArg:W}),new On(n,this.__chain__)}return this.thru(Ao)}function oa(){return Or(this.__wrapped__,this.__actions__)}function aa(t,n,e){var r=tf(t)?u:Pe;return e&&zi(t,n,e)&&(n=W),r(t,_i(n,3))}function ua(t,n){var e=tf(t)?s:Ne;return e(t,_i(n,3))}function sa(t,n){if(n=_i(n,3),tf(t)){var e=m(t,n);return e>-1?t[e]:W}return g(t,n,sc)}function la(t,n){if(n=_i(n,3),tf(t)){var e=m(t,n,!0);return e>-1?t[e]:W}return g(t,n,lc)}function ca(t,n){return je(ga(t,n),1)}function fa(t,n){return je(ga(t,n),gt)}function ha(t,n,e){return e=e===W?1:Eu(e),je(ga(t,n),e)}function pa(t,n){return"function"==typeof n&&tf(t)?o(t,n):sc(t,_i(n))}function da(t,n){return"function"==typeof n&&tf(t)?a(t,n):lc(t,_i(n))}function va(t,n,e,r){t=Za(t)?t:ss(t),e=e&&!r?Eu(e):0;var i=t.length;return e<0&&(e=Fl(i+e,0)),wu(t)?e<=i&&t.indexOf(n,e)>-1:!!i&&y(t,n,e)>-1}function ga(t,n){var e=tf(t)?f:rr;return e(t,_i(n,3))}function ma(t,n,e,r){return null==t?[]:(tf(n)||(n=null==n?[]:[n]),e=r?W:e,tf(e)||(e=null==e?[]:[e]),lr(t,n,e))}function ya(t,n,e){var r=tf(t)?p:x,i=arguments.length<3;return r(t,_i(n,4),e,i,sc)}function $a(t,n,e){var r=tf(t)?d:x,i=arguments.length<3;return r(t,_i(n,4),e,i,lc)}function ba(t,n){var e=tf(t)?s:Ne;return n=_i(n,3),e(t,function(t,e,r){return!n(t,e,r)})}function xa(t){var n=Za(t)?t:ss(t),e=n.length;return e>0?n[gr(0,e-1)]:W}function wa(t,n,e){var r=-1,i=Au(t),o=i.length,a=o-1;for(n=(e?zi(t,n,e):n===W)?1:we(Eu(n),0,o);++r<n;){var u=gr(r,a),s=i[u];i[u]=i[r],i[r]=s}return i.length=n,i}function Ca(t){return wa(t,bt)}function Sa(t){if(null==t)return 0;if(Za(t)){var n=t.length;return n&&wu(t)?q(t):n}if(lu(t)){var e=Ti(t);if(e==Pt||e==jt)return t.size}return Yu(t).length}function Ma(t,n,e){var r=tf(t)?v:xr;return e&&zi(t,n,e)&&(n=W),r(t,_i(n,3))}function _a(t,n){if("function"!=typeof n)throw new ll(G);return t=Eu(t),function(){if(--t<1)return n.apply(this,arguments)}}function ka(t,n,e){return n=e?W:n,n=t&&null==n?t.length:n,$i(t,it,W,W,W,W,n)}function Aa(t,n){var e;if("function"!=typeof n)throw new ll(G);return t=Eu(t),function(){return--t>0&&(e=n.apply(this,arguments)),t<=1&&(n=W),e}}function Ea(t,n,e){n=e?W:n;var r=$i(t,tt,W,W,W,W,W,n);return r.placeholder=Ea.placeholder,r}function Pa(t,n,e){n=e?W:n;var r=$i(t,nt,W,W,W,W,W,n);return r.placeholder=Pa.placeholder,r}function Oa(t,n,e){function r(n){var e=h,r=p;return h=p=W,y=n,v=t.apply(r,e)}function i(t){return y=t,g=Pl(u,n),$?r(t):v}function o(t){var e=t-m,r=t-y,i=n-e;return b?Il(i,d-r):i}function a(t){var e=t-m,r=t-y;return!m||e>=n||e<0||b&&r>=d}function u(){var t=Bc();return a(t)?s(t):void(g=Pl(u,o(t)))}function s(t){return Sl(g),g=W,x&&h?r(t):(h=p=W,v)}function l(){g!==W&&Sl(g),m=y=0,h=p=g=W}function c(){return g===W?v:s(Bc())}function f(){var t=Bc(),e=a(t);if(h=arguments,p=this,m=t,e){if(g===W)return i(m);if(b)return Sl(g),g=Pl(u,n),r(m)}return g===W&&(g=Pl(u,n)),v}var h,p,d,v,g,m=0,y=0,$=!1,b=!1,x=!0;if("function"!=typeof t)throw new ll(G);return n=Ou(n)||0,su(e)&&($=!!e.leading,b="maxWait"in e,d=b?Fl(Ou(e.maxWait)||0,n):d,x="trailing"in e?!!e.trailing:x),f.cancel=l,f.flush=c,f}function Ta(t){return $i(t,at)}function La(t,n){if("function"!=typeof t||n&&"function"!=typeof n)throw new ll(G);var e=function(){var r=arguments,i=n?n.apply(this,r):r[0],o=e.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return e.cache=o.set(i,a),a};return e.cache=new(La.Cache||qn),e}function Na(t){if("function"!=typeof t)throw new ll(G);return function(){return!t.apply(this,arguments)}}function ja(t){return Aa(2,t)}function Ra(t,n){if("function"!=typeof t)throw new ll(G);return n=Fl(n===W?t.length-1:Eu(n),0),function(){for(var r=arguments,i=-1,o=Fl(r.length-n,0),a=Array(o);++i<o;)a[i]=r[n+i];switch(n){case 0:return t.call(this,a);case 1:return t.call(this,r[0],a);case 2:return t.call(this,r[0],r[1],a)}var u=Array(n+1);for(i=-1;++i<n;)u[i]=r[i];return u[n]=a,e(t,this,u)}}function Da(t,n){if("function"!=typeof t)throw new ll(G);return n=n===W?0:Fl(Eu(n),0),Ra(function(r){var i=r[n],o=Dr(r,0,n);return i&&h(o,i),e(t,this,o)})}function Fa(t,n,e){var r=!0,i=!0;if("function"!=typeof t)throw new ll(G);return su(e)&&(r="leading"in e?!!e.leading:r,i="trailing"in e?!!e.trailing:i),Oa(t,n,{leading:r,maxWait:n,trailing:i})}function Ia(t){return ka(t,1)}function Va(t,n){return n=null==n?Fs:n,Zc(n,t)}function qa(){if(!arguments.length)return[];var t=arguments[0];return tf(t)?t:[t]}function za(t){return Ce(t,!1,!0)}function Ba(t,n){return Ce(t,!1,!0,n)}function Ua(t){return Ce(t,!0,!0)}function Wa(t,n){return Ce(t,!0,!0,n)}function Ha(t,n){return t===n||t!==t&&n!==n}function Ya(t){return Xa(t)&&dl.call(t,"callee")&&(!El.call(t,"callee")||ml.call(t)==Ct)}function Ga(t){return lu(t)&&ml.call(t)==Vt}function Za(t){return null!=t&&uu(vc(t))&&!ou(t)}function Xa(t){return lu(t)&&Za(t)}function Ja(t){return t===!0||t===!1||lu(t)&&ml.call(t)==Mt}function Ka(t){return lu(t)&&ml.call(t)==_t}function Qa(t){return!!t&&1===t.nodeType&&lu(t)&&!yu(t)}function tu(t){if(Za(t)&&(tf(t)||wu(t)||ou(t.splice)||Ya(t)||nf(t)))return!t.length;if(lu(t)){var n=Ti(t);if(n==Pt||n==jt)return!t.size}for(var e in t)if(dl.call(t,e))return!1;return!(Kl&&Yu(t).length)}function nu(t,n){return Xe(t,n)}function eu(t,n,e){e="function"==typeof e?e:W;var r=e?e(t,n):W;return r===W?Xe(t,n,e):!!r}function ru(t){return!!lu(t)&&(ml.call(t)==kt||"string"==typeof t.message&&"string"==typeof t.name)}function iu(t){return"number"==typeof t&&jl(t)}function ou(t){var n=su(t)?ml.call(t):"";return n==At||n==Et}function au(t){return"number"==typeof t&&t==Eu(t)}function uu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=mt}function su(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function lu(t){return!!t&&"object"==typeof t}function cu(t){return lu(t)&&Ti(t)==Pt}function fu(t,n){return t===n||Ke(t,n,ki(n))}function hu(t,n,e){return e="function"==typeof e?e:W,Ke(t,n,ki(n),e)}function pu(t){return mu(t)&&t!=+t}function du(t){if(!su(t))return!1;var n=ou(t)||R(t)?$l:Cn;return n.test(to(t))}function vu(t){return null===t}function gu(t){return null==t}function mu(t){return"number"==typeof t||lu(t)&&ml.call(t)==Ot}function yu(t){if(!lu(t)||ml.call(t)!=Tt||R(t))return!1;var n=Pi(t);if(null===n)return!0;var e=dl.call(n,"constructor")&&n.constructor;return"function"==typeof e&&e instanceof e&&pl.call(e)==gl}function $u(t){return su(t)&&ml.call(t)==Nt}function bu(t){return au(t)&&t>=-mt&&t<=mt}function xu(t){return lu(t)&&Ti(t)==jt}function wu(t){return"string"==typeof t||!tf(t)&&lu(t)&&ml.call(t)==Rt}function Cu(t){return"symbol"==typeof t||lu(t)&&ml.call(t)==Dt}function Su(t){return lu(t)&&uu(t.length)&&!!be[ml.call(t)]}function Mu(t){return t===W}function _u(t){return lu(t)&&Ti(t)==Ft}function ku(t){return lu(t)&&ml.call(t)==It}function Au(t){if(!t)return[];if(Za(t))return wu(t)?z(t):Xr(t);if(kl&&t[kl])return D(t[kl]());var n=Ti(t),e=n==Pt?F:n==jt?V:ss;return e(t)}function Eu(t){if(!t)return 0===t?t:0;if(t=Ou(t),t===gt||t===-gt){var n=t<0?-1:1;return n*yt}var e=t%1;return t===t?e?t-e:t:0}function Pu(t){return t?we(Eu(t),0,bt):0}function Ou(t){if("number"==typeof t)return t;if(Cu(t))return $t;if(su(t)){var n=ou(t.valueOf)?t.valueOf():t;t=su(n)?n+"":n}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(pn,"");var e=wn.test(t);return e||Sn.test(t)?Ae(t.slice(2),e?2:8):xn.test(t)?$t:+t}function Tu(t){return Jr(t,Gu(t))}function Lu(t){return we(Eu(t),-mt,mt)}function Nu(t){return null==t?"":_r(t)}function ju(t,n){var e=Me(t);return n?fe(e,n):e}function Ru(t,n){return g(t,_i(n,3),Fe,!0)}function Du(t,n){return g(t,_i(n,3),Ie,!0)}function Fu(t,n){return null==t?t:cc(t,_i(n),Gu)}function Iu(t,n){return null==t?t:fc(t,_i(n),Gu)}function Vu(t,n){return t&&Fe(t,_i(n))}function qu(t,n){return t&&Ie(t,_i(n))}function zu(t){return null==t?[]:Ve(t,Yu(t))}function Bu(t){return null==t?[]:Ve(t,Gu(t))}function Uu(t,n,e){var r=null==t?W:qe(t,n);return r===W?e:r}function Wu(t,n){return null!=t&&Ni(t,n,Ue)}function Hu(t,n){return null!=t&&Ni(t,n,We)}function Yu(t){var n=Hi(t);if(!n&&!Za(t))return tr(t);var e=Fi(t),r=!!e,i=e||[],o=i.length;for(var a in t)!Ue(t,a)||r&&("length"==a||qi(a,o))||n&&"constructor"==a||i.push(a);return i}function Gu(t){for(var n=-1,e=Hi(t),r=nr(t),i=r.length,o=Fi(t),a=!!o,u=o||[],s=u.length;++n<i;){var l=r[n];a&&("length"==l||qi(l,s))||"constructor"==l&&(e||!dl.call(t,l))||u.push(l)}return u}function Zu(t,n){var e={};return n=_i(n,3),Fe(t,function(t,r,i){e[n(t,r,i)]=t}),e}function Xu(t,n){var e={};return n=_i(n,3),Fe(t,function(t,r,i){e[r]=n(t,r,i)}),e}function Ju(t,n){return n=_i(n),fr(t,function(t,e){return!n(t,e)})}function Ku(t,n){return null==t?{}:fr(t,_i(n))}function Qu(t,n,e){n=Bi(n,t)?[n]:Rr(n);var r=-1,i=n.length;for(i||(t=W,i=1);++r<i;){var o=null==t?W:t[Qi(n[r])];o===W&&(r=i,o=e),t=ou(o)?o.call(t):o}return t}function ts(t,n,e){return null==t?t:$r(t,n,e)}function ns(t,n,e,r){return r="function"==typeof r?r:W,null==t?t:$r(t,n,e,r)}function es(t){return M(t,Yu(t))}function rs(t){return M(t,Gu(t))}function is(t,n,e){var r=tf(t)||Su(t);if(n=_i(n,4),null==e)if(r||su(t)){var i=t.constructor;e=r?tf(t)?new i:[]:ou(i)?Me(Pi(t)):{}}else e={};return(r?o:Fe)(t,function(t,r,i){return n(e,t,r,i)}),e}function os(t,n){return null==t||Ar(t,n)}function as(t,n,e){return null==t?t:Er(t,n,jr(e))}function us(t,n,e,r){return r="function"==typeof r?r:W,null==t?t:Er(t,n,jr(e),r)}function ss(t){return t?k(t,Yu(t)):[]}function ls(t){return null==t?[]:k(t,Gu(t))}function cs(t,n,e){return e===W&&(e=n,n=W),e!==W&&(e=Ou(e),e=e===e?e:0),n!==W&&(n=Ou(n),n=n===n?n:0),we(Ou(t),n,e)}function fs(t,n,e){return n=Ou(n)||0,e===W?(e=n,n=0):e=Ou(e)||0,t=Ou(t),He(t,n,e)}function hs(t,n,e){if(e&&"boolean"!=typeof e&&zi(t,n,e)&&(n=e=W),e===W&&("boolean"==typeof n?(e=n,n=W):"boolean"==typeof t&&(e=t,t=W)),t===W&&n===W?(t=0,n=1):(t=Ou(t)||0,n===W?(n=t,t=0):n=Ou(n)||0),t>n){var r=t;t=n,n=r}if(e||t%1||n%1){var i=ql();return Il(t+i*(n-t+ke("1e-"+((i+"").length-1))),n)}return gr(t,n)}function ps(t){return _f(Nu(t).toLowerCase())}function ds(t){return t=Nu(t),t&&t.replace(_n,T).replace(pe,"")}function vs(t,n,e){t=Nu(t),n=_r(n);var r=t.length;return e=e===W?r:we(Eu(e),0,r),e-=n.length,e>=0&&t.indexOf(n,e)==e}function gs(t){return t=Nu(t),t&&rn.test(t)?t.replace(nn,L):t}function ms(t){return t=Nu(t),t&&hn.test(t)?t.replace(fn,"\\$&"):t}function ys(t,n,e){t=Nu(t),n=Eu(n);var r=n?q(t):0;if(!n||r>=n)return t;var i=(n-r)/2;return pi(Ll(i),e)+t+pi(Tl(i),e)}function $s(t,n,e){t=Nu(t),n=Eu(n);var r=n?q(t):0;return n&&r<n?t+pi(n-r,e):t}function bs(t,n,e){t=Nu(t),n=Eu(n);var r=n?q(t):0;return n&&r<n?pi(n-r,e)+t:t}function xs(t,n,e){return e||null==n?n=0:n&&(n=+n),t=Nu(t).replace(pn,""),Vl(t,n||(bn.test(t)?16:10))}function ws(t,n,e){return n=(e?zi(t,n,e):n===W)?1:Eu(n),yr(Nu(t),n)}function Cs(){var t=arguments,n=Nu(t[0]);return t.length<3?n:zl.call(n,t[1],t[2])}function Ss(t,n,e){return e&&"number"!=typeof e&&zi(t,n,e)&&(n=e=W),(e=e===W?bt:e>>>0)?(t=Nu(t),t&&("string"==typeof n||null!=n&&!$u(n))&&(n=_r(n),""==n&&ge.test(t))?Dr(z(t),0,e):Ul.call(t,n,e)):[]}function Ms(t,n,e){return t=Nu(t),e=we(Eu(e),0,t.length),t.lastIndexOf(_r(n),e)==e}function _s(t,n,e){var r=En.templateSettings;e&&zi(t,n,e)&&(n=W),t=Nu(t),n=uf({},n,r,ue);var i,o,a=uf({},n.imports,r.imports,ue),u=Yu(a),s=k(a,u),l=0,c=n.interpolate||kn,f="__p += '",h=sl((n.escape||kn).source+"|"+c.source+"|"+(c===un?yn:kn).source+"|"+(n.evaluate||kn).source+"|$","g"),p="//# sourceURL="+("sourceURL"in n?n.sourceURL:"lodash.templateSources["+ ++$e+"]")+"\n";t.replace(h,function(n,e,r,a,u,s){return r||(r=a),f+=t.slice(l,s).replace(An,N),e&&(i=!0,f+="' +\n__e("+e+") +\n'"),u&&(o=!0,f+="';\n"+u+";\n__p += '"),r&&(f+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),l=s+n.length,n}),f+="';\n";var d=n.variable;d||(f="with (obj) {\n"+f+"\n}\n"),f=(o?f.replace(Jt,""):f).replace(Kt,"$1").replace(Qt,"$1;"),f="function("+(d||"obj")+") {\n"+(d?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+f+"return __p\n}";var v=kf(function(){return Function(u,p+"return "+f).apply(W,s)});if(v.source=f,ru(v))throw v;return v}function ks(t){return Nu(t).toLowerCase()}function As(t){return Nu(t).toUpperCase()}function Es(t,n,e){if(t=Nu(t),t&&(e||n===W))return t.replace(pn,"");if(!t||!(n=_r(n)))return t;var r=z(t),i=z(n),o=A(r,i),a=E(r,i)+1;return Dr(r,o,a).join("")}function Ps(t,n,e){if(t=Nu(t),t&&(e||n===W))return t.replace(vn,"");if(!t||!(n=_r(n)))return t;var r=z(t),i=E(r,z(n))+1;return Dr(r,0,i).join("")}function Os(t,n,e){if(t=Nu(t),t&&(e||n===W))return t.replace(dn,"");if(!t||!(n=_r(n)))return t;var r=z(t),i=A(r,z(n));return Dr(r,i).join("")}function Ts(t,n){var e=lt,r=ct;if(su(n)){var i="separator"in n?n.separator:i;e="length"in n?Eu(n.length):e,r="omission"in n?_r(n.omission):r}t=Nu(t);var o=t.length;if(ge.test(t)){var a=z(t);o=a.length}if(e>=o)return t;var u=e-q(r);if(u<1)return r;var s=a?Dr(a,0,u).join(""):t.slice(0,u);if(i===W)return s+r;if(a&&(u+=s.length-u),$u(i)){if(t.slice(u).search(i)){var l,c=s;for(i.global||(i=sl(i.source,Nu($n.exec(i))+"g")),i.lastIndex=0;l=i.exec(c);)var f=l.index;s=s.slice(0,f===W?u:f)}}else if(t.indexOf(_r(i),u)!=u){var h=s.lastIndexOf(i);h>-1&&(s=s.slice(0,h))}return s+r}function Ls(t){return t=Nu(t),t&&en.test(t)?t.replace(tn,B):t}function Ns(t,n,e){return t=Nu(t),n=e?W:n,n===W&&(n=me.test(t)?ve:gn),t.match(n)||[]}function js(t){var n=t?t.length:0,r=_i();return t=n?f(t,function(t){if("function"!=typeof t[1])throw new ll(G);return[r(t[0]),t[1]]}):[],Ra(function(r){for(var i=-1;++i<n;){var o=t[i];if(e(o[0],this,r))return e(o[1],this,r)}})}function Rs(t){return Se(Ce(t,!0))}function Ds(t){return function(){return t}}function Fs(t){return t}function Is(t){return Qe("function"==typeof t?t:Ce(t,!0))}function Vs(t){return ir(Ce(t,!0))}function qs(t,n){return or(t,Ce(n,!0))}function zs(t,n,e){var r=Yu(n),i=Ve(n,r);null!=e||su(n)&&(i.length||!r.length)||(e=n,n=t,t=this,i=Ve(n,Yu(n)));var a=!(su(e)&&"chain"in e&&!e.chain),u=ou(t);return o(i,function(e){var r=n[e];t[e]=r,u&&(t.prototype[e]=function(){var n=this.__chain__;if(a||n){var e=t(this.__wrapped__),i=e.__actions__=Xr(this.__actions__);return i.push({func:r,args:arguments,thisArg:t}),e.__chain__=n,e}return r.apply(t,h([this.value()],arguments))})}),t}function Bs(){return Re._===this&&(Re._=yl),this}function Us(){}function Ws(t){return t=Eu(t),Ra(function(n){return sr(n,t)})}function Hs(t){return Bi(t)?hr(Qi(t)):pr(t)}function Ys(t){return function(n){return null==t?W:qe(t,n)}}function Gs(t,n){if(t=Eu(t),t<1||t>mt)return[];var e=bt,r=Il(t,bt);n=_i(n),t-=bt;for(var i=S(r,n);++e<t;)n(e);return i}function Zs(t){return tf(t)?f(t,Qi):Cu(t)?[t]:Xr(yc(t))}function Xs(t){var n=++vl;return Nu(t)+n}function Js(t){return t&&t.length?Te(t,Fs,Be):W}function Ks(t,n){return t&&t.length?Te(t,_i(n),Be):W}function Qs(t){return b(t,Fs)}function tl(t,n){return b(t,_i(n))}function nl(t){return t&&t.length?Te(t,Fs,er):W}function el(t,n){return t&&t.length?Te(t,_i(n),er):W}function rl(t){return t&&t.length?C(t,Fs):0}function il(t,n){return t&&t.length?C(t,_i(n)):0}P=P?De.defaults({},P,De.pick(Re,ye)):Re;var ol=P.Date,al=P.Error,ul=P.Math,sl=P.RegExp,ll=P.TypeError,cl=P.Array.prototype,fl=P.Object.prototype,hl=P.String.prototype,pl=P.Function.prototype.toString,dl=fl.hasOwnProperty,vl=0,gl=pl.call(Object),ml=fl.toString,yl=Re._,$l=sl("^"+pl.call(dl).replace(fn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),bl=Oe?P.Buffer:W,xl=P.Reflect,wl=P.Symbol,Cl=P.Uint8Array,Sl=P.clearTimeout,Ml=xl?xl.enumerate:W,_l=Object.getOwnPropertySymbols,kl="symbol"==typeof(kl=wl&&wl.iterator)?kl:W,Al=Object.create,El=fl.propertyIsEnumerable,Pl=P.setTimeout,Ol=cl.splice,Tl=ul.ceil,Ll=ul.floor,Nl=Object.getPrototypeOf,jl=P.isFinite,Rl=cl.join,Dl=Object.keys,Fl=ul.max,Il=ul.min,Vl=P.parseInt,ql=ul.random,zl=hl.replace,Bl=cl.reverse,Ul=hl.split,Wl=Ai(P,"DataView"),Hl=Ai(P,"Map"),Yl=Ai(P,"Promise"),Gl=Ai(P,"Set"),Zl=Ai(P,"WeakMap"),Xl=Ai(Object,"create"),Jl=Zl&&new Zl,Kl=!El.call({valueOf:1},"valueOf"),Ql={},tc=to(Wl),nc=to(Hl),ec=to(Yl),rc=to(Gl),ic=to(Zl),oc=wl?wl.prototype:W,ac=oc?oc.valueOf:W,uc=oc?oc.toString:W;En.templateSettings={escape:on,evaluate:an,interpolate:un,variable:"",imports:{_:En}},En.prototype=Pn.prototype,En.prototype.constructor=En,On.prototype=Me(Pn.prototype),On.prototype.constructor=On,Tn.prototype=Me(Pn.prototype),Tn.prototype.constructor=Tn,Rn.prototype=Xl?Xl(null):fl,qn.prototype.clear=zn,qn.prototype["delete"]=Bn,qn.prototype.get=Un,qn.prototype.has=Wn,qn.prototype.set=Hn,Yn.prototype.push=Zn,Xn.prototype.clear=Jn,Xn.prototype["delete"]=Kn,Xn.prototype.get=Qn,Xn.prototype.has=te,Xn.prototype.set=ne;var sc=ni(Fe),lc=ni(Ie,!0),cc=ei(),fc=ei(!0);Ml&&!El.call({valueOf:1},"valueOf")&&(nr=function(t){return D(Ml(t))});var hc=Jl?function(t,n){return Jl.set(t,n),t}:Fs,pc=Gl&&1/V(new Gl([,-0]))[1]==gt?function(t){return new Gl(t)}:Us,dc=Jl?function(t){return Jl.get(t)}:Us,vc=hr("length");_l||(Oi=function(){return[]});var gc=_l?function(t){for(var n=[];t;)h(n,Oi(t)),t=Pi(t);return n}:Oi;(Wl&&Ti(new Wl(new ArrayBuffer(1)))!=qt||Hl&&Ti(new Hl)!=Pt||Yl&&Ti(Yl.resolve())!=Lt||Gl&&Ti(new Gl)!=jt||Zl&&Ti(new Zl)!=Ft)&&(Ti=function(t){var n=ml.call(t),e=n==Tt?t.constructor:W,r=e?to(e):W;if(r)switch(r){case tc:return qt;case nc:return Pt;case ec:return Lt;case rc:return jt;case ic:return Ft}return n});var mc=function(){var t=0,n=0;return function(e,r){var i=Bc(),o=ht-(i-n);if(n=i,o>0){if(++t>=ft)return e}else t=0;return hc(e,r)}}(),yc=La(function(t){var n=[];return Nu(t).replace(cn,function(t,e,r,i){n.push(r?i.replace(mn,"$1"):e||t)}),n}),$c=Ra(function(t,n){return Xa(t)?Ee(t,je(n,1,Xa,!0)):[]}),bc=Ra(function(t,n){var e=xo(n);return Xa(e)&&(e=W),Xa(t)?Ee(t,je(n,1,Xa,!0),_i(e)):[]}),xc=Ra(function(t,n){var e=xo(n);return Xa(e)&&(e=W),Xa(t)?Ee(t,je(n,1,Xa,!0),W,e):[]}),wc=Ra(function(t){var n=f(t,Nr);return n.length&&n[0]===t[0]?Ye(n):[]}),Cc=Ra(function(t){var n=xo(t),e=f(t,Nr);return n===xo(e)?n=W:e.pop(),e.length&&e[0]===t[0]?Ye(e,_i(n)):[]}),Sc=Ra(function(t){var n=xo(t),e=f(t,Nr);return n===xo(e)?n=W:e.pop(),e.length&&e[0]===t[0]?Ye(e,W,n):[]}),Mc=Ra(So),_c=Ra(function(t,n){n=je(n,1);var e=t?t.length:0,r=de(t,n);return vr(t,f(n,function(t){return qi(t,e)?+t:t}).sort(Hr)),r}),kc=Ra(function(t){return kr(je(t,1,Xa,!0))}),Ac=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),kr(je(t,1,Xa,!0),_i(n))}),Ec=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),kr(je(t,1,Xa,!0),W,n)}),Pc=Ra(function(t,n){return Xa(t)?Ee(t,n):[]}),Oc=Ra(function(t){return Tr(s(t,Xa))}),Tc=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),Tr(s(t,Xa),_i(n))}),Lc=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),Tr(s(t,Xa),W,n)}),Nc=Ra(Ho),jc=Ra(function(t){var n=t.length,e=n>1?t[n-1]:W;return e="function"==typeof e?(t.pop(),e):W,Yo(t,e)}),Rc=Ra(function(t){t=je(t,1);var n=t.length,e=n?t[0]:0,r=this.__wrapped__,i=function(n){return de(n,t)};return!(n>1||this.__actions__.length)&&r instanceof Tn&&qi(e)?(r=r.slice(e,+e+(n?1:0)),r.__actions__.push({func:Ko,args:[i],thisArg:W}),new On(r,this.__chain__).thru(function(t){return n&&!t.length&&t.push(W),t})):this.thru(i)}),Dc=Qr(function(t,n,e){dl.call(t,e)?++t[e]:t[e]=1}),Fc=Qr(function(t,n,e){dl.call(t,e)?t[e].push(n):t[e]=[n]}),Ic=Ra(function(t,n,r){var i=-1,o="function"==typeof n,a=Bi(n),u=Za(t)?Array(t.length):[];return sc(t,function(t){var s=o?n:a&&null!=t?t[n]:W;u[++i]=s?e(s,t,r):Ze(t,n,r)}),u}),Vc=Qr(function(t,n,e){t[e]=n}),qc=Qr(function(t,n,e){t[e?0:1].push(n)},function(){return[[],[]]}),zc=Ra(function(t,n){if(null==t)return[];var e=n.length;return e>1&&zi(t,n[0],n[1])?n=[]:e>2&&zi(n[0],n[1],n[2])&&(n=[n[0]]),n=1==n.length&&tf(n[0])?n[0]:je(n,1,Vi),lr(t,n,[])}),Bc=ol.now,Uc=Ra(function(t,n,e){var r=J;if(e.length){var i=I(e,Ei(Uc));r|=et}return $i(t,r,n,e,i)}),Wc=Ra(function(t,n,e){var r=J|K;if(e.length){var i=I(e,Ei(Wc));r|=et}return $i(n,r,t,e,i)}),Hc=Ra(function(t,n){return _e(t,1,n)}),Yc=Ra(function(t,n,e){return _e(t,Ou(n)||0,e)});La.Cache=qn;var Gc=Ra(function(t,n){n=1==n.length&&tf(n[0])?f(n[0],_(_i())):f(je(n,1,Vi),_(_i()));var r=n.length;return Ra(function(i){for(var o=-1,a=Il(i.length,r);++o<a;)i[o]=n[o].call(this,i[o]);return e(t,this,i)})}),Zc=Ra(function(t,n){var e=I(n,Ei(Zc));return $i(t,et,W,n,e)}),Xc=Ra(function(t,n){var e=I(n,Ei(Xc));return $i(t,rt,W,n,e)}),Jc=Ra(function(t,n){return $i(t,ot,W,W,W,je(n,1))}),Kc=gi(Be),Qc=gi(function(t,n){return t>=n}),tf=Array.isArray,nf=bl?function(t){return t instanceof bl}:Ds(!1),ef=gi(er),rf=gi(function(t,n){return t<=n}),of=ti(function(t,n){if(Kl||Hi(n)||Za(n))return void Jr(n,Yu(n),t);for(var e in n)dl.call(n,e)&&le(t,e,n[e])}),af=ti(function(t,n){if(Kl||Hi(n)||Za(n))return void Jr(n,Gu(n),t);for(var e in n)le(t,e,n[e])}),uf=ti(function(t,n,e,r){Jr(n,Gu(n),t,r)}),sf=ti(function(t,n,e,r){Jr(n,Yu(n),t,r)}),lf=Ra(function(t,n){return de(t,je(n,1))}),cf=Ra(function(t){return t.push(W,ue),e(uf,W,t)}),ff=Ra(function(t){return t.push(W,Xi),e(gf,W,t)}),hf=ci(function(t,n,e){t[n]=e},Ds(Fs)),pf=ci(function(t,n,e){dl.call(t,n)?t[n].push(e):t[n]=[e]},_i),df=Ra(Ze),vf=ti(function(t,n,e){ar(t,n,e)}),gf=ti(function(t,n,e,r){ar(t,n,e,r)}),mf=Ra(function(t,n){return null==t?{}:(n=f(je(n,1),Qi),cr(t,Ee(Si(t),n)))}),yf=Ra(function(t,n){return null==t?{}:cr(t,f(je(n,1),Qi))}),$f=oi(function(t,n,e){return n=n.toLowerCase(),t+(e?ps(n):n)}),bf=oi(function(t,n,e){return t+(e?"-":"")+n.toLowerCase()}),xf=oi(function(t,n,e){return t+(e?" ":"")+n.toLowerCase()}),wf=ii("toLowerCase"),Cf=oi(function(t,n,e){return t+(e?"_":"")+n.toLowerCase()}),Sf=oi(function(t,n,e){return t+(e?" ":"")+_f(n)}),Mf=oi(function(t,n,e){return t+(e?" ":"")+n.toUpperCase()}),_f=ii("toUpperCase"),kf=Ra(function(t,n){try{return e(t,W,n)}catch(r){return ru(r)?r:new al(r)}}),Af=Ra(function(t,n){return o(je(n,1),function(n){n=Qi(n),t[n]=Uc(t[n],t)}),t}),Ef=si(),Pf=si(!0),Of=Ra(function(t,n){return function(e){return Ze(e,t,n)}}),Tf=Ra(function(t,n){return function(e){return Ze(t,e,n)}}),Lf=hi(f),Nf=hi(u),jf=hi(v),Rf=vi(),Df=vi(!0),Ff=fi(function(t,n){return t+n}),If=yi("ceil"),Vf=fi(function(t,n){return t/n}),qf=yi("floor"),zf=fi(function(t,n){return t*n}),Bf=yi("round"),Uf=fi(function(t,n){return t-n});return En.after=_a,En.ary=ka,En.assign=of,En.assignIn=af,En.assignInWith=uf,En.assignWith=sf,En.at=lf,En.before=Aa,En.bind=Uc,En.bindAll=Af,En.bindKey=Wc,En.castArray=qa,En.chain=Xo,En.chunk=eo,En.compact=ro,En.concat=io,En.cond=js,En.conforms=Rs,En.constant=Ds,
-En.countBy=Dc,En.create=ju,En.curry=Ea,En.curryRight=Pa,En.debounce=Oa,En.defaults=cf,En.defaultsDeep=ff,En.defer=Hc,En.delay=Yc,En.difference=$c,En.differenceBy=bc,En.differenceWith=xc,En.drop=oo,En.dropRight=ao,En.dropRightWhile=uo,En.dropWhile=so,En.fill=lo,En.filter=ua,En.flatMap=ca,En.flatMapDeep=fa,En.flatMapDepth=ha,En.flatten=ho,En.flattenDeep=po,En.flattenDepth=vo,En.flip=Ta,En.flow=Ef,En.flowRight=Pf,En.fromPairs=go,En.functions=zu,En.functionsIn=Bu,En.groupBy=Fc,En.initial=$o,En.intersection=wc,En.intersectionBy=Cc,En.intersectionWith=Sc,En.invert=hf,En.invertBy=pf,En.invokeMap=Ic,En.iteratee=Is,En.keyBy=Vc,En.keys=Yu,En.keysIn=Gu,En.map=ga,En.mapKeys=Zu,En.mapValues=Xu,En.matches=Vs,En.matchesProperty=qs,En.memoize=La,En.merge=vf,En.mergeWith=gf,En.method=Of,En.methodOf=Tf,En.mixin=zs,En.negate=Na,En.nthArg=Ws,En.omit=mf,En.omitBy=Ju,En.once=ja,En.orderBy=ma,En.over=Lf,En.overArgs=Gc,En.overEvery=Nf,En.overSome=jf,En.partial=Zc,En.partialRight=Xc,En.partition=qc,En.pick=yf,En.pickBy=Ku,En.property=Hs,En.propertyOf=Ys,En.pull=Mc,En.pullAll=So,En.pullAllBy=Mo,En.pullAllWith=_o,En.pullAt=_c,En.range=Rf,En.rangeRight=Df,En.rearg=Jc,En.reject=ba,En.remove=ko,En.rest=Ra,En.reverse=Ao,En.sampleSize=wa,En.set=ts,En.setWith=ns,En.shuffle=Ca,En.slice=Eo,En.sortBy=zc,En.sortedUniq=Ro,En.sortedUniqBy=Do,En.split=Ss,En.spread=Da,En.tail=Fo,En.take=Io,En.takeRight=Vo,En.takeRightWhile=qo,En.takeWhile=zo,En.tap=Jo,En.throttle=Fa,En.thru=Ko,En.toArray=Au,En.toPairs=es,En.toPairsIn=rs,En.toPath=Zs,En.toPlainObject=Tu,En.transform=is,En.unary=Ia,En.union=kc,En.unionBy=Ac,En.unionWith=Ec,En.uniq=Bo,En.uniqBy=Uo,En.uniqWith=Wo,En.unset=os,En.unzip=Ho,En.unzipWith=Yo,En.update=as,En.updateWith=us,En.values=ss,En.valuesIn=ls,En.without=Pc,En.words=Ns,En.wrap=Va,En.xor=Oc,En.xorBy=Tc,En.xorWith=Lc,En.zip=Nc,En.zipObject=Go,En.zipObjectDeep=Zo,En.zipWith=jc,En.entries=es,En.entriesIn=rs,En.extend=af,En.extendWith=uf,zs(En,En),En.add=Ff,En.attempt=kf,En.camelCase=$f,En.capitalize=ps,En.ceil=If,En.clamp=cs,En.clone=za,En.cloneDeep=Ua,En.cloneDeepWith=Wa,En.cloneWith=Ba,En.deburr=ds,En.divide=Vf,En.endsWith=vs,En.eq=Ha,En.escape=gs,En.escapeRegExp=ms,En.every=aa,En.find=sa,En.findIndex=co,En.findKey=Ru,En.findLast=la,En.findLastIndex=fo,En.findLastKey=Du,En.floor=qf,En.forEach=pa,En.forEachRight=da,En.forIn=Fu,En.forInRight=Iu,En.forOwn=Vu,En.forOwnRight=qu,En.get=Uu,En.gt=Kc,En.gte=Qc,En.has=Wu,En.hasIn=Hu,En.head=mo,En.identity=Fs,En.includes=va,En.indexOf=yo,En.inRange=fs,En.invoke=df,En.isArguments=Ya,En.isArray=tf,En.isArrayBuffer=Ga,En.isArrayLike=Za,En.isArrayLikeObject=Xa,En.isBoolean=Ja,En.isBuffer=nf,En.isDate=Ka,En.isElement=Qa,En.isEmpty=tu,En.isEqual=nu,En.isEqualWith=eu,En.isError=ru,En.isFinite=iu,En.isFunction=ou,En.isInteger=au,En.isLength=uu,En.isMap=cu,En.isMatch=fu,En.isMatchWith=hu,En.isNaN=pu,En.isNative=du,En.isNil=gu,En.isNull=vu,En.isNumber=mu,En.isObject=su,En.isObjectLike=lu,En.isPlainObject=yu,En.isRegExp=$u,En.isSafeInteger=bu,En.isSet=xu,En.isString=wu,En.isSymbol=Cu,En.isTypedArray=Su,En.isUndefined=Mu,En.isWeakMap=_u,En.isWeakSet=ku,En.join=bo,En.kebabCase=bf,En.last=xo,En.lastIndexOf=wo,En.lowerCase=xf,En.lowerFirst=wf,En.lt=ef,En.lte=rf,En.max=Js,En.maxBy=Ks,En.mean=Qs,En.meanBy=tl,En.min=nl,En.minBy=el,En.multiply=zf,En.nth=Co,En.noConflict=Bs,En.noop=Us,En.now=Bc,En.pad=ys,En.padEnd=$s,En.padStart=bs,En.parseInt=xs,En.random=hs,En.reduce=ya,En.reduceRight=$a,En.repeat=ws,En.replace=Cs,En.result=Qu,En.round=Bf,En.runInContext=U,En.sample=xa,En.size=Sa,En.snakeCase=Cf,En.some=Ma,En.sortedIndex=Po,En.sortedIndexBy=Oo,En.sortedIndexOf=To,En.sortedLastIndex=Lo,En.sortedLastIndexBy=No,En.sortedLastIndexOf=jo,En.startCase=Sf,En.startsWith=Ms,En.subtract=Uf,En.sum=rl,En.sumBy=il,En.template=_s,En.times=Gs,En.toInteger=Eu,En.toLength=Pu,En.toLower=ks,En.toNumber=Ou,En.toSafeInteger=Lu,En.toString=Nu,En.toUpper=As,En.trim=Es,En.trimEnd=Ps,En.trimStart=Os,En.truncate=Ts,En.unescape=Ls,En.uniqueId=Xs,En.upperCase=Mf,En.upperFirst=_f,En.each=pa,En.eachRight=da,En.first=mo,zs(En,function(){var t={};return Fe(En,function(n,e){dl.call(En.prototype,e)||(t[e]=n)}),t}(),{chain:!1}),En.VERSION=H,o(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){En[t].placeholder=En}),o(["drop","take"],function(t,n){Tn.prototype[t]=function(e){var r=this.__filtered__;if(r&&!n)return new Tn(this);e=e===W?1:Fl(Eu(e),0);var i=this.clone();return r?i.__takeCount__=Il(e,i.__takeCount__):i.__views__.push({size:Il(e,bt),type:t+(i.__dir__<0?"Right":"")}),i},Tn.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),o(["filter","map","takeWhile"],function(t,n){var e=n+1,r=e==pt||e==vt;Tn.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({iteratee:_i(t,3),type:e}),n.__filtered__=n.__filtered__||r,n}}),o(["head","last"],function(t,n){var e="take"+(n?"Right":"");Tn.prototype[t]=function(){return this[e](1).value()[0]}}),o(["initial","tail"],function(t,n){var e="drop"+(n?"":"Right");Tn.prototype[t]=function(){return this.__filtered__?new Tn(this):this[e](1)}}),Tn.prototype.compact=function(){return this.filter(Fs)},Tn.prototype.find=function(t){return this.filter(t).head()},Tn.prototype.findLast=function(t){return this.reverse().find(t)},Tn.prototype.invokeMap=Ra(function(t,n){return"function"==typeof t?new Tn(this):this.map(function(e){return Ze(e,t,n)})}),Tn.prototype.reject=function(t){return t=_i(t,3),this.filter(function(n){return!t(n)})},Tn.prototype.slice=function(t,n){t=Eu(t);var e=this;return e.__filtered__&&(t>0||n<0)?new Tn(e):(t<0?e=e.takeRight(-t):t&&(e=e.drop(t)),n!==W&&(n=Eu(n),e=n<0?e.dropRight(-n):e.take(n-t)),e)},Tn.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Tn.prototype.toArray=function(){return this.take(bt)},Fe(Tn.prototype,function(t,n){var e=/^(?:filter|find|map|reject)|While$/.test(n),r=/^(?:head|last)$/.test(n),i=En[r?"take"+("last"==n?"Right":""):n],o=r||/^find/.test(n);i&&(En.prototype[n]=function(){var n=this.__wrapped__,a=r?[1]:arguments,u=n instanceof Tn,s=a[0],l=u||tf(n),c=function(t){var n=i.apply(En,h([t],a));return r&&f?n[0]:n};l&&e&&"function"==typeof s&&1!=s.length&&(u=l=!1);var f=this.__chain__,p=!!this.__actions__.length,d=o&&!f,v=u&&!p;if(!o&&l){n=v?n:new Tn(this);var g=t.apply(n,a);return g.__actions__.push({func:Ko,args:[c],thisArg:W}),new On(g,f)}return d&&v?t.apply(this,a):(g=this.thru(c),d?r?g.value()[0]:g.value():g)})}),o(["pop","push","shift","sort","splice","unshift"],function(t){var n=cl[t],e=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);En.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return n.apply(tf(i)?i:[],t)}return this[e](function(e){return n.apply(tf(e)?e:[],t)})}}),Fe(Tn.prototype,function(t,n){var e=En[n];if(e){var r=e.name+"",i=Ql[r]||(Ql[r]=[]);i.push({name:n,func:e})}}),Ql[li(W,K).name]=[{name:"wrapper",func:W}],Tn.prototype.clone=Ln,Tn.prototype.reverse=Nn,Tn.prototype.value=jn,En.prototype.at=Rc,En.prototype.chain=Qo,En.prototype.commit=ta,En.prototype.next=na,En.prototype.plant=ra,En.prototype.reverse=ia,En.prototype.toJSON=En.prototype.valueOf=En.prototype.value=oa,kl&&(En.prototype[kl]=ea),En}var W,H="4.11.2",Y=200,G="Expected a function",Z="__lodash_hash_undefined__",X="__lodash_placeholder__",J=1,K=2,Q=4,tt=8,nt=16,et=32,rt=64,it=128,ot=256,at=512,ut=1,st=2,lt=30,ct="...",ft=150,ht=16,pt=1,dt=2,vt=3,gt=1/0,mt=9007199254740991,yt=1.7976931348623157e308,$t=NaN,bt=4294967295,xt=bt-1,wt=bt>>>1,Ct="[object Arguments]",St="[object Array]",Mt="[object Boolean]",_t="[object Date]",kt="[object Error]",At="[object Function]",Et="[object GeneratorFunction]",Pt="[object Map]",Ot="[object Number]",Tt="[object Object]",Lt="[object Promise]",Nt="[object RegExp]",jt="[object Set]",Rt="[object String]",Dt="[object Symbol]",Ft="[object WeakMap]",It="[object WeakSet]",Vt="[object ArrayBuffer]",qt="[object DataView]",zt="[object Float32Array]",Bt="[object Float64Array]",Ut="[object Int8Array]",Wt="[object Int16Array]",Ht="[object Int32Array]",Yt="[object Uint8Array]",Gt="[object Uint8ClampedArray]",Zt="[object Uint16Array]",Xt="[object Uint32Array]",Jt=/\b__p \+= '';/g,Kt=/\b(__p \+=) '' \+/g,Qt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,tn=/&(?:amp|lt|gt|quot|#39|#96);/g,nn=/[&<>"'`]/g,en=RegExp(tn.source),rn=RegExp(nn.source),on=/<%-([\s\S]+?)%>/g,an=/<%([\s\S]+?)%>/g,un=/<%=([\s\S]+?)%>/g,sn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ln=/^\w*$/,cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,fn=/[\\^$.*+?()[\]{}|]/g,hn=RegExp(fn.source),pn=/^\s+|\s+$/g,dn=/^\s+/,vn=/\s+$/,gn=/[a-zA-Z0-9]+/g,mn=/\\(\\)?/g,yn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,$n=/\w*$/,bn=/^0x/i,xn=/^[-+]0x[0-9a-f]+$/i,wn=/^0b[01]+$/i,Cn=/^\[object .+?Constructor\]$/,Sn=/^0o[0-7]+$/i,Mn=/^(?:0|[1-9]\d*)$/,_n=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,kn=/($^)/,An=/['\n\r\u2028\u2029\\]/g,En="\\ud800-\\udfff",Pn="\\u0300-\\u036f\\ufe20-\\ufe23",On="\\u20d0-\\u20f0",Tn="\\u2700-\\u27bf",Ln="a-z\\xdf-\\xf6\\xf8-\\xff",Nn="\\xac\\xb1\\xd7\\xf7",jn="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Rn="\\u2000-\\u206f",Dn=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Fn="A-Z\\xc0-\\xd6\\xd8-\\xde",In="\\ufe0e\\ufe0f",Vn=Nn+jn+Rn+Dn,qn="['’]",zn="["+En+"]",Bn="["+Vn+"]",Un="["+Pn+On+"]",Wn="\\d+",Hn="["+Tn+"]",Yn="["+Ln+"]",Gn="[^"+En+Vn+Wn+Tn+Ln+Fn+"]",Zn="\\ud83c[\\udffb-\\udfff]",Xn="(?:"+Un+"|"+Zn+")",Jn="[^"+En+"]",Kn="(?:\\ud83c[\\udde6-\\uddff]){2}",Qn="[\\ud800-\\udbff][\\udc00-\\udfff]",te="["+Fn+"]",ne="\\u200d",ee="(?:"+Yn+"|"+Gn+")",re="(?:"+te+"|"+Gn+")",ie="(?:"+qn+"(?:d|ll|m|re|s|t|ve))?",oe="(?:"+qn+"(?:D|LL|M|RE|S|T|VE))?",ae=Xn+"?",ue="["+In+"]?",se="(?:"+ne+"(?:"+[Jn,Kn,Qn].join("|")+")"+ue+ae+")*",le=ue+ae+se,ce="(?:"+[Hn,Kn,Qn].join("|")+")"+le,fe="(?:"+[Jn+Un+"?",Un,Kn,Qn,zn].join("|")+")",he=RegExp(qn,"g"),pe=RegExp(Un,"g"),de=RegExp(Zn+"(?="+Zn+")|"+fe+le,"g"),ve=RegExp([te+"?"+Yn+"+"+ie+"(?="+[Bn,te,"$"].join("|")+")",re+"+"+oe+"(?="+[Bn,te+ee,"$"].join("|")+")",te+"?"+ee+"+"+ie,te+"+"+oe,Wn,ce].join("|"),"g"),ge=RegExp("["+ne+En+Pn+On+In+"]"),me=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ye=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","Reflect","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],$e=-1,be={};be[zt]=be[Bt]=be[Ut]=be[Wt]=be[Ht]=be[Yt]=be[Gt]=be[Zt]=be[Xt]=!0,be[Ct]=be[St]=be[Vt]=be[Mt]=be[qt]=be[_t]=be[kt]=be[At]=be[Pt]=be[Ot]=be[Tt]=be[Nt]=be[jt]=be[Rt]=be[Ft]=!1;var xe={};xe[Ct]=xe[St]=xe[Vt]=xe[qt]=xe[Mt]=xe[_t]=xe[zt]=xe[Bt]=xe[Ut]=xe[Wt]=xe[Ht]=xe[Pt]=xe[Ot]=xe[Tt]=xe[Nt]=xe[jt]=xe[Rt]=xe[Dt]=xe[Yt]=xe[Gt]=xe[Zt]=xe[Xt]=!0,xe[kt]=xe[At]=xe[Ft]=!1;var we={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ce={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},Se={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#96;":"`"},Me={"function":!0,object:!0},_e={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ke=parseFloat,Ae=parseInt,Ee=Me[typeof exports]&&exports&&!exports.nodeType?exports:W,Pe=Me[typeof module]&&module&&!module.nodeType?module:W,Oe=Pe&&Pe.exports===Ee?Ee:W,Te=P(Ee&&Pe&&"object"==typeof global&&global),Le=P(Me[typeof self]&&self),Ne=P(Me[typeof window]&&window),je=P(Me[typeof this]&&this),Re=Te||Ne!==(je&&je.window)&&Ne||Le||je||Function("return this")(),De=U();(Ne||Le||{})._=De,"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return De}):Ee&&Pe?(Oe&&((Pe.exports=De)._=De),Ee._=De):Re._=De}.call(this),function(){"use strict";var t=this,n=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var n=function(t,n){return t["offset"+n]?t["offset"+n]:document.defaultView.getComputedStyle(t).getPropertyValue(n)};this.width=n(t.canvas,"Width")||t.canvas.width,this.height=n(t.canvas,"Height")||t.canvas.height;return this.aspectRatio=this.width/this.height,r.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipTitleTemplate:"<%= label%>",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= datasetLabel %>: <%= value %>",multiTooltipKeyBackground:"#fff",segmentColorDefault:["#A6CEE3","#1F78B4","#B2DF8A","#33A02C","#FB9A99","#E31A1C","#FDBF6F","#FF7F00","#CAB2D6","#6A3D9A","#B4B482","#B15928"],segmentHighlightColorDefaults:["#CEF6FF","#47A0DC","#DAFFB2","#5BC854","#FFC2C1","#FF4244","#FFE797","#FFA728","#F2DAFE","#9265C2","#DCDCAA","#D98150"],onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var r=e.helpers={},i=r.each=function(t,n,e){var r=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var i;for(i=0;i<t.length;i++)n.apply(e,[t[i],i].concat(r))}else for(var o in t)n.apply(e,[t[o],o].concat(r))},o=r.clone=function(t){var n={};return i(t,function(e,r){t.hasOwnProperty(r)&&(n[r]=e)}),n},a=r.extend=function(t){return i(Array.prototype.slice.call(arguments,1),function(n){i(n,function(e,r){n.hasOwnProperty(r)&&(t[r]=e)})}),t},u=r.merge=function(t,n){var e=Array.prototype.slice.call(arguments,0);return e.unshift({}),a.apply(null,e)},s=r.indexOf=function(t,n){if(Array.prototype.indexOf)return t.indexOf(n);for(var e=0;e<t.length;e++)if(t[e]===n)return e;return-1},l=(r.where=function(t,n){var e=[];return r.each(t,function(t){n(t)&&e.push(t)}),e},r.findNextWhere=function(t,n,e){e||(e=-1);for(var r=e+1;r<t.length;r++){var i=t[r];if(n(i))return i}},r.findPreviousWhere=function(t,n,e){e||(e=t.length);for(var r=e-1;r>=0;r--){var i=t[r];if(n(i))return i}},r.inherits=function(t){var n=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return n.apply(this,arguments)},r=function(){this.constructor=e};return r.prototype=n.prototype,e.prototype=new r,e.extend=l,t&&a(e.prototype,t),e.__super__=n.prototype,e}),c=r.noop=function(){},f=r.uid=function(){var t=0;return function(){return"chart-"+t++}}(),h=r.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=r.amd="function"==typeof define&&define.amd,d=r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},v=r.max=function(t){return Math.max.apply(Math,t)},g=r.min=function(t){return Math.min.apply(Math,t)},m=(r.cap=function(t,n,e){if(d(n)){if(t>n)return n}else if(d(e)&&t<e)return e;return t},r.getDecimalPlaces=function(t){if(t%1!==0&&d(t)){var n=t.toString();if(n.indexOf("e-")<0)return n.split(".")[1].length;if(n.indexOf(".")<0)return parseInt(n.split("e-")[1]);var e=n.split(".")[1].split("e-");return e[0].length+parseInt(e[1])}return 0}),y=r.radians=function(t){return t*(Math.PI/180)},$=(r.getAngleFromPoint=function(t,n){var e=n.x-t.x,r=n.y-t.y,i=Math.sqrt(e*e+r*r),o=2*Math.PI+Math.atan2(r,e);return e<0&&r<0&&(o+=2*Math.PI),{angle:o,distance:i}},r.aliasPixel=function(t){return t%2===0?0:.5}),b=(r.splineCurve=function(t,n,e,r){var i=Math.sqrt(Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2)),a=r*i/(i+o),u=r*o/(i+o);return{inner:{x:n.x-a*(e.x-t.x),y:n.y-a*(e.y-t.y)},outer:{x:n.x+u*(e.x-t.x),y:n.y+u*(e.y-t.y)}}},r.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),x=(r.calculateScaleRange=function(t,n,e,r,o){var a=2,u=Math.floor(n/(1.5*e)),s=a>=u,l=[];i(t,function(t){null==t||l.push(t)});var c=g(l),f=v(l);f===c&&(f+=.5,c>=.5&&!r?c-=.5:f+=.5);for(var h=Math.abs(f-c),p=b(h),d=Math.ceil(f/(1*Math.pow(10,p)))*Math.pow(10,p),m=r?0:Math.floor(c/(1*Math.pow(10,p)))*Math.pow(10,p),y=d-m,$=Math.pow(10,p),x=Math.round(y/$);(x>u||2*x<u)&&!s;)if(x>u)$*=2,x=Math.round(y/$),x%1!==0&&(s=!0);else if(o&&p>=0){if($/2%1!==0)break;$/=2,x=Math.round(y/$)}else $/=2,x=Math.round(y/$);return s&&(x=a,$=y/x),{steps:x,stepValue:$,min:m,max:m+x*$}},r.template=function(t,n){function e(t,n){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):r[t]=r[t];return n?e(n):e}if(t instanceof Function)return t(n);var r={};return e(t,n)}),w=(r.generateLabels=function(t,n,e,r){var o=new Array(n);return t&&i(o,function(n,i){o[i]=x(t,{value:e+r*(i+1)})}),o},r.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),-(r*Math.pow(2,10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)))},easeOutElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),r*Math.pow(2,-10*t)*Math.sin((1*t-n)*(2*Math.PI)/e)+1)},easeInOutElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:2==(t/=.5)?1:(e||(e=1*(.3*1.5)),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),t<1?-.5*(r*Math.pow(2,10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)):r*Math.pow(2,-10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)*.5+1)},easeInBack:function(t){var n=1.70158;return 1*(t/=1)*t*((n+1)*t-n)},easeOutBack:function(t){var n=1.70158;return 1*((t=t/1-1)*t*((n+1)*t+n)+1)},easeInOutBack:function(t){var n=1.70158;return(t/=.5)<1?.5*(t*t*(((n*=1.525)+1)*t-n)):.5*((t-=2)*t*(((n*=1.525)+1)*t+n)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):t<2/2.75?1*(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return t<.5?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),C=r.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),S=(r.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),r.animationLoop=function(t,n,e,r,i,o){var a=0,u=w[e]||w.linear,s=function(){a++;var e=a/n,l=u(e);t.call(o,l,e,a),r.call(o,l,e),a<n?o.animationFrame=C(s):i.apply(o)};C(s)},r.getRelativePosition=function(t){var n,e,r=t.originalEvent||t,i=t.currentTarget||t.srcElement,o=i.getBoundingClientRect();return r.touches?(n=r.touches[0].clientX-o.left,e=r.touches[0].clientY-o.top):(n=r.clientX-o.left,e=r.clientY-o.top),{x:n,y:e}},r.addEvent=function(t,n,e){t.addEventListener?t.addEventListener(n,e):t.attachEvent?t.attachEvent("on"+n,e):t["on"+n]=e}),M=r.removeEvent=function(t,n,e){t.removeEventListener?t.removeEventListener(n,e,!1):t.detachEvent?t.detachEvent("on"+n,e):t["on"+n]=c},_=(r.bindEvents=function(t,n,e){t.events||(t.events={}),i(n,function(n){t.events[n]=function(){e.apply(t,arguments)},S(t.chart.canvas,n,t.events[n])})},r.unbindEvents=function(t,n){i(n,function(n,e){M(t.chart.canvas,e,n)})}),k=r.getMaximumWidth=function(t){var n=t.parentNode,e=parseInt(E(n,"padding-left"))+parseInt(E(n,"padding-right"));return n?n.clientWidth-e:0},A=r.getMaximumHeight=function(t){var n=t.parentNode,e=parseInt(E(n,"padding-bottom"))+parseInt(E(n,"padding-top"));return n?n.clientHeight-e:0},E=r.getStyle=function(t,n){return t.currentStyle?t.currentStyle[n]:document.defaultView.getComputedStyle(t,null).getPropertyValue(n)},P=(r.getMaximumSize=r.getMaximumWidth,r.retinaScale=function(t){var n=t.ctx,e=t.canvas.width,r=t.canvas.height;window.devicePixelRatio&&(n.canvas.style.width=e+"px",n.canvas.style.height=r+"px",n.canvas.height=r*window.devicePixelRatio,n.canvas.width=e*window.devicePixelRatio,n.scale(window.devicePixelRatio,window.devicePixelRatio))}),O=r.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},T=r.fontString=function(t,n,e){return n+" "+t+"px "+e},L=r.longestText=function(t,n,e){t.font=n;var r=0;return i(e,function(n){var e=t.measureText(n).width;r=e>r?e:r}),r},N=r.drawRoundedRectangle=function(t,n,e,r,i,o){t.beginPath(),t.moveTo(n+o,e),t.lineTo(n+r-o,e),t.quadraticCurveTo(n+r,e,n+r,e+o),t.lineTo(n+r,e+i-o),t.quadraticCurveTo(n+r,e+i,n+r-o,e+i),t.lineTo(n+o,e+i),t.quadraticCurveTo(n,e+i,n,e+i-o),t.lineTo(n,e+o),t.quadraticCurveTo(n,e,n+o,e),t.closePath()};e.instances={},e.Type=function(t,n,r){this.options=n,this.chart=r,this.id=f(),e.instances[this.id]=this,n.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return O(this.chart),this},stop:function(){return e.animationService.cancelAnimation(this),this},resize:function(t){this.stop();var n=this.chart.canvas,e=k(this.chart.canvas),r=this.options.maintainAspectRatio?e/this.chart.aspectRatio:A(this.chart.canvas);return n.width=this.chart.width=e,n.height=this.chart.height=r,P(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){if(t&&this.reflow(),this.options.animation&&!t){var n=new e.Animation;n.numSteps=this.options.animationSteps,n.easing=this.options.animationEasing,n.render=function(t,n){var e=r.easingEffects[n.easing],i=n.currentStep/n.numSteps,o=e(i);t.draw(o,i,n.currentStep)},n.onAnimationProgress=this.options.onAnimationProgress,n.onAnimationComplete=this.options.onAnimationComplete,e.animationService.addAnimation(this,n)}else this.draw(),this.options.onAnimationComplete.call(this);return this},generateLegend:function(){return r.template(this.options.legendTemplate,this)},destroy:function(){this.stop(),this.clear(),_(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,n){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var n=!1;return t.length!==this.activeElements.length?n=!0:(i(t,function(t,e){t!==this.activeElements[e]&&(n=!0)},this),n)}.call(this,t);if(o||n){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,u,l=this.datasets.length-1;l>=0&&(a=this.datasets[l].points||this.datasets[l].bars||this.datasets[l].segments,u=s(a,t[0]),u===-1);l--);var c=[],f=[],h=function(t){var n,e,i,o,a,s=[],l=[],h=[];return r.each(this.datasets,function(t){n=t.points||t.bars||t.segments,n[u]&&n[u].hasValue()&&s.push(n[u])}),r.each(s,function(t){l.push(t.x),h.push(t.y),c.push(r.template(this.options.multiTooltipTemplate,t)),f.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),a=g(h),i=v(h),o=g(l),e=v(l),{x:o>this.chart.width/2?o:e,y:(a+i)/2}}.call(this,u);new e.MultiTooltip({x:h.x,y:h.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:f,legendColorBackground:this.options.multiTooltipKeyBackground,title:x(this.options.tooltipTitleTemplate,t[0]),chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else i(t,function(t){var n=t.tooltipPosition();new e.Tooltip({x:Math.round(n.x),y:Math.round(n.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:x(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var n=this,r=function(){return n.apply(this,arguments)};if(r.prototype=o(n.prototype),a(r.prototype,t),r.extend=e.Type.extend,t.name||n.prototype.name){var i=t.name||n.prototype.name,s=e.defaults[n.prototype.name]?o(e.defaults[n.prototype.name]):{};e.defaults[i]=a(s,t.defaults),e.types[i]=r,e.prototype[i]=function(t,n){var o=u(e.defaults.global,e.defaults[i],n||{});return new r(t,o,this)}}else h("Name not provided for this chart, so it hasn't been registered");return n},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?i(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return i(t,function(t,n){this._saved[n]=this[n],this[n]=t},this),this},transition:function(t,n){return i(t,function(t,e){this[e]=(t-this._saved[e])*n+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return d(this.value)}}),e.Element.extend=l,e.Point=e.Element.extend({display:!0,inRange:function(t,n){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(n-this.y,2)<Math.pow(e,2)},draw:function(){if(this.display){var t=this.ctx;t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.closePath(),t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.fillStyle=this.fillColor,t.fill(),t.stroke()}}}),e.Arc=e.Element.extend({inRange:function(t,n){var e=r.getAngleFromPoint(this,{x:t,y:n}),i=e.angle%(2*Math.PI),o=(2*Math.PI+this.startAngle)%(2*Math.PI),a=(2*Math.PI+this.endAngle)%(2*Math.PI)||360,u=a<o?i<=a||i>=o:i>=o&&i<=a,s=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return u&&s},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,n=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*n,y:this.y+Math.sin(t)*n}},draw:function(t){var n=this.ctx;n.beginPath(),n.arc(this.x,this.y,this.outerRadius<0?0:this.outerRadius,this.startAngle,this.endAngle),n.arc(this.x,this.y,this.innerRadius<0?0:this.innerRadius,this.endAngle,this.startAngle,!0),n.closePath(),n.strokeStyle=this.strokeColor,n.lineWidth=this.strokeWidth,n.fillStyle=this.fillColor,n.fill(),n.lineJoin="bevel",this.showStroke&&n.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,n=this.width/2,e=this.x-n,r=this.x+n,i=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,r-=o,i+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,i),t.lineTo(r,i),t.lineTo(r,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,n){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&n>=this.y&&n<=this.base}}),e.Animation=e.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var n=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,r=this.fontSize+2*this.yPadding,i=r+this.caretHeight+n;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-i<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-i;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-n),t.lineTo(this.x+this.caretHeight,this.y-(n+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(n+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+n+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+n),t.lineTo(this.x+this.caretHeight,this.y+n+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+n+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}N(t,o,a,e,r,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+r/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=T(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.titleHeight=this.title?1.5*this.titleFontSize:0,this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+this.titleHeight,
-this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,n=L(this.ctx,this.font,this.labels)+this.fontSize+3,e=v([n,t]);this.width=e+2*this.xPadding;var r=this.height/2;this.y-r<0?this.y=r:this.y+r>this.chart.height&&(this.y=this.chart.height-r),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var n=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?n+this.titleHeight/3:n+(1.5*this.fontSize*e+this.fontSize/2)+this.titleHeight},draw:function(){if(this.custom)this.custom(this);else{N(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,r.each(this.labels,function(n,e){t.fillStyle=this.textColor,t.fillText(n,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=m(this.stepValue),n=0;n<=this.steps;n++)this.yLabels.push(x(this.templateString,{value:(this.min+n*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?L(this.ctx,this.font,this.yLabels)+10:0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,n=this.endPoint,e=this.endPoint-this.startPoint;for(this.calculateYRange(e),this.buildYLabels(),this.calculateXLabelRotation();e>this.endPoint-this.startPoint;)e=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(e),this.buildYLabels(),t<this.yLabelWidth&&(this.endPoint=n,this.calculateXLabelRotation())},calculateXLabelRotation:function(){this.ctx.font=this.font;var t,n,e=this.ctx.measureText(this.xLabels[0]).width,r=this.ctx.measureText(this.xLabels[this.xLabels.length-1]).width;if(this.xScalePaddingRight=r/2+3,this.xScalePaddingLeft=e/2>this.yLabelWidth?e/2:this.yLabelWidth,this.xLabelRotation=0,this.display){var i,o=L(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)i=Math.cos(y(this.xLabelRotation)),t=i*e,n=i*r,t+this.fontSize/2>this.yLabelWidth&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=i*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(y(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var n=this.drawingArea()/(this.min-this.max);return this.endPoint-n*(t-this.min)},calculateX:function(t){var n=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=n/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),r=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(r+=e/2),Math.round(r)},update:function(t){r.extend(this,t),this.fit()},draw:function(){var t=this.ctx,n=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,i(this.yLabels,function(i,o){var a=this.endPoint-n*o,u=Math.round(a),s=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(i,e-10,a),0!==o||s||(s=!0),s&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),u+=r.aliasPixel(t.lineWidth),s&&(t.moveTo(e,u),t.lineTo(this.width,u),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,u),t.lineTo(e,u),t.stroke(),t.closePath()},this),i(this.xLabels,function(n,e){var r=this.calculateX(e)+$(this.lineWidth),i=this.calculateX(e-(this.offsetGridLines?.5:0))+$(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(i,this.endPoint),t.lineTo(i,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(i,this.endPoint),t.lineTo(i,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(r,o?this.endPoint+12:this.endPoint+8),t.rotate(y(this.xLabelRotation)*-1),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(n,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=g([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var n=this.drawingArea/(this.max-this.min);return(t-this.min)*n},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=m(this.stepValue),n=0;n<=this.steps;n++)this.yLabels.push(x(this.templateString,{value:(this.min+n*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,n,e,r,i,o,a,u,s,l,c,f,h=g([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,v=0;for(this.ctx.font=T(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),n=0;n<this.valuesCount;n++)t=this.getPointPosition(n,h),e=this.ctx.measureText(x(this.templateString,{value:this.labels[n]})).width+5,0===n||n===this.valuesCount/2?(r=e/2,t.x+r>p&&(p=t.x+r,i=n),t.x-r<v&&(v=t.x-r,a=n)):n<this.valuesCount/2?t.x+e>p&&(p=t.x+e,i=n):n>this.valuesCount/2&&t.x-e<v&&(v=t.x-e,a=n);s=v,l=Math.ceil(p-this.width),o=this.getIndexAngle(i),u=this.getIndexAngle(a),c=l/Math.sin(o+Math.PI/2),f=s/Math.sin(u+Math.PI/2),c=d(c)?c:0,f=d(f)?f:0,this.drawingArea=h-(f+c)/2,this.setCenterPoint(f,c)},setCenterPoint:function(t,n){var e=this.width-n-this.drawingArea,r=t+this.drawingArea;this.xCenter=(r+e)/2,this.yCenter=this.height/2},getIndexAngle:function(t){var n=2*Math.PI/this.valuesCount;return t*n-Math.PI/2},getPointPosition:function(t,n){var e=this.getIndexAngle(t);return{x:Math.cos(e)*n+this.xCenter,y:Math.sin(e)*n+this.yCenter}},draw:function(){if(this.display){var t=this.ctx;if(i(this.yLabels,function(n,e){if(e>0){var r,i=e*(this.drawingArea/this.steps),o=this.yCenter-i;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,i,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a<this.valuesCount;a++)r=this.getPointPosition(a,this.calculateCenterOffset(this.min+e*this.stepValue)),0===a?t.moveTo(r.x,r.y):t.lineTo(r.x,r.y);t.closePath(),t.stroke()}if(this.showLabels){if(t.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.showLabelBackdrop){var u=t.measureText(n).width;t.fillStyle=this.backdropColor,t.fillRect(this.xCenter-u/2-this.backdropPaddingX,o-this.fontSize/2-this.backdropPaddingY,u+2*this.backdropPaddingX,this.fontSize+2*this.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.fontColor,t.fillText(n,this.xCenter,o)}}},this),!this.lineArc){t.lineWidth=this.angleLineWidth,t.strokeStyle=this.angleLineColor;for(var n=this.valuesCount-1;n>=0;n--){var e=null,r=null;if(this.angleLineWidth>0&&n%this.angleLineInterval===0&&(e=this.calculateCenterOffset(this.max),r=this.getPointPosition(n,e),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke(),t.closePath()),this.backgroundColors&&this.backgroundColors.length==this.valuesCount){null==e&&(e=this.calculateCenterOffset(this.max)),null==r&&(r=this.getPointPosition(n,e));var o=this.getPointPosition(0===n?this.valuesCount-1:n-1,e),a=this.getPointPosition(n===this.valuesCount-1?0:n+1,e),u={x:(o.x+r.x)/2,y:(o.y+r.y)/2},s={x:(r.x+a.x)/2,y:(r.y+a.y)/2};t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(u.x,u.y),t.lineTo(r.x,r.y),t.lineTo(s.x,s.y),t.fillStyle=this.backgroundColors[n],t.fill(),t.closePath()}var l=this.getPointPosition(n,this.calculateCenterOffset(this.max)+5);t.font=T(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var c=this.labels.length,f=this.labels.length/2,h=f/2,p=n<h||n>c-h,d=n===h||n===c-h;0===n?t.textAlign="center":n===f?t.textAlign="center":n<f?t.textAlign="left":t.textAlign="right",d?t.textBaseline="middle":p?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.labels[n],l.x,l.y)}}}}}),e.animationService={frameDuration:17,animations:[],dropFrames:0,addAnimation:function(t,n){for(var e=0;e<this.animations.length;++e)if(this.animations[e].chartInstance===t)return void(this.animations[e].animationObject=n);this.animations.push({chartInstance:t,animationObject:n}),1==this.animations.length&&r.requestAnimFrame.call(window,this.digestWrapper)},cancelAnimation:function(t){var n=r.findNextWhere(this.animations,function(n){return n.chartInstance===t});n&&this.animations.splice(n,1)},digestWrapper:function(){e.animationService.startDigest.call(e.animationService)},startDigest:function(){var t=Date.now(),n=0;this.dropFrames>1&&(n=Math.floor(this.dropFrames),this.dropFrames-=n);for(var e=0;e<this.animations.length;e++)null===this.animations[e].animationObject.currentStep&&(this.animations[e].animationObject.currentStep=0),this.animations[e].animationObject.currentStep+=1+n,this.animations[e].animationObject.currentStep>this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.currentStep=this.animations[e].animationObject.numSteps),this.animations[e].animationObject.render(this.animations[e].chartInstance,this.animations[e].animationObject),this.animations[e].animationObject.currentStep==this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.onAnimationComplete.call(this.animations[e].chartInstance),this.animations.splice(e,1),e--);var i=Date.now(),o=i-t-this.frameDuration,a=o/this.frameDuration;a>1&&(this.dropFrames+=a),this.animations.length>0&&r.requestAnimFrame.call(window,this.digestWrapper)}},r.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){i(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define("Chart",[],function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=n,e}}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"Bar",defaults:r,initialize:function(t){var r=this.options;this.ScaleClass=n.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,n,e){var i=this.calculateBaseWidth(),o=this.calculateX(e)-i/2,a=this.calculateBarWidth(t);return o+a*n+n*r.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*r.barValueSpacing},calculateBarWidth:function(t){var n=this.calculateBaseWidth()-(t-1)*r.barDatasetSpacing;return n/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t&&(t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke)}),this.showTooltip(n)}),this.BarClass=n.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(n,r){var i={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,bars:[]};this.datasets.push(i),e.each(n.data,function(e,r){i.bars.push(new this.BarClass({value:e,label:t.labels[r],datasetLabel:n.label,strokeColor:"object"==typeof n.strokeColor?n.strokeColor[r]:n.strokeColor,fillColor:"object"==typeof n.fillColor?n.fillColor[r]:n.fillColor,highlightFill:n.highlightFill?"object"==typeof n.highlightFill?n.highlightFill[r]:n.highlightFill:"object"==typeof n.fillColor?n.fillColor[r]:n.fillColor,highlightStroke:n.highlightStroke?"object"==typeof n.highlightStroke?n.highlightStroke[r]:n.highlightStroke:"object"==typeof n.strokeColor?n.strokeColor[r]:n.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,n,r){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,r,n),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(n,r){e.each(n.bars,t,this,r)},this)},getBarsAtEvent:function(t){for(var n,r=[],i=e.getRelativePosition(t),o=function(t){r.push(t.bars[n])},a=0;a<this.datasets.length;a++)for(n=0;n<this.datasets[a].bars.length;n++)if(this.datasets[a].bars[n].inRange(i.x,i.y))return e.each(this.datasets,o),r;return r},buildScale:function(t){var n=this,r=function(){var t=[];return n.eachBars(function(n){t.push(n.value)}),t},i={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var n=e.calculateScaleRange(r(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,n)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.barShowStroke?this.options.barStrokeWidth:0,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(i,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new this.ScaleClass(i)},addData:function(t,n){e.each(t,function(t,e){this.datasets[e].bars.push(new this.BarClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:this.scale.calculateBarX(this.datasets.length,e,this.scale.valuesCount+1),y:this.scale.endPoint,width:this.scale.calculateBarWidth(this.datasets.length),base:this.scale.endPoint,strokeColor:this.datasets[e].strokeColor,fillColor:this.datasets[e].fillColor}))},this),this.scale.addXLabel(n),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.bars.shift()},this),this.update()},reflow:function(){e.extend(this.BarClass.prototype,{y:this.scale.endPoint,base:this.scale.endPoint});var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var n=t||1;this.clear();this.chart.ctx;this.scale.draw(n),e.each(this.datasets,function(t,r){e.each(t.bars,function(t,e){t.hasValue()&&(t.base=this.scale.endPoint,t.transition({x:this.scale.calculateBarX(this.datasets.length,r,e),y:this.scale.calculateY(t.value),width:this.scale.calculateBarWidth(this.datasets.length)},n).draw())},this)},this)}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=segments[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"Doughnut",defaults:r,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=n.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(n,function(t){t.fillColor=t.highlightColor}),this.showTooltip(n)}),this.calculateTotal(t),e.each(t,function(n,e){n.color||(n.color="hsl("+360*e/t.length+", 100%, 50%)"),this.addData(n,e,!0)},this),this.render()},getSegmentsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(r.x,r.y)&&n.push(t)},this),n},addData:function(t,e,r){var i=void 0!==e?e:this.segments.length;"undefined"==typeof t.color&&(t.color=n.defaults.global.segmentColorDefault[i%n.defaults.global.segmentColorDefault.length],t.highlight=n.defaults.global.segmentHighlightColorDefaults[i%n.defaults.global.segmentHighlightColorDefaults.length]),this.segments.splice(i,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),r||(this.reflow(),this.update())},calculateCircumference:function(t){return this.total>0?2*Math.PI*(t/this.total):0},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var n=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(n,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var n=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},n),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle)},this)}}),n.types.Doughnut.extend({name:"Pie",defaults:e.merge(r,{percentageInnerCutout:0})})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,bezierCurve:!0,bezierCurveTension:.4,pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].strokeColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>',offsetGridLines:!1};n.Type.extend({name:"Line",defaults:r,initialize:function(t){this.PointClass=n.Point.extend({offsetGridLines:this.options.offsetGridLines,strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)<Math.pow(this.radius+this.hitDetectionRadius,2)}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(n)}),e.each(t.datasets,function(n){var r={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,pointColor:n.pointColor,pointStrokeColor:n.pointStrokeColor,points:[]};this.datasets.push(r),e.each(n.data,function(e,i){r.points.push(new this.PointClass({value:e,label:t.labels[i],datasetLabel:n.label,strokeColor:n.pointStrokeColor,fillColor:n.pointColor,highlightFill:n.pointHighlightFill||n.pointColor,highlightStroke:n.pointHighlightStroke||n.pointStrokeColor}))},this),this.buildScale(t.labels),this.eachPoints(function(t,n){e.extend(t,{x:this.scale.calculateX(n),y:this.scale.endPoint}),t.save()},this)},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachPoints(function(t){t.save()}),this.render()},eachPoints:function(t){e.each(this.datasets,function(n){e.each(n.points,t,this)},this)},getPointsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.datasets,function(t){e.each(t.points,function(t){t.inRange(r.x,r.y)&&n.push(t)})},this),n},buildScale:function(t){var r=this,i=function(){var t=[];return r.eachPoints(function(n){t.push(n.value)}),t},o={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,offsetGridLines:this.options.offsetGridLines,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var n=e.calculateScaleRange(i(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,n)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.pointDotRadius+this.options.pointDotStrokeWidth,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(o,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new n.Scale(o)},addData:function(t,n){e.each(t,function(t,e){this.datasets[e].points.push(new this.PointClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:this.scale.calculateX(this.scale.valuesCount+1),y:this.scale.endPoint,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.addXLabel(n),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.points.shift()},this),this.update()},reflow:function(){var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var n=t||1;this.clear();var r=this.chart.ctx,i=function(t){return null!==t.value},o=function(t,n,r){return e.findNextWhere(n,i,r)||t},a=function(t,n,r){return e.findPreviousWhere(n,i,r)||t};this.scale&&(this.scale.draw(n),e.each(this.datasets,function(t){var u=e.where(t.points,i);e.each(t.points,function(t,e){t.hasValue()&&t.transition({y:this.scale.calculateY(t.value),x:this.scale.calculateX(e)},n)},this),this.options.bezierCurve&&e.each(u,function(t,n){var r=n>0&&n<u.length-1?this.options.bezierCurveTension:0;t.controlPoints=e.splineCurve(a(t,u,n),t,o(t,u,n),r),t.controlPoints.outer.y>this.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.y<this.scale.startPoint&&(t.controlPoints.outer.y=this.scale.startPoint),t.controlPoints.inner.y>this.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y<this.scale.startPoint&&(t.controlPoints.inner.y=this.scale.startPoint)},this),r.lineWidth=this.options.datasetStrokeWidth,r.strokeStyle=t.strokeColor,r.beginPath(),e.each(u,function(t,n){if(0===n)r.moveTo(t.x,t.y);else if(this.options.bezierCurve){var e=a(t,u,n);r.bezierCurveTo(e.controlPoints.outer.x,e.controlPoints.outer.y,t.controlPoints.inner.x,t.controlPoints.inner.y,t.x,t.y)}else r.lineTo(t.x,t.y)},this),this.options.datasetStroke&&r.stroke(),this.options.datasetFill&&u.length>0&&(r.lineTo(u[u.length-1].x,this.scale.endPoint),r.lineTo(u[0].x,this.scale.endPoint),r.fillStyle=t.fillColor,r.closePath(),r.fill()),e.each(u,function(t){t.draw()})},this))}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=segments[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"PolarArea",defaults:r,initialize:function(t){this.segments=[],this.SegmentArc=n.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new n.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,n){this.addData(t,n,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(n,function(t){t.fillColor=t.highlightColor}),this.showTooltip(n)}),this.render()},getSegmentsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(r.x,r.y)&&n.push(t)},this),n},addData:function(t,n,e){var r=n||this.segments.length;this.segments.splice(r,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var n=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(n,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var n=[];e.each(t,function(t){n.push(t.value)});var r=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(n,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,r,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var n=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},n),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle),t.draw()},this),this.scale.draw()}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers;n.Type.extend({name:"Radar",defaults:{scaleShowLine:!0,angleShowLineOut:!0,scaleShowLabels:!1,scaleBeginAtZero:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,angleLineInterval:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:10,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].strokeColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>'
-},initialize:function(t){this.PointClass=n.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(n)}),e.each(t.datasets,function(n){var r={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,pointColor:n.pointColor,pointStrokeColor:n.pointStrokeColor,points:[]};this.datasets.push(r),e.each(n.data,function(e,i){var o;this.scale.animation||(o=this.scale.getPointPosition(i,this.scale.calculateCenterOffset(e))),r.points.push(new this.PointClass({value:e,label:t.labels[i],datasetLabel:n.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:n.pointStrokeColor,fillColor:n.pointColor,highlightFill:n.pointHighlightFill||n.pointColor,highlightStroke:n.pointHighlightStroke||n.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(n){e.each(n.points,t,this)},this)},getPointsAtEvent:function(t){var n=e.getRelativePosition(t),r=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},n),i=2*Math.PI/this.scale.valuesCount,o=Math.round((r.angle-1.5*Math.PI)/i),a=[];return(o>=this.scale.valuesCount||o<0)&&(o=0),r.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new n.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backgroundColors:this.options.scaleBackgroundColors,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,angleLineInterval:this.options.angleLineInterval?this.options.angleLineInterval:1,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var n=function(){var n=[];return e.each(t,function(t){t.data?n=n.concat(t.data):e.each(t.points,function(t){n.push(t.value)})}),n}(),r=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(n,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,r)},addData:function(t,n){this.scale.valuesCount++,e.each(t,function(t,e){var r=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:r.x,y:r.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(n),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var n=t||1,r=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),n)},this),r.lineWidth=this.options.datasetStrokeWidth,r.strokeStyle=t.strokeColor,r.beginPath(),e.each(t.points,function(t,n){0===n?r.moveTo(t.x,t.y):r.lineTo(t.x,t.y)},this),r.closePath(),r.stroke(),r.fillStyle=t.fillColor,this.options.datasetFill&&r.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this),function(t){"use strict";"object"==typeof exports?module.exports=t("undefined"!=typeof angular?angular:require("angular"),"undefined"!=typeof Chart?Chart:require("chart.js")):"function"==typeof define&&define.amd?define(["angular","chart"],t):t(angular,Chart)}(function(t,n){"use strict";function e(){var e={},r={Chart:n,getOptions:function(n){var r=n&&e[n]||{};return t.extend({},e,r)}};this.setOptions=function(n,r){return r?void(e[n]=t.extend(e[n]||{},r)):(r=n,void(e=t.extend(e,r)))},this.$get=function(){return r}}function r(e,r){function o(t,n){return!!(t&&n&&t.length&&n.length)&&(Array.isArray(t[0])?t.length===n.length&&t.every(function(t,e){return t.length===n[e].length}):n.reduce(a,0)>0&&t.length===n.length)}function a(t,n){return t+n}function u(n,e,r,i){var o=null;return function(a){var u=e.getPointsAtEvent||e.getBarsAtEvent||e.getSegmentsAtEvent;if(u){var s=u.call(e,a);i!==!1&&t.equals(o,s)!==!1||(o=s,n[r](s,a),n.$apply())}}}function s(r,i){for(var o=!1,a=t.copy(i.colours||e.getOptions(r).colours||n.defaults.global.colours);a.length<i.data.length;)a.push(i.getColour()),o=!0;return o&&(i.colours=a),a.map(l)}function l(t){return"object"==typeof t&&null!==t?t:"string"==typeof t&&"#"===t[0]?f(d(t.substr(1))):c()}function c(){var t=[h(0,255),h(0,255),h(0,255)];return f(t)}function f(t){return{fillColor:p(t,.2),strokeColor:p(t,1),pointColor:p(t,1),pointStrokeColor:"#fff",pointHighlightFill:"#fff",pointHighlightStroke:p(t,.8)}}function h(t,n){return Math.floor(Math.random()*(n-t+1))+t}function p(t,n){return i?"rgb("+t.join(",")+")":"rgba("+t.concat(n).join(",")+")"}function d(t){var n=parseInt(t,16),e=n>>16&255,r=n>>8&255,i=255&n;return[e,r,i]}function v(n,e,r,i){return{labels:n,datasets:e.map(function(n,e){return t.extend({},i[e],{label:r[e],data:n})})}}function g(n,e,r){return n.map(function(n,i){return t.extend({},r[i],{label:n,value:e[i],color:r[i].strokeColor,highlight:r[i].pointHighlightStroke})})}function m(t,n){var e=t.parent(),r=e.find("chart-legend"),i="<chart-legend>"+n.generateLegend()+"</chart-legend>";r.length?r.replaceWith(i):e.append(i)}function y(t,n,e,r){Array.isArray(e.data[0])?t.datasets.forEach(function(t,e){(t.points||t.bars).forEach(function(t,r){t.value=n[e][r]})}):t.segments.forEach(function(t,e){t.value=n[e]}),t.update(),e.$emit("update",t),e.legend&&"false"!==e.legend&&m(r,t)}function $(t){return!t||Array.isArray(t)&&!t.length||"object"==typeof t&&!Object.keys(t).length}function b(r,i){var o=t.extend({},n.defaults.global,e.getOptions(r),i.options);return o.responsive}function x(t,n){t&&(t.destroy(),n.$emit("destroy",t))}return function(n){return{restrict:"CA",scope:{data:"=?",labels:"=?",options:"=?",series:"=?",colours:"=?",getColour:"=?",chartType:"=",legend:"@",click:"=?",hover:"=?",chartData:"=?",chartLabels:"=?",chartOptions:"=?",chartSeries:"=?",chartColours:"=?",chartLegend:"@",chartClick:"=?",chartHover:"=?"},link:function(a,l){function f(t,n){a.$watch(t,function(t){"undefined"!=typeof t&&(a[n]=t)})}function h(e,r){if(!$(e)&&!t.equals(e,r)){var i=n||a.chartType;i&&p(i)}}function p(n){if(b(n,a)&&0===l[0].clientHeight&&0===C.clientHeight)return r(function(){p(n)},50,!1);if(a.data&&a.data.length){a.getColour="function"==typeof a.getColour?a.getColour:c;var i=s(n,a),o=l[0],f=o.getContext("2d"),h=Array.isArray(a.data[0])?v(a.labels,a.data,a.series||[],i):g(a.labels,a.data,i),d=t.extend({},e.getOptions(n),a.options);x(w,a),w=new e.Chart(f)[n](h,d),a.$emit("create",w),o.onclick=a.click?u(a,w,"click",!1):t.noop,o.onmousemove=a.hover?u(a,w,"hover",!0):t.noop,a.legend&&"false"!==a.legend&&m(l,w)}}function d(t){if("undefined"!=typeof console&&"test"!==e.getOptions().env){var n="function"==typeof console.warn?console.warn:console.log;a[t]&&n.call(console,'"%s" is deprecated and will be removed in a future version. Please use "chart-%s" instead.',t,t)}}var w,C=document.createElement("div");C.className="chart-container",l.replaceWith(C),C.appendChild(l[0]),i&&window.G_vmlCanvasManager.initElement(l[0]),["data","labels","options","series","colours","legend","click","hover"].forEach(d),f("chartData","data"),f("chartLabels","labels"),f("chartOptions","options"),f("chartSeries","series"),f("chartColours","colours"),f("chartLegend","legend"),f("chartClick","click"),f("chartHover","hover"),a.$watch("data",function(t,e){if(!t||!t.length||Array.isArray(t[0])&&!t[0].length)return void x(w,a);var r=n||a.chartType;if(r)return w&&o(t,e)?y(w,t,a,l):void p(r)},!0),a.$watch("series",h,!0),a.$watch("labels",h,!0),a.$watch("options",h,!0),a.$watch("colours",h,!0),a.$watch("chartType",function(n,e){$(n)||t.equals(n,e)||p(n)}),a.$on("$destroy",function(){x(w,a)})}}}}n.defaults.global.responsive=!0,n.defaults.global.multiTooltipTemplate="<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>",n.defaults.global.colours=["#97BBCD","#DCDCDC","#F7464A","#46BFBD","#FDB45C","#949FB1","#4D5360"];var i="object"==typeof window.G_vmlCanvasManager&&null!==window.G_vmlCanvasManager&&"function"==typeof window.G_vmlCanvasManager.initElement;return i&&(n.defaults.global.animation=!1),t.module("chart.js",[]).provider("ChartJs",e).factory("ChartJsFactory",["ChartJs","$timeout",r]).directive("chartBase",["ChartJsFactory",function(t){return new t}]).directive("chartLine",["ChartJsFactory",function(t){return new t("Line")}]).directive("chartBar",["ChartJsFactory",function(t){return new t("Bar")}]).directive("chartRadar",["ChartJsFactory",function(t){return new t("Radar")}]).directive("chartDoughnut",["ChartJsFactory",function(t){return new t("Doughnut")}]).directive("chartPie",["ChartJsFactory",function(t){return new t("Pie")}]).directive("chartPolarArea",["ChartJsFactory",function(t){return new t("PolarArea")}])}),!function(){function t(t){return t&&(t.ownerDocument||t.document||t).documentElement}function n(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}function e(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}function r(t){return null===t?NaN:+t}function i(t){return!isNaN(t)}function o(t){return{left:function(n,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=n.length);r<i;){var o=r+i>>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=n.length);r<i;){var o=r+i>>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}function a(t){return t.length}function u(t){for(var n=1;t*n%1;)n*=10;return n}function s(t,n){for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}function l(){this._=Object.create(null)}function c(t){return(t+="")===xa||t[0]===wa?wa+t:t}function f(t){return(t+="")[0]===wa?t.slice(1):t}function h(t){return c(t)in this._}function p(t){return(t=c(t))in this._&&delete this._[t]}function d(){var t=[];for(var n in this._)t.push(f(n));return t}function v(){var t=0;for(var n in this._)++t;return t}function g(){for(var t in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(t){return t}function $(t,n,e){return function(){var r=e.apply(n,arguments);return r===n?t:r}}function b(t,n){if(n in t)return n;n=n.charAt(0).toUpperCase()+n.slice(1);for(var e=0,r=Ca.length;e<r;++e){var i=Ca[e]+n;if(i in t)return i}}function x(){}function w(){}function C(t){function n(){for(var n,r=e,i=-1,o=r.length;++i<o;)(n=r[i].on)&&n.apply(this,arguments);return t}var e=[],r=new l;return n.on=function(n,i){var o,a=r.get(n);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,o=e.indexOf(a)).concat(e.slice(o+1)),r.remove(n)),i&&e.push(r.set(n,{on:i})),t)},n}function S(){sa.event.preventDefault()}function M(){for(var t,n=sa.event;t=n.sourceEvent;)n=t;return n}function _(t){for(var n=new w,e=0,r=arguments.length;++e<r;)n[arguments[e]]=C(n);return n.of=function(e,r){return function(i){try{var o=i.sourceEvent=sa.event;i.target=t,sa.event=i,n[i.type].apply(e,r)}finally{sa.event=o}}},n}function k(t){return Ma(t,Ea),t}function A(t){return"function"==typeof t?t:function(){return _a(t,this)}}function E(t){return"function"==typeof t?t:function(){return ka(t,this)}}function P(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function i(){this.setAttribute(t,n)}function o(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function u(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=sa.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?u:a:t.local?o:i}function O(t){return t.trim().replace(/\s+/g," ")}function T(t){return new RegExp("(?:^|\\s+)"+sa.requote(t)+"(?:\\s+|$)","g")}function L(t){return(t+"").trim().split(/^|\s+/)}function N(t,n){function e(){for(var e=-1;++e<i;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);++e<i;)t[e](this,r)}t=L(t).map(j);var i=t.length;return"function"==typeof n?r:e}function j(t){var n=T(t);return function(e,r){if(i=e.classList)return r?i.add(t):i.remove(t);var i=e.getAttribute("class")||"";r?(n.lastIndex=0,n.test(i)||e.setAttribute("class",O(i+" "+t))):e.setAttribute("class",O(i.replace(n," ")))}}function R(t,n,e){function r(){this.style.removeProperty(t)}function i(){this.style.setProperty(t,n,e)}function o(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?o:i}function D(t,n){function e(){delete this[t]}function r(){this[t]=n}function i(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?i:r}function F(t){function n(){var n=this.ownerDocument,e=this.namespaceURI;return e===Pa&&n.documentElement.namespaceURI===Pa?n.createElement(t):n.createElementNS(e,t)}function e(){return this.ownerDocument.createElementNS(t.space,t.local)}return"function"==typeof t?t:(t=sa.ns.qualify(t)).local?e:n}function I(){var t=this.parentNode;t&&t.removeChild(this)}function V(t){return{__data__:t}}function q(t){return function(){return Aa(this,t)}}function z(t){return arguments.length||(t=e),function(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}}function B(t,n){for(var e=0,r=t.length;e<r;e++)for(var i,o=t[e],a=0,u=o.length;a<u;a++)(i=o[a])&&n(i,a,e);return t}function U(t){return Ma(t,Ta),t}function W(t){var n,e;return function(r,i,o){var a,u=t[o].update,s=u.length;for(o!=e&&(e=o,n=0),i>=n&&(n=i+1);!(a=u[n])&&++n<s;);return a}}function H(t,n,e){function r(){var n=this[a];n&&(this.removeEventListener(t,n,n.$),delete this[a])}function i(){var i=s(n,ca(arguments));r.call(this),this.addEventListener(t,this[a]=i,i.$=e),i._=n}function o(){var n,e=new RegExp("^__on([^.]+)"+sa.requote(t)+"$");for(var r in this)if(n=r.match(e)){var i=this[r];this.removeEventListener(n[1],i,i.$),delete this[r]}}var a="__on"+t,u=t.indexOf("."),s=Y;u>0&&(t=t.slice(0,u));var l=La.get(t);return l&&(t=l,s=G),u?n?i:r:n?x:o}function Y(t,n){return function(e){var r=sa.event;sa.event=e,n[0]=this.__data__;try{t.apply(this,n)}finally{sa.event=r}}}function G(t,n){var e=Y(t,n);return function(t){var n=this,r=t.relatedTarget;r&&(r===n||8&r.compareDocumentPosition(n))||e.call(n,t)}}function Z(e){var r=".dragsuppress-"+ ++ja,i="click"+r,o=sa.select(n(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Na&&(Na=!("onselectstart"in e)&&b(e.style,"userSelect")),Na){var a=t(e).style,u=a[Na];a[Na]="none"}return function(t){if(o.on(r,null),Na&&(a[Na]=u),t){var n=function(){o.on(i,null)};o.on(i,function(){S(),n()},!0),setTimeout(n,0)}}}function X(t,e){e.changedTouches&&(e=e.changedTouches[0]);var r=t.ownerSVGElement||t;if(r.createSVGPoint){var i=r.createSVGPoint();if(Ra<0){var o=n(t);if(o.scrollX||o.scrollY){r=sa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(t.getScreenCTM().inverse()),[i.x,i.y]}var u=t.getBoundingClientRect();return[e.clientX-u.left-t.clientLeft,e.clientY-u.top-t.clientTop]}function J(){return sa.event.changedTouches[0].identifier}function K(t){return t>0?1:t<0?-1:0}function Q(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function tt(t){return t>1?0:t<-1?Ia:Math.acos(t)}function nt(t){return t>1?za:t<-1?-za:Math.asin(t)}function et(t){return((t=Math.exp(t))-1/t)/2}function rt(t){return((t=Math.exp(t))+1/t)/2}function it(t){return((t=Math.exp(2*t))-1)/(t+1)}function ot(t){return(t=Math.sin(t/2))*t}function at(){}function ut(t,n,e){return this instanceof ut?(this.h=+t,this.s=+n,void(this.l=+e)):arguments.length<2?t instanceof ut?new ut(t.h,t.s,t.l):xt(""+t,wt,ut):new ut(t,n,e)}function st(t,n,e){function r(t){return t>360?t-=360:t<0&&(t+=360),t<60?o+(a-o)*t/60:t<180?a:t<240?o+(a-o)*(240-t)/60:o}function i(t){return Math.round(255*r(t))}var o,a;return t=isNaN(t)?0:(t%=360)<0?t+360:t,n=isNaN(n)?0:n<0?0:n>1?1:n,e=e<0?0:e>1?1:e,a=e<=.5?e*(1+n):e+n-e*n,o=2*e-a,new mt(i(t+120),i(t),i(t-120))}function lt(t,n,e){return this instanceof lt?(this.h=+t,this.c=+n,void(this.l=+e)):arguments.length<2?t instanceof lt?new lt(t.h,t.c,t.l):t instanceof ft?pt(t.l,t.a,t.b):pt((t=Ct((t=sa.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new lt(t,n,e)}function ct(t,n,e){return isNaN(t)&&(t=0),isNaN(n)&&(n=0),new ft(e,Math.cos(t*=Ba)*n,Math.sin(t)*n)}function ft(t,n,e){return this instanceof ft?(this.l=+t,this.a=+n,void(this.b=+e)):arguments.length<2?t instanceof ft?new ft(t.l,t.a,t.b):t instanceof lt?ct(t.h,t.c,t.l):Ct((t=mt(t)).r,t.g,t.b):new ft(t,n,e)}function ht(t,n,e){var r=(t+16)/116,i=r+n/500,o=r-e/200;return i=dt(i)*tu,r=dt(r)*nu,o=dt(o)*eu,new mt(gt(3.2404542*i-1.5371385*r-.4985314*o),gt(-.969266*i+1.8760108*r+.041556*o),gt(.0556434*i-.2040259*r+1.0572252*o))}function pt(t,n,e){return t>0?new lt(Math.atan2(e,n)*Ua,Math.sqrt(n*n+e*e),t):new lt(NaN,NaN,t)}function dt(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function vt(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function gt(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mt(t,n,e){return this instanceof mt?(this.r=~~t,this.g=~~n,void(this.b=~~e)):arguments.length<2?t instanceof mt?new mt(t.r,t.g,t.b):xt(""+t,mt,st):new mt(t,n,e)}function yt(t){return new mt(t>>16,t>>8&255,255&t)}function $t(t){return yt(t)+""}function bt(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function xt(t,n,e){var r,i,o,a=0,u=0,s=0;if(r=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return n(Mt(i[0]),Mt(i[1]),Mt(i[2]))}return(o=ou.get(t))?n(o.r,o.g,o.b):(null==t||"#"!==t.charAt(0)||isNaN(o=parseInt(t.slice(1),16))||(4===t.length?(a=(3840&o)>>4,a=a>>4|a,u=240&o,u=u>>4|u,s=15&o,s=s<<4|s):7===t.length&&(a=(16711680&o)>>16,u=(65280&o)>>8,s=255&o)),n(a,u,s))}function wt(t,n,e){var r,i,o=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),u=a-o,s=(a+o)/2;return u?(i=s<.5?u/(a+o):u/(2-a-o),r=t==a?(n-e)/u+(n<e?6:0):n==a?(e-t)/u+2:(t-n)/u+4,r*=60):(r=NaN,i=s>0&&s<1?0:r),new ut(r,i,s)}function Ct(t,n,e){t=St(t),n=St(n),e=St(e);var r=vt((.4124564*t+.3575761*n+.1804375*e)/tu),i=vt((.2126729*t+.7151522*n+.072175*e)/nu),o=vt((.0193339*t+.119192*n+.9503041*e)/eu);return ft(116*i-16,500*(r-i),200*(i-o))}function St(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Mt(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function _t(t){return"function"==typeof t?t:function(){return t}}function kt(t){return function(n,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),At(n,e,t,r)}}function At(t,n,e,r){function i(){var t,n=s.status;if(!n&&Pt(s)||n>=200&&n<300||304===n){try{t=e.call(o,s)}catch(r){return void a.error.call(o,r)}a.load.call(o,t)}else a.error.call(o,s)}var o={},a=sa.dispatch("beforesend","progress","load","error"),u={},s=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in s||!/^(http(s)?:)?\/\//.test(t)||(s=new XDomainRequest),"onload"in s?s.onload=s.onerror=i:s.onreadystatechange=function(){s.readyState>3&&i()},s.onprogress=function(t){var n=sa.event;sa.event=t;try{a.progress.call(o,s)}finally{sa.event=n}},o.header=function(t,n){return t=(t+"").toLowerCase(),arguments.length<2?u[t]:(null==n?delete u[t]:u[t]=n+"",o)},o.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",o):n},o.responseType=function(t){return arguments.length?(l=t,o):l},o.response=function(t){return e=t,o},["get","post"].forEach(function(t){o[t]=function(){return o.send.apply(o,[t].concat(ca(arguments)))}}),o.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),s.open(e,t,!0),null==n||"accept"in u||(u.accept=n+",*/*"),s.setRequestHeader)for(var c in u)s.setRequestHeader(c,u[c]);return null!=n&&s.overrideMimeType&&s.overrideMimeType(n),null!=l&&(s.responseType=l),null!=i&&o.on("error",i).on("load",function(t){i(null,t)}),a.beforesend.call(o,s),s.send(null==r?null:r),o},o.abort=function(){return s.abort(),o},sa.rebind(o,a,"on"),null==r?o:o.get(Et(r))}function Et(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function Pt(t){var n=t.responseType;return n&&"text"!==n?t.response:t.responseText}function Ot(t,n,e){var r=arguments.length;r<2&&(n=0),r<3&&(e=Date.now());var i=e+n,o={c:t,t:i,n:null};return uu?uu.n=o:au=o,uu=o,su||(lu=clearTimeout(lu),su=1,cu(Tt)),o}function Tt(){var t=Lt(),n=Nt()-t;n>24?(isFinite(n)&&(clearTimeout(lu),lu=setTimeout(Tt,n)),su=0):(su=1,cu(Tt))}function Lt(){for(var t=Date.now(),n=au;n;)t>=n.t&&n.c(t-n.t)&&(n.c=null),n=n.n;return t}function Nt(){for(var t,n=au,e=1/0;n;)n.c?(n.t<e&&(e=n.t),n=(t=n).n):n=t?t.n=n.n:au=n.n;return uu=t,e}function jt(t,n){return n-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function Rt(t,n){var e=Math.pow(10,3*ba(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function Dt(t){var n=t.decimal,e=t.thousands,r=t.grouping,i=t.currency,o=r&&e?function(t,n){for(var i=t.length,o=[],a=0,u=r[0],s=0;i>0&&u>0&&(s+u+1>n&&(u=Math.max(1,n-s)),o.push(t.substring(i-=u,i+u)),!((s+=u+1)>n));)u=r[a=(a+1)%r.length];return o.reverse().join(e)}:y;return function(t){var e=hu.exec(t),r=e[1]||" ",a=e[2]||">",u=e[3]||"-",s=e[4]||"",l=e[5],c=+e[6],f=e[7],h=e[8],p=e[9],d=1,v="",g="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===a)&&(l=r="0",a="="),p){case"n":f=!0,p="g";break;case"%":d=100,g="%",p="f";break;case"p":d=100,g="%",p="r";break;case"b":case"o":case"x":case"X":"#"===s&&(v="0"+p.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":d=-1,p="r"}"$"===s&&(v=i[0],g=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pu.get(p)||Ft;var $=l&&f;return function(t){var e=g;if(m&&t%1)return"";var i=t<0||0===t&&1/t<0?(t=-t,"-"):"-"===u?"":u;if(d<0){var s=sa.formatPrefix(t,h);t=s.scale(t),e=s.symbol+g}else t*=d;t=p(t,h);var b,x,w=t.lastIndexOf(".");if(w<0){var C=y?t.lastIndexOf("e"):-1;C<0?(b=t,x=""):(b=t.substring(0,C),x=t.substring(C))}else b=t.substring(0,w),x=n+t.substring(w+1);!l&&f&&(b=o(b,1/0));var S=v.length+b.length+x.length+($?0:i.length),M=S<c?new Array(S=c-S+1).join(r):"";return $&&(b=o(M+b,M.length?c-x.length:1/0)),i+=v,t=b+x,("<"===a?i+t+M:">"===a?M+i+t:"^"===a?M.substring(0,S>>=1)+i+t+M.substring(S):i+($?t:M+t))+e}}}function Ft(t){return t+""}function It(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Vt(t,n,e){function r(n){var e=t(n),r=o(e,1);return n-e<r-n?e:r}function i(e){return n(e=t(new vu(e-1)),1),e}function o(t,e){return n(t=new vu((+t)),e),t}function a(t,r,o){var a=i(t),u=[];if(o>1)for(;a<r;)e(a)%o||u.push(new Date((+a))),n(a,1);else for(;a<r;)u.push(new Date((+a))),n(a,1);return u}function u(t,n,e){try{vu=It;var r=new It;return r._=t,a(r,n,e)}finally{vu=Date}}t.floor=t,t.round=r,t.ceil=i,t.offset=o,t.range=a;var s=t.utc=qt(t);return s.floor=s,s.round=qt(r),s.ceil=qt(i),s.offset=qt(o),s.range=u,t}function qt(t){return function(n,e){try{vu=It;var r=new It;return r._=n,t(r,e)._}finally{vu=Date}}}function zt(t){function n(t){function n(n){for(var e,i,o,a=[],u=-1,s=0;++u<r;)37===t.charCodeAt(u)&&(a.push(t.slice(s,u)),null!=(i=mu[e=t.charAt(++u)])&&(e=t.charAt(++u)),(o=A[e])&&(e=o(n,null==i?"e"===e?" ":"0":i)),a.push(e),s=u+1);return a.push(t.slice(s,u)),a.join("")}var r=t.length;return n.parse=function(n){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=e(r,t,n,0);if(i!=n.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var o=null!=r.Z&&vu!==It,a=new(o?It:vu);return"j"in r?a.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),a.setFullYear(r.y,0,1),a.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(a.getDay()+5)%7:r.w+7*r.U-(a.getDay()+6)%7)):a.setFullYear(r.y,r.m,r.d),a.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),o?a._:a},n.toString=function(){return t},n}function e(t,n,e,r){for(var i,o,a,u=0,s=n.length,l=e.length;u<s;){if(r>=l)return-1;if(i=n.charCodeAt(u++),37===i){if(a=n.charAt(u++),o=E[a in mu?n.charAt(u++):a],!o||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(t,n,e){w.lastIndex=0;var r=w.exec(n.slice(e));return r?(t.w=C.get(r[0].toLowerCase()),e+r[0].length):-1}function i(t,n,e){b.lastIndex=0;var r=b.exec(n.slice(e));return r?(t.w=x.get(r[0].toLowerCase()),e+r[0].length):-1}function o(t,n,e){_.lastIndex=0;var r=_.exec(n.slice(e));return r?(t.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(t,n,e){S.lastIndex=0;var r=S.exec(n.slice(e));return r?(t.m=M.get(r[0].toLowerCase()),e+r[0].length):-1}function u(t,n,r){return e(t,A.c.toString(),n,r)}function s(t,n,r){return e(t,A.x.toString(),n,r)}function l(t,n,r){return e(t,A.X.toString(),n,r)}function c(t,n,e){var r=$.get(n.slice(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}var f=t.dateTime,h=t.date,p=t.time,d=t.periods,v=t.days,g=t.shortDays,m=t.months,y=t.shortMonths;n.utc=function(t){function e(t){try{vu=It;var n=new vu;return n._=t,r(n)}finally{vu=Date}}var r=n(t);return e.parse=function(t){try{vu=It;var n=r.parse(t);return n&&n._}finally{vu=Date}},e.toString=r.toString,e},n.multi=n.utc.multi=ln;var $=sa.map(),b=Ut(v),x=Wt(v),w=Ut(g),C=Wt(g),S=Ut(m),M=Wt(m),_=Ut(y),k=Wt(y);d.forEach(function(t,n){$.set(t.toLowerCase(),n)});var A={a:function(t){return g[t.getDay()]},A:function(t){return v[t.getDay()]},b:function(t){return y[t.getMonth()]},B:function(t){return m[t.getMonth()]},c:n(f),d:function(t,n){return Bt(t.getDate(),n,2)},e:function(t,n){return Bt(t.getDate(),n,2)},H:function(t,n){return Bt(t.getHours(),n,2)},I:function(t,n){return Bt(t.getHours()%12||12,n,2)},j:function(t,n){return Bt(1+du.dayOfYear(t),n,3)},L:function(t,n){return Bt(t.getMilliseconds(),n,3)},m:function(t,n){return Bt(t.getMonth()+1,n,2)},M:function(t,n){return Bt(t.getMinutes(),n,2)},p:function(t){return d[+(t.getHours()>=12)]},S:function(t,n){return Bt(t.getSeconds(),n,2)},U:function(t,n){return Bt(du.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return Bt(du.mondayOfYear(t),n,2)},x:n(h),X:n(p),y:function(t,n){return Bt(t.getFullYear()%100,n,2)},Y:function(t,n){return Bt(t.getFullYear()%1e4,n,4)},Z:un,"%":function(){return"%"}},E={a:r,A:i,b:o,B:a,c:u,d:tn,e:tn,H:en,I:en,j:nn,L:an,m:Qt,M:rn,p:c,S:on,U:Yt,w:Ht,W:Gt,x:s,X:l,y:Xt,Y:Zt,Z:Jt,"%":sn};return n}function Bt(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o<e?new Array(e-o+1).join(n)+i:i)}function Ut(t){return new RegExp("^(?:"+t.map(sa.requote).join("|")+")","i")}function Wt(t){for(var n=new l,e=-1,r=t.length;++e<r;)n.set(t[e].toLowerCase(),e);return n}function Ht(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r[0].length):-1}function Yt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e));return r?(t.U=+r[0],e+r[0].length):-1}function Gt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e));return r?(t.W=+r[0],e+r[0].length):-1}function Zt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r[0].length):-1}function Xt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.y=Kt(+r[0]),e+r[0].length):-1}function Jt(t,n,e){return/^[+-]\d{4}$/.test(n=n.slice(e,e+5))?(t.Z=-n,e+5):-1}function Kt(t){return t+(t>68?1900:2e3)}function Qt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function tn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function nn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+3));return r?(t.j=+r[0],e+r[0].length):-1}function en(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function rn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function on(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function an(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function un(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=ba(n)/60|0,i=ba(n)%60;return e+Bt(r,"0",2)+Bt(i,"0",2)}function sn(t,n,e){$u.lastIndex=0;var r=$u.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function ln(t){for(var n=t.length,e=-1;++e<n;)t[e][0]=this(t[e][0]);return function(n){for(var e=0,r=t[e];!r[1](n);)r=t[++e];return r[0](n)}}function cn(){}function fn(t,n,e){var r=e.s=t+n,i=r-t,o=r-i;e.t=t-o+(n-i)}function hn(t,n){t&&Cu.hasOwnProperty(t.type)&&Cu[t.type](t,n)}function pn(t,n,e){var r,i=-1,o=t.length-e;for(n.lineStart();++i<o;)r=t[i],n.point(r[0],r[1],r[2]);n.lineEnd()}function dn(t,n){var e=-1,r=t.length;for(n.polygonStart();++e<r;)pn(t[e],n,1);n.polygonEnd()}function vn(){function t(t,n){t*=Ba,n=n*Ba/2+Ia/4;var e=t-r,a=e>=0?1:-1,u=a*e,s=Math.cos(n),l=Math.sin(n),c=o*l,f=i*s+c*Math.cos(u),h=c*a*Math.sin(u);Mu.add(Math.atan2(h,f)),r=t,i=s,o=l}var n,e,r,i,o;_u.point=function(a,u){_u.point=t,r=(n=a)*Ba,i=Math.cos(u=(e=u)*Ba/2+Ia/4),o=Math.sin(u)},_u.lineEnd=function(){t(n,e)}}function gn(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function mn(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function yn(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function $n(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function bn(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function xn(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function wn(t){return[Math.atan2(t[1],t[0]),nt(t[2])]}function Cn(t,n){return ba(t[0]-n[0])<Da&&ba(t[1]-n[1])<Da}function Sn(t,n){t*=Ba;var e=Math.cos(n*=Ba);Mn(e*Math.cos(t),e*Math.sin(t),Math.sin(n))}function Mn(t,n,e){++ku,Eu+=(t-Eu)/ku,Pu+=(n-Pu)/ku,Ou+=(e-Ou)/ku}function _n(){function t(t,i){t*=Ba;var o=Math.cos(i*=Ba),a=o*Math.cos(t),u=o*Math.sin(t),s=Math.sin(i),l=Math.atan2(Math.sqrt((l=e*s-r*u)*l+(l=r*a-n*s)*l+(l=n*u-e*a)*l),n*a+e*u+r*s);
-Au+=l,Tu+=l*(n+(n=a)),Lu+=l*(e+(e=u)),Nu+=l*(r+(r=s)),Mn(n,e,r)}var n,e,r;Fu.point=function(i,o){i*=Ba;var a=Math.cos(o*=Ba);n=a*Math.cos(i),e=a*Math.sin(i),r=Math.sin(o),Fu.point=t,Mn(n,e,r)}}function kn(){Fu.point=Sn}function An(){function t(t,n){t*=Ba;var e=Math.cos(n*=Ba),a=e*Math.cos(t),u=e*Math.sin(t),s=Math.sin(n),l=i*s-o*u,c=o*a-r*s,f=r*u-i*a,h=Math.sqrt(l*l+c*c+f*f),p=r*a+i*u+o*s,d=h&&-tt(p)/h,v=Math.atan2(h,p);ju+=d*l,Ru+=d*c,Du+=d*f,Au+=v,Tu+=v*(r+(r=a)),Lu+=v*(i+(i=u)),Nu+=v*(o+(o=s)),Mn(r,i,o)}var n,e,r,i,o;Fu.point=function(a,u){n=a,e=u,Fu.point=t,a*=Ba;var s=Math.cos(u*=Ba);r=s*Math.cos(a),i=s*Math.sin(a),o=Math.sin(u),Mn(r,i,o)},Fu.lineEnd=function(){t(n,e),Fu.lineEnd=kn,Fu.point=Sn}}function En(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),e&&t.invert(e[0],e[1])}),e}function Pn(){return!0}function On(t,n,e,r,i){var o=[],a=[];if(t.forEach(function(t){if(!((n=t.length-1)<=0)){var n,e=t[0],r=t[n];if(Cn(e,r)){i.lineStart();for(var u=0;u<n;++u)i.point((e=t[u])[0],e[1]);return void i.lineEnd()}var s=new Ln(e,t,null,(!0)),l=new Ln(e,null,s,(!1));s.o=l,o.push(s),a.push(l),s=new Ln(r,t,null,(!1)),l=new Ln(r,null,s,(!0)),s.o=l,o.push(s),a.push(l)}}),a.sort(n),Tn(o),Tn(a),o.length){for(var u=0,s=e,l=a.length;u<l;++u)a[u].e=s=!s;for(var c,f,h=o[0];;){for(var p=h,d=!0;p.v;)if((p=p.n)===h)return;c=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(d)for(var u=0,l=c.length;u<l;++u)i.point((f=c[u])[0],f[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(d){c=p.p.z;for(var u=c.length-1;u>=0;--u)i.point((f=c[u])[0],f[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,c=p.z,d=!d}while(!p.v);i.lineEnd()}}}function Tn(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r<n;)i.n=e=t[r],e.p=i,i=e;i.n=e=t[0],e.p=i}}function Ln(t,n,e,r){this.x=t,this.z=n,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Nn(t,n,e,r){return function(i,o){function a(n,e){var r=i(n,e);t(n=r[0],e=r[1])&&o.point(n,e)}function u(t,n){var e=i(t,n);g.point(e[0],e[1])}function s(){y.point=u,g.lineStart()}function l(){y.point=a,g.lineEnd()}function c(t,n){v.push([t,n]);var e=i(t,n);b.point(e[0],e[1])}function f(){b.lineStart(),v=[]}function h(){c(v[0][0],v[0][1]),b.lineEnd();var t,n=b.clean(),e=$.buffer(),r=e.length;if(v.pop(),d.push(v),v=null,r)if(1&n){t=e[0];var i,r=t.length-1,a=-1;if(r>0){for(x||(o.polygonStart(),x=!0),o.lineStart();++a<r;)o.point((i=t[a])[0],i[1]);o.lineEnd()}}else r>1&&2&n&&e.push(e.pop().concat(e.shift())),p.push(e.filter(jn))}var p,d,v,g=n(o),m=i.invert(r[0],r[1]),y={point:a,lineStart:s,lineEnd:l,polygonStart:function(){y.point=c,y.lineStart=f,y.lineEnd=h,p=[],d=[]},polygonEnd:function(){y.point=a,y.lineStart=s,y.lineEnd=l,p=sa.merge(p);var t=qn(m,d);p.length?(x||(o.polygonStart(),x=!0),On(p,Dn,t,e,o)):t&&(x||(o.polygonStart(),x=!0),o.lineStart(),e(null,null,1,o),o.lineEnd()),x&&(o.polygonEnd(),x=!1),p=d=null},sphere:function(){o.polygonStart(),o.lineStart(),e(null,null,1,o),o.lineEnd(),o.polygonEnd()}},$=Rn(),b=n($),x=!1;return y}}function jn(t){return t.length>1}function Rn(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:x,buffer:function(){var e=n;return n=[],t=null,e},rejoin:function(){n.length>1&&n.push(n.pop().concat(n.shift()))}}}function Dn(t,n){return((t=t.x)[0]<0?t[1]-za-Da:za-t[1])-((n=n.x)[0]<0?n[1]-za-Da:za-n[1])}function Fn(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?Ia:-Ia,s=ba(o-e);ba(s-Ia)<Da?(t.point(e,r=(r+a)/2>0?za:-za),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&s>=Ia&&(ba(e-i)<Da&&(e-=i*Da),ba(o-u)<Da&&(o-=u*Da),r=In(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}}function In(t,n,e,r){var i,o,a=Math.sin(t-e);return ba(a)>Da?Math.atan((Math.sin(n)*(o=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(n))*Math.sin(t))/(i*o*a)):(n+r)/2}function Vn(t,n,e,r){var i;if(null==t)i=e*za,r.point(-Ia,i),r.point(0,i),r.point(Ia,i),r.point(Ia,0),r.point(Ia,-i),r.point(0,-i),r.point(-Ia,-i),r.point(-Ia,0),r.point(-Ia,i);else if(ba(t[0]-n[0])>Da){var o=t[0]<n[0]?Ia:-Ia;i=e*o/2,r.point(-o,i),r.point(0,i),r.point(o,i)}else r.point(n[0],n[1])}function qn(t,n){var e=t[0],r=t[1],i=[Math.sin(e),-Math.cos(e),0],o=0,a=0;Mu.reset();for(var u=0,s=n.length;u<s;++u){var l=n[u],c=l.length;if(c)for(var f=l[0],h=f[0],p=f[1]/2+Ia/4,d=Math.sin(p),v=Math.cos(p),g=1;;){g===c&&(g=0),t=l[g];var m=t[0],y=t[1]/2+Ia/4,$=Math.sin(y),b=Math.cos(y),x=m-h,w=x>=0?1:-1,C=w*x,S=C>Ia,M=d*$;if(Mu.add(Math.atan2(M*w*Math.sin(C),v*b+M*Math.cos(C))),o+=S?x+w*Va:x,S^h>=e^m>=e){var _=yn(gn(f),gn(t));xn(_);var k=yn(i,_);xn(k);var A=(S^x>=0?-1:1)*nt(k[2]);(r>A||r===A&&(_[0]||_[1]))&&(a+=S^x>=0?1:-1)}if(!g++)break;h=m,d=$,v=b,f=t}}return(o<-Da||o<Da&&Mu<-Da)^1&a}function zn(t){function n(t,n){return Math.cos(t)*Math.cos(n)>o}function e(t){var e,o,s,l,c;return{lineStart:function(){l=s=!1,c=1},point:function(f,h){var p,d=[f,h],v=n(f,h),g=a?v?0:i(f,h):v?i(f+(f<0?Ia:-Ia),h):0;if(!e&&(l=s=v)&&t.lineStart(),v!==s&&(p=r(e,d),(Cn(e,p)||Cn(d,p))&&(d[0]+=Da,d[1]+=Da,v=n(d[0],d[1]))),v!==s)c=0,v?(t.lineStart(),p=r(d,e),t.point(p[0],p[1])):(p=r(e,d),t.point(p[0],p[1]),t.lineEnd()),e=p;else if(u&&e&&a^v){var m;g&o||!(m=r(d,e,!0))||(c=0,a?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1])))}!v||e&&Cn(e,d)||t.point(d[0],d[1]),e=d,s=v,o=g},lineEnd:function(){s&&t.lineEnd(),e=null},clean:function(){return c|(l&&s)<<1}}}function r(t,n,e){var r=gn(t),i=gn(n),a=[1,0,0],u=yn(r,i),s=mn(u,u),l=u[0],c=s-l*l;if(!c)return!e&&t;var f=o*s/c,h=-o*l/c,p=yn(a,u),d=bn(a,f),v=bn(u,h);$n(d,v);var g=p,m=mn(d,g),y=mn(g,g),$=m*m-y*(mn(d,d)-1);if(!($<0)){var b=Math.sqrt($),x=bn(g,(-m-b)/y);if($n(x,d),x=wn(x),!e)return x;var w,C=t[0],S=n[0],M=t[1],_=n[1];S<C&&(w=C,C=S,S=w);var k=S-C,A=ba(k-Ia)<Da,E=A||k<Da;if(!A&&_<M&&(w=M,M=_,_=w),E?A?M+_>0^x[1]<(ba(x[0]-C)<Da?M:_):M<=x[1]&&x[1]<=_:k>Ia^(C<=x[0]&&x[0]<=S)){var P=bn(g,(-m+b)/y);return $n(P,d),[x,wn(P)]}}}function i(n,e){var r=a?t:Ia-t,i=0;return n<-r?i|=1:n>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var o=Math.cos(t),a=o>0,u=ba(o)>Da,s=ve(t,6*Ba);return Nn(n,e,s,a?[0,-t]:[-Ia,t-Ia])}function Bn(t,n,e,r){return function(i){var o,a=i.a,u=i.b,s=a.x,l=a.y,c=u.x,f=u.y,h=0,p=1,d=c-s,v=f-l;if(o=t-s,d||!(o>0)){if(o/=d,d<0){if(o<h)return;o<p&&(p=o)}else if(d>0){if(o>p)return;o>h&&(h=o)}if(o=e-s,d||!(o<0)){if(o/=d,d<0){if(o>p)return;o>h&&(h=o)}else if(d>0){if(o<h)return;o<p&&(p=o)}if(o=n-l,v||!(o>0)){if(o/=v,v<0){if(o<h)return;o<p&&(p=o)}else if(v>0){if(o>p)return;o>h&&(h=o)}if(o=r-l,v||!(o<0)){if(o/=v,v<0){if(o>p)return;o>h&&(h=o)}else if(v>0){if(o<h)return;o<p&&(p=o)}return h>0&&(i.a={x:s+h*d,y:l+h*v}),p<1&&(i.b={x:s+p*d,y:l+p*v}),i}}}}}}function Un(t,n,e,r){function i(r,i){return ba(r[0]-t)<Da?i>0?0:3:ba(r[0]-e)<Da?i>0?2:1:ba(r[1]-n)<Da?i>0?1:0:i>0?3:2}function o(t,n){return a(t.x,n.x)}function a(t,n){var e=i(t,1),r=i(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(u){function s(t){for(var n=0,e=g.length,r=t[1],i=0;i<e;++i)for(var o,a=1,u=g[i],s=u.length,l=u[0];a<s;++a)o=u[a],l[1]<=r?o[1]>r&&Q(l,o,t)>0&&++n:o[1]<=r&&Q(l,o,t)<0&&--n,l=o;return 0!==n}function l(o,u,s,l){var c=0,f=0;if(null==o||(c=i(o,s))!==(f=i(u,s))||a(o,u)<0^s>0){do l.point(0===c||3===c?t:e,c>1?r:n);while((c=(c+s+4)%4)!==f)}else l.point(u[0],u[1])}function c(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function f(t,n){c(t,n)&&u.point(t,n)}function h(){E.point=d,g&&g.push(m=[]),S=!0,C=!1,x=w=NaN}function p(){v&&(d(y,$),b&&C&&k.rejoin(),v.push(k.buffer())),E.point=f,C&&u.lineEnd()}function d(t,n){t=Math.max(-Vu,Math.min(Vu,t)),n=Math.max(-Vu,Math.min(Vu,n));var e=c(t,n);if(g&&m.push([t,n]),S)y=t,$=n,b=e,S=!1,e&&(u.lineStart(),u.point(t,n));else if(e&&C)u.point(t,n);else{var r={a:{x:x,y:w},b:{x:t,y:n}};A(r)?(C||(u.lineStart(),u.point(r.a.x,r.a.y)),u.point(r.b.x,r.b.y),e||u.lineEnd(),M=!1):e&&(u.lineStart(),u.point(t,n),M=!1)}x=t,w=n,C=e}var v,g,m,y,$,b,x,w,C,S,M,_=u,k=Rn(),A=Bn(t,n,e,r),E={point:f,lineStart:h,lineEnd:p,polygonStart:function(){u=k,v=[],g=[],M=!0},polygonEnd:function(){u=_,v=sa.merge(v);var n=s([t,r]),e=M&&n,i=v.length;(e||i)&&(u.polygonStart(),e&&(u.lineStart(),l(null,null,1,u),u.lineEnd()),i&&On(v,o,n,l,u),u.polygonEnd()),v=g=m=null}};return E}}function Wn(t){var n=0,e=Ia/3,r=ue(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Ia/180,e=t[1]*Ia/180):[n/Ia*180,e/Ia*180]},i}function Hn(t,n){function e(t,n){var e=Math.sqrt(o-2*i*Math.sin(n))/i;return[e*Math.sin(t*=i),a-e*Math.cos(t)]}var r=Math.sin(t),i=(r+Math.sin(n))/2,o=1+r*(2*i-r),a=Math.sqrt(o)/i;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/i,nt((o-(t*t+e*e)*i*i)/(2*i))]},e}function Yn(){function t(t,n){zu+=i*t-r*n,r=t,i=n}var n,e,r,i;Yu.point=function(o,a){Yu.point=t,n=r=o,e=i=a},Yu.lineEnd=function(){t(n,e)}}function Gn(t,n){t<Bu&&(Bu=t),t>Wu&&(Wu=t),n<Uu&&(Uu=n),n>Hu&&(Hu=n)}function Zn(){function t(t,n){a.push("M",t,",",n,o)}function n(t,n){a.push("M",t,",",n),u.point=e}function e(t,n){a.push("L",t,",",n)}function r(){u.point=t}function i(){a.push("Z")}var o=Xn(4.5),a=[],u={point:t,lineStart:function(){u.point=n},lineEnd:r,polygonStart:function(){u.lineEnd=i},polygonEnd:function(){u.lineEnd=r,u.point=t},pointRadius:function(t){return o=Xn(t),u},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return u}function Xn(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Jn(t,n){Eu+=t,Pu+=n,++Ou}function Kn(){function t(t,r){var i=t-n,o=r-e,a=Math.sqrt(i*i+o*o);Tu+=a*(n+t)/2,Lu+=a*(e+r)/2,Nu+=a,Jn(n=t,e=r)}var n,e;Zu.point=function(r,i){Zu.point=t,Jn(n=r,e=i)}}function Qn(){Zu.point=Jn}function te(){function t(t,n){var e=t-r,o=n-i,a=Math.sqrt(e*e+o*o);Tu+=a*(r+t)/2,Lu+=a*(i+n)/2,Nu+=a,a=i*t-r*n,ju+=a*(r+t),Ru+=a*(i+n),Du+=3*a,Jn(r=t,i=n)}var n,e,r,i;Zu.point=function(o,a){Zu.point=t,Jn(n=r=o,e=i=a)},Zu.lineEnd=function(){t(n,e)}}function ne(t){function n(n,e){t.moveTo(n+a,e),t.arc(n,e,a,0,Va)}function e(n,e){t.moveTo(n,e),u.point=r}function r(n,e){t.lineTo(n,e)}function i(){u.point=n}function o(){t.closePath()}var a=4.5,u={point:n,lineStart:function(){u.point=e},lineEnd:i,polygonStart:function(){u.lineEnd=o},polygonEnd:function(){u.lineEnd=i,u.point=n},pointRadius:function(t){return a=t,u},result:x};return u}function ee(t){function n(t){return(u?r:e)(t)}function e(n){return oe(n,function(e,r){e=t(e,r),n.point(e[0],e[1])})}function r(n){function e(e,r){e=t(e,r),n.point(e[0],e[1])}function r(){$=NaN,S.point=o,n.lineStart()}function o(e,r){var o=gn([e,r]),a=t(e,r);i($,b,y,x,w,C,$=a[0],b=a[1],y=e,x=o[0],w=o[1],C=o[2],u,n),n.point($,b)}function a(){S.point=e,n.lineEnd()}function s(){r(),S.point=l,S.lineEnd=c}function l(t,n){o(f=t,h=n),p=$,d=b,v=x,g=w,m=C,S.point=o}function c(){i($,b,y,x,w,C,p,d,f,v,g,m,u,n),S.lineEnd=a,a()}var f,h,p,d,v,g,m,y,$,b,x,w,C,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){n.polygonStart(),S.lineStart=s},polygonEnd:function(){n.polygonEnd(),S.lineStart=r}};return S}function i(n,e,r,u,s,l,c,f,h,p,d,v,g,m){var y=c-n,$=f-e,b=y*y+$*$;if(b>4*o&&g--){var x=u+p,w=s+d,C=l+v,S=Math.sqrt(x*x+w*w+C*C),M=Math.asin(C/=S),_=ba(ba(C)-1)<Da||ba(r-h)<Da?(r+h)/2:Math.atan2(w,x),k=t(_,M),A=k[0],E=k[1],P=A-n,O=E-e,T=$*P-y*O;(T*T/b>o||ba((y*P+$*O)/b-.5)>.3||u*p+s*d+l*v<a)&&(i(n,e,r,u,s,l,A,E,_,x/=S,w/=S,C,g,m),m.point(A,E),i(A,E,_,x,w,C,c,f,h,p,d,v,g,m))}}var o=.5,a=Math.cos(30*Ba),u=16;return n.precision=function(t){return arguments.length?(u=(o=t*t)>0&&16,n):Math.sqrt(o)},n}function re(t){var n=ee(function(n,e){return t([n*Ua,e*Ua])});return function(t){return se(n(t))}}function ie(t){this.stream=t}function oe(t,n){return{point:n,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function ae(t){return ue(function(){return t})()}function ue(t){function n(t){return t=u(t[0]*Ba,t[1]*Ba),[t[0]*h+s,l-t[1]*h]}function e(t){return t=u.invert((t[0]-s)/h,(l-t[1])/h),t&&[t[0]*Ua,t[1]*Ua]}function r(){u=En(a=fe(m,$,b),o);var t=o(v,g);return s=p-t[0]*h,l=d+t[1]*h,i()}function i(){return c&&(c.valid=!1,c=null),n}var o,a,u,s,l,c,f=ee(function(t,n){return t=o(t,n),[t[0]*h+s,l-t[1]*h]}),h=150,p=480,d=250,v=0,g=0,m=0,$=0,b=0,x=Iu,w=y,C=null,S=null;return n.stream=function(t){return c&&(c.valid=!1),c=se(x(a,f(w(t)))),c.valid=!0,c},n.clipAngle=function(t){return arguments.length?(x=null==t?(C=t,Iu):zn((C=+t)*Ba),i()):C},n.clipExtent=function(t){return arguments.length?(S=t,w=t?Un(t[0][0],t[0][1],t[1][0],t[1][1]):y,i()):S},n.scale=function(t){return arguments.length?(h=+t,r()):h},n.translate=function(t){return arguments.length?(p=+t[0],d=+t[1],r()):[p,d]},n.center=function(t){return arguments.length?(v=t[0]%360*Ba,g=t[1]%360*Ba,r()):[v*Ua,g*Ua]},n.rotate=function(t){return arguments.length?(m=t[0]%360*Ba,$=t[1]%360*Ba,b=t.length>2?t[2]%360*Ba:0,r()):[m*Ua,$*Ua,b*Ua]},sa.rebind(n,f,"precision"),function(){return o=t.apply(this,arguments),n.invert=o.invert&&e,r()}}function se(t){return oe(t,function(n,e){t.point(n*Ba,e*Ba)})}function le(t,n){return[t,n]}function ce(t,n){return[t>Ia?t-Va:t<-Ia?t+Va:t,n]}function fe(t,n,e){return t?n||e?En(pe(t),de(n,e)):pe(t):n||e?de(n,e):ce}function he(t){return function(n,e){return n+=t,[n>Ia?n-Va:n<-Ia?n+Va:n,e]}}function pe(t){var n=he(t);return n.invert=he(-t),n}function de(t,n){function e(t,n){var e=Math.cos(n),u=Math.cos(t)*e,s=Math.sin(t)*e,l=Math.sin(n),c=l*r+u*i;return[Math.atan2(s*o-c*a,u*r-l*i),nt(c*o+s*a)]}var r=Math.cos(t),i=Math.sin(t),o=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),u=Math.cos(t)*e,s=Math.sin(t)*e,l=Math.sin(n),c=l*o-s*a;return[Math.atan2(s*o+l*a,u*r+c*i),nt(c*r-u*i)]},e}function ve(t,n){var e=Math.cos(t),r=Math.sin(t);return function(i,o,a,u){var s=a*n;null!=i?(i=ge(e,i),o=ge(e,o),(a>0?i<o:i>o)&&(i+=a*Va)):(i=t+a*Va,o=t-.5*s);for(var l,c=i;a>0?c>o:c<o;c-=s)u.point((l=wn([e,-r*Math.cos(c),-r*Math.sin(c)]))[0],l[1])}}function ge(t,n){var e=gn(n);e[0]-=t,xn(e);var r=tt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(t,n,e){var r=sa.range(t,n-Da,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function ye(t,n,e){var r=sa.range(t,n-Da,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function $e(t){return t.source}function be(t){return t.target}function xe(t,n,e,r){var i=Math.cos(n),o=Math.sin(n),a=Math.cos(r),u=Math.sin(r),s=i*Math.cos(t),l=i*Math.sin(t),c=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(ot(r-n)+i*a*ot(e-t))),p=1/Math.sin(h),d=h?function(t){var n=Math.sin(t*=h)*p,e=Math.sin(h-t)*p,r=e*s+n*c,i=e*l+n*f,a=e*o+n*u;return[Math.atan2(i,r)*Ua,Math.atan2(a,Math.sqrt(r*r+i*i))*Ua]}:function(){return[t*Ua,n*Ua]};return d.distance=h,d}function we(){function t(t,i){var o=Math.sin(i*=Ba),a=Math.cos(i),u=ba((t*=Ba)-n),s=Math.cos(u);Xu+=Math.atan2(Math.sqrt((u=a*Math.sin(u))*u+(u=r*o-e*a*s)*u),e*o+r*a*s),n=t,e=o,r=a}var n,e,r;Ju.point=function(i,o){n=i*Ba,e=Math.sin(o*=Ba),r=Math.cos(o),Ju.point=t},Ju.lineEnd=function(){Ju.point=Ju.lineEnd=x}}function Ce(t,n){function e(n,e){var r=Math.cos(n),i=Math.cos(e),o=t(r*i);return[o*i*Math.sin(n),o*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),i=n(r),o=Math.sin(i),a=Math.cos(i);return[Math.atan2(t*o,r*a),Math.asin(r&&e*o/r)]},e}function Se(t,n){function e(t,n){a>0?n<-za+Da&&(n=-za+Da):n>za-Da&&(n=za-Da);var e=a/Math.pow(i(n),o);return[e*Math.sin(o*t),a-e*Math.cos(o*t)]}var r=Math.cos(t),i=function(t){return Math.tan(Ia/4+t/2)},o=t===n?Math.sin(t):Math.log(r/Math.cos(n))/Math.log(i(n)/i(t)),a=r*Math.pow(i(t),o)/o;return o?(e.invert=function(t,n){var e=a-n,r=K(o)*Math.sqrt(t*t+e*e);return[Math.atan2(t,e)/o,2*Math.atan(Math.pow(a/r,1/o))-za]},e):_e}function Me(t,n){function e(t,n){var e=o-n;return[e*Math.sin(i*t),o-e*Math.cos(i*t)]}var r=Math.cos(t),i=t===n?Math.sin(t):(r-Math.cos(n))/(n-t),o=r/i+t;return ba(i)<Da?le:(e.invert=function(t,n){var e=o-n;return[Math.atan2(t,e)/i,o-K(i)*Math.sqrt(t*t+e*e)]},e)}function _e(t,n){return[t,Math.log(Math.tan(Ia/4+n/2))]}function ke(t){var n,e=ae(t),r=e.scale,i=e.translate,o=e.clipExtent;return e.scale=function(){var t=r.apply(e,arguments);return t===e?n?e.clipExtent(null):e:t},e.translate=function(){var t=i.apply(e,arguments);return t===e?n?e.clipExtent(null):e:t},e.clipExtent=function(t){var a=o.apply(e,arguments);if(a===e){if(n=null==t){var u=Ia*r(),s=i();o([[s[0]-u,s[1]-u],[s[0]+u,s[1]+u]])}}else n&&(a=null);return a},e.clipExtent(null)}function Ae(t,n){return[Math.log(Math.tan(Ia/4+n/2)),-t]}function Ee(t){return t[0]}function Pe(t){return t[1]}function Oe(t){for(var n=t.length,e=[0,1],r=2,i=2;i<n;i++){for(;r>1&&Q(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function Te(t,n){return t[0]-n[0]||t[1]-n[1]}function Le(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Ne(t,n,e,r){var i=t[0],o=e[0],a=n[0]-i,u=r[0]-o,s=t[1],l=e[1],c=n[1]-s,f=r[1]-l,h=(u*(s-l)-f*(i-o))/(f*a-u*c);return[i+h*a,s+h*c]}function je(t){var n=t[0],e=t[t.length-1];return!(n[0]-e[0]||n[1]-e[1])}function Re(){rr(this),this.edge=this.site=this.circle=null}function De(t){var n=ls.pop()||new Re;return n.site=t,n}function Fe(t){Ge(t),as.remove(t),ls.push(t),rr(t)}function Ie(t){var n=t.circle,e=n.x,r=n.cy,i={x:e,y:r},o=t.P,a=t.N,u=[t];Fe(t);for(var s=o;s.circle&&ba(e-s.circle.x)<Da&&ba(r-s.circle.cy)<Da;)o=s.P,u.unshift(s),Fe(s),s=o;u.unshift(s),Ge(s);for(var l=a;l.circle&&ba(e-l.circle.x)<Da&&ba(r-l.circle.cy)<Da;)a=l.N,u.push(l),Fe(l),l=a;u.push(l),Ge(l);var c,f=u.length;for(c=1;c<f;++c)l=u[c],s=u[c-1],tr(l.edge,s.site,l.site,i);s=u[0],l=u[f-1],l.edge=Ke(s.site,l.site,null,i),Ye(s),Ye(l)}function Ve(t){for(var n,e,r,i,o=t.x,a=t.y,u=as._;u;)if(r=qe(u,a)-o,r>Da)u=u.L;else{if(i=o-ze(u,a),!(i>Da)){r>-Da?(n=u.P,e=u):i>-Da?(n=u,e=u.N):n=e=u;break}if(!u.R){n=u;break}u=u.R}var s=De(t);if(as.insert(n,s),n||e){if(n===e)return Ge(n),e=De(n.site),as.insert(s,e),s.edge=e.edge=Ke(n.site,s.site),Ye(n),void Ye(e);if(!e)return void(s.edge=Ke(n.site,s.site));Ge(n),Ge(e);var l=n.site,c=l.x,f=l.y,h=t.x-c,p=t.y-f,d=e.site,v=d.x-c,g=d.y-f,m=2*(h*g-p*v),y=h*h+p*p,$=v*v+g*g,b={x:(g*y-p*$)/m+c,y:(h*$-v*y)/m+f};tr(e.edge,l,d,b),s.edge=Ke(l,t,null,b),e.edge=Ke(t,d,null,b),Ye(n),Ye(e)}}function qe(t,n){var e=t.site,r=e.x,i=e.y,o=i-n;if(!o)return r;var a=t.P;if(!a)return-(1/0);e=a.site;var u=e.x,s=e.y,l=s-n;if(!l)return u;var c=u-r,f=1/o-1/l,h=c/l;return f?(-h+Math.sqrt(h*h-2*f*(c*c/(-2*l)-s+l/2+i-o/2)))/f+r:(r+u)/2}function ze(t,n){var e=t.N;if(e)return qe(e,n);var r=t.site;return r.y===n?r.x:1/0}function Be(t){this.site=t,this.edges=[]}function Ue(t){for(var n,e,r,i,o,a,u,s,l,c,f=t[0][0],h=t[1][0],p=t[0][1],d=t[1][1],v=os,g=v.length;g--;)if(o=v[g],o&&o.prepare())for(u=o.edges,s=u.length,a=0;a<s;)c=u[a].end(),r=c.x,i=c.y,l=u[++a%s].start(),n=l.x,e=l.y,(ba(r-n)>Da||ba(i-e)>Da)&&(u.splice(a,0,new nr(Qe(o.site,c,ba(r-f)<Da&&d-i>Da?{x:f,y:ba(n-f)<Da?e:d}:ba(i-d)<Da&&h-r>Da?{x:ba(e-d)<Da?n:h,y:d}:ba(r-h)<Da&&i-p>Da?{x:h,y:ba(n-h)<Da?e:p}:ba(i-p)<Da&&r-f>Da?{x:ba(e-p)<Da?n:f,y:p}:null),o.site,null)),++s)}function We(t,n){return n.angle-t.angle}function He(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Ye(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;if(r!==o){var a=i.x,u=i.y,s=r.x-a,l=r.y-u,c=o.x-a,f=o.y-u,h=2*(s*f-l*c);if(!(h>=-Fa)){var p=s*s+l*l,d=c*c+f*f,v=(f*p-l*d)/h,g=(s*d-c*p)/h,f=g+u,m=cs.pop()||new He;m.arc=t,m.site=i,m.x=v+a,m.y=f+Math.sqrt(v*v+g*g),m.cy=f,t.circle=m;for(var y=null,$=ss._;$;)if(m.y<$.y||m.y===$.y&&m.x<=$.x){if(!$.L){y=$.P;break}$=$.L}else{if(!$.R){y=$;break}$=$.R}ss.insert(y,m),y||(us=m)}}}}function Ge(t){var n=t.circle;n&&(n.P||(us=n.N),ss.remove(n),cs.push(n),rr(n),t.circle=null)}function Ze(t){for(var n,e=is,r=Bn(t[0][0],t[0][1],t[1][0],t[1][1]),i=e.length;i--;)n=e[i],(!Xe(n,t)||!r(n)||ba(n.a.x-n.b.x)<Da&&ba(n.a.y-n.b.y)<Da)&&(n.a=n.b=null,e.splice(i,1))}function Xe(t,n){var e=t.b;if(e)return!0;var r,i,o=t.a,a=n[0][0],u=n[1][0],s=n[0][1],l=n[1][1],c=t.l,f=t.r,h=c.x,p=c.y,d=f.x,v=f.y,g=(h+d)/2,m=(p+v)/2;if(v===p){if(g<a||g>=u)return;if(h>d){if(o){if(o.y>=l)return}else o={x:g,y:s};e={x:g,y:l}}else{if(o){if(o.y<s)return}else o={x:g,y:l};e={x:g,y:s}}}else if(r=(h-d)/(v-p),i=m-r*g,r<-1||r>1)if(h>d){if(o){if(o.y>=l)return}else o={x:(s-i)/r,y:s};e={x:(l-i)/r,y:l}}else{if(o){if(o.y<s)return}else o={x:(l-i)/r,y:l};e={x:(s-i)/r,y:s}}else if(p<v){if(o){if(o.x>=u)return}else o={x:a,y:r*a+i};e={x:u,y:r*u+i}}else{if(o){if(o.x<a)return}else o={x:u,y:r*u+i};e={x:a,y:r*a+i}}return t.a=o,t.b=e,!0}function Je(t,n){this.l=t,this.r=n,this.a=this.b=null}function Ke(t,n,e,r){var i=new Je(t,n);return is.push(i),e&&tr(i,t,n,e),r&&tr(i,n,t,r),os[t.i].edges.push(new nr(i,t,n)),os[n.i].edges.push(new nr(i,n,t)),i}function Qe(t,n,e){var r=new Je(t,null);return r.a=n,r.b=e,is.push(r),r}function tr(t,n,e,r){t.a||t.b?t.l===e?t.b=r:t.a=r:(t.a=r,t.l=n,t.r=e)}function nr(t,n,e){var r=t.a,i=t.b;this.edge=t,this.site=n,this.angle=e?Math.atan2(e.y-n.y,e.x-n.x):t.l===n?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function er(){this._=null}function rr(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function ir(t,n){var e=n,r=n.R,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function or(t,n){var e=n,r=n.L,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function ar(t){for(;t.L;)t=t.L;return t}function ur(t,n){var e,r,i,o=t.sort(sr).pop();for(is=[],os=new Array(t.length),as=new er,ss=new er;;)if(i=us,o&&(!i||o.y<i.y||o.y===i.y&&o.x<i.x))o.x===e&&o.y===r||(os[o.i]=new Be(o),Ve(o),e=o.x,r=o.y),o=t.pop();else{if(!i)break;Ie(i.arc)}n&&(Ze(n),Ue(n));var a={cells:os,edges:is};return as=ss=is=os=null,a}function sr(t,n){return n.y-t.y||n.x-t.x}function lr(t,n,e){return(t.x-e.x)*(n.y-t.y)-(t.x-n.x)*(e.y-t.y)}function cr(t){return t.x}function fr(t){return t.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function pr(t,n,e,r,i,o){if(!t(n,e,r,i,o)){var a=.5*(e+i),u=.5*(r+o),s=n.nodes;s[0]&&pr(t,s[0],e,r,a,u),s[1]&&pr(t,s[1],a,r,i,u),s[2]&&pr(t,s[2],e,u,a,o),s[3]&&pr(t,s[3],a,u,i,o)}}function dr(t,n,e,r,i,o,a){var u,s=1/0;return function l(t,c,f,h,p){if(!(c>o||f>a||h<r||p<i)){if(d=t.point){var d,v=n-t.x,g=e-t.y,m=v*v+g*g;if(m<s){var y=Math.sqrt(s=m);r=n-y,i=e-y,o=n+y,a=e+y,u=d}}for(var $=t.nodes,b=.5*(c+h),x=.5*(f+p),w=n>=b,C=e>=x,S=C<<1|w,M=S+4;S<M;++S)if(t=$[3&S])switch(3&S){case 0:l(t,c,f,b,x);break;case 1:l(t,b,f,h,x);break;case 2:l(t,c,x,b,p);break;case 3:l(t,b,x,h,p)}}}(t,r,i,o,a),u}function vr(t,n){t=sa.rgb(t),n=sa.rgb(n);var e=t.r,r=t.g,i=t.b,o=n.r-e,a=n.g-r,u=n.b-i;return function(t){return"#"+bt(Math.round(e+o*t))+bt(Math.round(r+a*t))+bt(Math.round(i+u*t))}}function gr(t,n){var e,r={},i={};for(e in t)e in n?r[e]=$r(t[e],n[e]):i[e]=t[e];for(e in n)e in t||(i[e]=n[e]);return function(t){for(e in r)i[e]=r[e](t);return i}}function mr(t,n){return t=+t,n=+n,function(e){return t*(1-e)+n*e}}function yr(t,n){var e,r,i,o=hs.lastIndex=ps.lastIndex=0,a=-1,u=[],s=[];for(t+="",n+="";(e=hs.exec(t))&&(r=ps.exec(n));)(i=r.index)>o&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,s.push({i:a,x:mr(e,r)})),o=ps.lastIndex;return o<n.length&&(i=n.slice(o),u[a]?u[a]+=i:u[++a]=i),u.length<2?s[0]?(n=s[0].x,function(t){return n(t)+""}):function(){return n}:(n=s.length,function(t){for(var e,r=0;r<n;++r)u[(e=s[r]).i]=e.x(t);return u.join("")})}function $r(t,n){for(var e,r=sa.interpolators.length;--r>=0&&!(e=sa.interpolators[r](t,n)););return e}function br(t,n){var e,r=[],i=[],o=t.length,a=n.length,u=Math.min(t.length,n.length);for(e=0;e<u;++e)r.push($r(t[e],n[e]));for(;e<o;++e)i[e]=t[e];for(;e<a;++e)i[e]=n[e];return function(t){for(e=0;e<u;++e)i[e]=r[e](t);return i}}function xr(t){return function(n){return n<=0?0:n>=1?1:t(n)}}function wr(t){return function(n){return 1-t(1-n)}}function Cr(t){return function(n){return.5*(n<.5?t(2*n):2-t(2-2*n))}}function Sr(t){return t*t}function Mr(t){return t*t*t}function _r(t){if(t<=0)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(t<.5?e:3*(t-n)+e-.75)}function kr(t){return function(n){return Math.pow(n,t)}}function Ar(t){return 1-Math.cos(t*za)}function Er(t){return Math.pow(2,10*(t-1))}function Pr(t){return 1-Math.sqrt(1-t*t)}function Or(t,n){var e;return arguments.length<2&&(n=.45),arguments.length?e=n/Va*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,-10*r)*Math.sin((r-e)*Va/n)}}function Tr(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function Lr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Nr(t,n){t=sa.hcl(t),n=sa.hcl(n);var e=t.h,r=t.c,i=t.l,o=n.h-e,a=n.c-r,u=n.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?n.c:r),isNaN(o)?(o=0,e=isNaN(e)?n.h:e):o>180?o-=360:o<-180&&(o+=360),function(t){return ct(e+o*t,r+a*t,i+u*t)+""}}function jr(t,n){t=sa.hsl(t),n=sa.hsl(n);var e=t.h,r=t.s,i=t.l,o=n.h-e,a=n.s-r,u=n.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?n.s:r),isNaN(o)?(o=0,e=isNaN(e)?n.h:e):o>180?o-=360:o<-180&&(o+=360),function(t){return st(e+o*t,r+a*t,i+u*t)+""}}function Rr(t,n){t=sa.lab(t),n=sa.lab(n);var e=t.l,r=t.a,i=t.b,o=n.l-e,a=n.a-r,u=n.b-i;return function(t){return ht(e+o*t,r+a*t,i+u*t)+""}}function Dr(t,n){return n-=t,function(e){return Math.round(t+n*e)}}function Fr(t){var n=[t.a,t.b],e=[t.c,t.d],r=Vr(n),i=Ir(n,e),o=Vr(qr(e,n,-i))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Ua,this.translate=[t.e,t.f],this.scale=[r,o],this.skew=o?Math.atan2(i,o)*Ua:0}function Ir(t,n){return t[0]*n[0]+t[1]*n[1]}function Vr(t){var n=Math.sqrt(Ir(t,t));return n&&(t[0]/=n,t[1]/=n),n}function qr(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function zr(t){return t.length?t.pop()+",":""}function Br(t,n,e,r){if(t[0]!==n[0]||t[1]!==n[1]){var i=e.push("translate(",null,",",null,")");r.push({i:i-4,x:mr(t[0],n[0])},{i:i-2,x:mr(t[1],n[1])})}else(n[0]||n[1])&&e.push("translate("+n+")")}function Ur(t,n,e,r){t!==n?(t-n>180?n+=360:n-t>180&&(t+=360),r.push({i:e.push(zr(e)+"rotate(",null,")")-2,x:mr(t,n)})):n&&e.push(zr(e)+"rotate("+n+")")}function Wr(t,n,e,r){t!==n?r.push({i:e.push(zr(e)+"skewX(",null,")")-2,x:mr(t,n)}):n&&e.push(zr(e)+"skewX("+n+")")}function Hr(t,n,e,r){if(t[0]!==n[0]||t[1]!==n[1]){var i=e.push(zr(e)+"scale(",null,",",null,")");r.push({i:i-4,x:mr(t[0],n[0])},{i:i-2,x:mr(t[1],n[1])})}else 1===n[0]&&1===n[1]||e.push(zr(e)+"scale("+n+")")}function Yr(t,n){var e=[],r=[];return t=sa.transform(t),n=sa.transform(n),Br(t.translate,n.translate,e,r),Ur(t.rotate,n.rotate,e,r),Wr(t.skew,n.skew,e,r),Hr(t.scale,n.scale,e,r),t=n=null,function(t){for(var n,i=-1,o=r.length;++i<o;)e[(n=r[i]).i]=n.x(t);return e.join("")}}function Gr(t,n){return n=(n-=t=+t)||1/n,function(e){return(e-t)/n}}function Zr(t,n){return n=(n-=t=+t)||1/n,function(e){return Math.max(0,Math.min(1,(e-t)/n))}}function Xr(t){for(var n=t.source,e=t.target,r=Kr(n,e),i=[n];n!==r;)n=n.parent,i.push(n);for(var o=i.length;e!==r;)i.splice(o,0,e),e=e.parent;return i}function Jr(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Kr(t,n){if(t===n)return t;for(var e=Jr(t),r=Jr(n),i=e.pop(),o=r.pop(),a=null;i===o;)a=i,i=e.pop(),o=r.pop();return a}function Qr(t){t.fixed|=2}function ti(t){t.fixed&=-7}function ni(t){t.fixed|=4,t.px=t.x,t.py=t.y}function ei(t){t.fixed&=-5}function ri(t,n,e){var r=0,i=0;if(t.charge=0,!t.leaf)for(var o,a=t.nodes,u=a.length,s=-1;++s<u;)o=a[s],null!=o&&(ri(o,n,e),t.charge+=o.charge,r+=o.charge*o.cx,i+=o.charge*o.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,i+=l*t.point.y}t.cx=r/t.charge,t.cy=i/t.charge}function ii(t,n){return sa.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=ci,t}function oi(t,n){for(var e=[t];null!=(t=e.pop());)if(n(t),(i=t.children)&&(r=i.length))for(var r,i;--r>=0;)e.push(i[r])}function ai(t,n){for(var e=[t],r=[];null!=(t=e.pop());)if(r.push(t),(o=t.children)&&(i=o.length))for(var i,o,a=-1;++a<i;)e.push(o[a]);for(;null!=(t=r.pop());)n(t)}function ui(t){return t.children}function si(t){return t.value}function li(t,n){return n.value-t.value}function ci(t){return sa.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function fi(t){return t.x}function hi(t){return t.y}function pi(t,n,e){t.y0=n,t.y=e}function di(t){return sa.range(t.length)}function vi(t){for(var n=-1,e=t[0].length,r=[];++n<e;)r[n]=0;return r}function gi(t){for(var n,e=1,r=0,i=t[0][1],o=t.length;e<o;++e)(n=t[e][1])>i&&(r=e,i=n);return r}function mi(t){return t.reduce(yi,0)}function yi(t,n){return t+n[1]}function $i(t,n){return bi(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function bi(t,n){for(var e=-1,r=+t[0],i=(t[1]-r)/n,o=[];++e<=n;)o[e]=i*e+r;return o}function xi(t){return[sa.min(t),sa.max(t)]}function wi(t,n){return t.value-n.value}function Ci(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function Si(t,n){t._pack_next=n,n._pack_prev=t}function Mi(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r+n.r;return.999*i*i>e*e+r*r}function _i(t){function n(t){c=Math.min(t.x-t.r,c),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),p=Math.max(t.y+t.r,p)}if((e=t.children)&&(l=e.length)){var e,r,i,o,a,u,s,l,c=1/0,f=-(1/0),h=1/0,p=-(1/0);if(e.forEach(ki),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(i=e[1],i.x=i.r,i.y=0,n(i),l>2))for(o=e[2],Pi(r,i,o),n(o),Ci(r,o),r._pack_prev=o,Ci(o,i),i=r._pack_next,a=3;a<l;a++){Pi(r,i,o=e[a]);var d=0,v=1,g=1;for(u=i._pack_next;u!==i;u=u._pack_next,v++)if(Mi(u,o)){d=1;break}if(1==d)for(s=r._pack_prev;s!==u._pack_prev&&!Mi(s,o);s=s._pack_prev,g++);d?(v<g||v==g&&i.r<r.r?Si(r,i=u):Si(r=s,i),a--):(Ci(r,o),i=o,n(o))}var m=(c+f)/2,y=(h+p)/2,$=0;for(a=0;a<l;a++)o=e[a],o.x-=m,o.y-=y,$=Math.max($,o.r+Math.sqrt(o.x*o.x+o.y*o.y));t.r=$,e.forEach(Ai)}}function ki(t){t._pack_next=t._pack_prev=t}function Ai(t){delete t._pack_next,delete t._pack_prev}function Ei(t,n,e,r){var i=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,i)for(var o=-1,a=i.length;++o<a;)Ei(i[o],n,e,r)}function Pi(t,n,e){var r=t.r+e.r,i=n.x-t.x,o=n.y-t.y;if(r&&(i||o)){var a=n.r+e.r,u=i*i+o*o;a*=a,r*=r;var s=.5+(r-a)/(2*u),l=Math.sqrt(Math.max(0,2*a*(r+u)-(r-=u)*r-a*a))/(2*u);e.x=t.x+s*i+l*o,e.y=t.y+s*o-l*i}else e.x=t.x+r,e.y=t.y}function Oi(t,n){return t.parent==n.parent?1:2}function Ti(t){var n=t.children;return n.length?n[0]:t.t}function Li(t){var n,e=t.children;return(n=e.length)?e[n-1]:t.t}function Ni(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}function ji(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)n=i[o],n.z+=e,n.m+=e,e+=n.s+(r+=n.c)}function Ri(t,n,e){return t.a.parent===n.parent?t.a:e}function Di(t){return 1+sa.max(t,function(t){return t.y})}function Fi(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function Ii(t){var n=t.children;return n&&n.length?Ii(n[0]):t}function Vi(t){var n,e=t.children;return e&&(n=e.length)?Vi(e[n-1]):t}function qi(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function zi(t,n){var e=t.x+n[3],r=t.y+n[0],i=t.dx-n[1]-n[3],o=t.dy-n[0]-n[2];return i<0&&(e+=i/2,i=0),o<0&&(r+=o/2,o=0),{x:e,y:r,dx:i,dy:o}}function Bi(t){var n=t[0],e=t[t.length-1];return n<e?[n,e]:[e,n]}function Ui(t){return t.rangeExtent?t.rangeExtent():Bi(t.range())}function Wi(t,n,e,r){var i=e(t[0],t[1]),o=r(n[0],n[1]);return function(t){return o(i(t))}}function Hi(t,n){var e,r=0,i=t.length-1,o=t[r],a=t[i];return a<o&&(e=r,r=i,i=e,e=o,o=a,a=e),t[r]=n.floor(o),t[i]=n.ceil(a),t}function Yi(t){return t?{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}:Ss}function Gi(t,n,e,r){var i=[],o=[],a=0,u=Math.min(t.length,n.length)-1;for(t[u]<t[0]&&(t=t.slice().reverse(),
-n=n.slice().reverse());++a<=u;)i.push(e(t[a-1],t[a])),o.push(r(n[a-1],n[a]));return function(n){var e=sa.bisect(t,n,1,u)-1;return o[e](i[e](n))}}function Zi(t,n,e,r){function i(){var i=Math.min(t.length,n.length)>2?Gi:Wi,s=r?Zr:Gr;return a=i(t,n,s,e),u=i(n,t,s,$r),o}function o(t){return a(t)}var a,u;return o.invert=function(t){return u(t)},o.domain=function(n){return arguments.length?(t=n.map(Number),i()):t},o.range=function(t){return arguments.length?(n=t,i()):n},o.rangeRound=function(t){return o.range(t).interpolate(Dr)},o.clamp=function(t){return arguments.length?(r=t,i()):r},o.interpolate=function(t){return arguments.length?(e=t,i()):e},o.ticks=function(n){return Qi(t,n)},o.tickFormat=function(n,e){return to(t,n,e)},o.nice=function(n){return Ji(t,n),i()},o.copy=function(){return Zi(t,n,e,r)},i()}function Xi(t,n){return sa.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Ji(t,n){return Hi(t,Yi(Ki(t,n)[2])),Hi(t,Yi(Ki(t,n)[2])),t}function Ki(t,n){null==n&&(n=10);var e=Bi(t),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),o=n/r*i;return o<=.15?i*=10:o<=.35?i*=5:o<=.75&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(t,n){return sa.range.apply(sa,Ki(t,n))}function to(t,n,e){var r=Ki(t,n);if(e){var i=hu.exec(e);if(i.shift(),"s"===i[8]){var o=sa.formatPrefix(Math.max(ba(r[0]),ba(r[1])));return i[7]||(i[7]="."+no(o.scale(r[2]))),i[8]="f",e=sa.format(i.join("")),function(t){return e(o.scale(t))+o.symbol}}i[7]||(i[7]="."+eo(i[8],r)),e=i.join("")}else e=",."+no(r[2])+"f";return sa.format(e)}function no(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}function eo(t,n){var e=no(n[2]);return t in Ms?Math.abs(e-no(Math.max(ba(n[0]),ba(n[1]))))+ +("e"!==t):e-2*("%"===t)}function ro(t,n,e,r){function i(t){return(e?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(n)}function o(t){return e?Math.pow(n,t):-Math.pow(n,-t)}function a(n){return t(i(n))}return a.invert=function(n){return o(t.invert(n))},a.domain=function(n){return arguments.length?(e=n[0]>=0,t.domain((r=n.map(Number)).map(i)),a):r},a.base=function(e){return arguments.length?(n=+e,t.domain(r.map(i)),a):n},a.nice=function(){var n=Hi(r.map(i),e?Math:ks);return t.domain(n),r=n.map(o),a},a.ticks=function(){var t=Bi(r),a=[],u=t[0],s=t[1],l=Math.floor(i(u)),c=Math.ceil(i(s)),f=n%1?2:n;if(isFinite(c-l)){if(e){for(;l<c;l++)for(var h=1;h<f;h++)a.push(o(l)*h);a.push(o(l))}else for(a.push(o(l));l++<c;)for(var h=f-1;h>0;h--)a.push(o(l)*h);for(l=0;a[l]<u;l++);for(c=a.length;a[c-1]>s;c--);a=a.slice(l,c)}return a},a.tickFormat=function(t,e){if(!arguments.length)return _s;arguments.length<2?e=_s:"function"!=typeof e&&(e=sa.format(e));var r=Math.max(1,n*t/a.ticks().length);return function(t){var a=t/o(Math.round(i(t)));return a*n<n-.5&&(a*=n),a<=r?e(t):""}},a.copy=function(){return ro(t.copy(),n,e,r)},Xi(a,t)}function io(t,n,e){function r(n){return t(i(n))}var i=oo(n),o=oo(1/n);return r.invert=function(n){return o(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain((e=n.map(Number)).map(i)),r):e},r.ticks=function(t){return Qi(e,t)},r.tickFormat=function(t,n){return to(e,t,n)},r.nice=function(t){return r.domain(Ji(e,t))},r.exponent=function(a){return arguments.length?(i=oo(n=a),o=oo(1/n),t.domain(e.map(i)),r):n},r.copy=function(){return io(t.copy(),n,e)},Xi(r,t)}function oo(t){return function(n){return n<0?-Math.pow(-n,t):Math.pow(n,t)}}function ao(t,n){function e(e){return o[((i.get(e)||("range"===n.t?i.set(e,t.push(e)):NaN))-1)%o.length]}function r(n,e){return sa.range(t.length).map(function(t){return n+e*t})}var i,o,a;return e.domain=function(r){if(!arguments.length)return t;t=[],i=new l;for(var o,a=-1,u=r.length;++a<u;)i.has(o=r[a])||i.set(o,t.push(o));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(o=t,a=0,n={t:"range",a:arguments},e):o},e.rangePoints=function(i,u){arguments.length<2&&(u=0);var s=i[0],l=i[1],c=t.length<2?(s=(s+l)/2,0):(l-s)/(t.length-1+u);return o=r(s+c*u/2,c),a=0,n={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(i,u){arguments.length<2&&(u=0);var s=i[0],l=i[1],c=t.length<2?(s=l=Math.round((s+l)/2),0):(l-s)/(t.length-1+u)|0;return o=r(s+Math.round(c*u/2+(l-s-(t.length-1+u)*c)/2),c),a=0,n={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(i,u,s){arguments.length<2&&(u=0),arguments.length<3&&(s=u);var l=i[1]<i[0],c=i[l-0],f=i[1-l],h=(f-c)/(t.length-u+2*s);return o=r(c+h*s,h),l&&o.reverse(),a=h*(1-u),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,u,s){arguments.length<2&&(u=0),arguments.length<3&&(s=u);var l=i[1]<i[0],c=i[l-0],f=i[1-l],h=Math.floor((f-c)/(t.length-u+2*s));return o=r(c+Math.round((f-c-(t.length-u)*h)/2),h),l&&o.reverse(),a=Math.round(h*(1-u)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Bi(n.a[0])},e.copy=function(){return ao(t,n)},e.domain(t)}function uo(t,n){function o(){var e=0,r=n.length;for(u=[];++e<r;)u[e-1]=sa.quantile(t,e/r);return a}function a(t){if(!isNaN(t=+t))return n[sa.bisect(u,t)]}var u;return a.domain=function(n){return arguments.length?(t=n.map(r).filter(i).sort(e),o()):t},a.range=function(t){return arguments.length?(n=t,o()):n},a.quantiles=function(){return u},a.invertExtent=function(e){return e=n.indexOf(e),e<0?[NaN,NaN]:[e>0?u[e-1]:t[0],e<u.length?u[e]:t[t.length-1]]},a.copy=function(){return uo(t,n)},o()}function so(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(o*(n-t))))]}function i(){return o=e.length/(n-t),a=e.length-1,r}var o,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],i()):[t,n]},r.range=function(t){return arguments.length?(e=t,i()):e},r.invertExtent=function(n){return n=e.indexOf(n),n=n<0?NaN:n/o+t,[n,n+1/o]},r.copy=function(){return so(t,n,e)},i()}function lo(t,n){function e(e){if(e<=e)return n[sa.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.invertExtent=function(e){return e=n.indexOf(e),[t[e-1],t[e]]},e.copy=function(){return lo(t,n)},e}function co(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Qi(t,n)},n.tickFormat=function(n,e){return to(t,n,e)},n.copy=function(){return co(t)},n}function fo(){return 0}function ho(t){return t.innerRadius}function po(t){return t.outerRadius}function vo(t){return t.startAngle}function go(t){return t.endAngle}function mo(t){return t&&t.padAngle}function yo(t,n,e,r){return(t-e)*n-(n-r)*t>0?0:1}function $o(t,n,e,r,i){var o=t[0]-n[0],a=t[1]-n[1],u=(i?r:-r)/Math.sqrt(o*o+a*a),s=u*a,l=-u*o,c=t[0]+s,f=t[1]+l,h=n[0]+s,p=n[1]+l,d=(c+h)/2,v=(f+p)/2,g=h-c,m=p-f,y=g*g+m*m,$=e-r,b=c*p-h*f,x=(m<0?-1:1)*Math.sqrt(Math.max(0,$*$*y-b*b)),w=(b*m-g*x)/y,C=(-b*g-m*x)/y,S=(b*m+g*x)/y,M=(-b*g+m*x)/y,_=w-d,k=C-v,A=S-d,E=M-v;return _*_+k*k>A*A+E*E&&(w=S,C=M),[[w-s,C-l],[w*e/$,C*e/$]]}function bo(t){function n(n){function a(){l.push("M",o(t(c),u))}for(var s,l=[],c=[],f=-1,h=n.length,p=_t(e),d=_t(r);++f<h;)i.call(this,s=n[f],f)?c.push([+p.call(this,s,f),+d.call(this,s,f)]):c.length&&(a(),c=[]);return c.length&&a(),l.length?l.join(""):null}var e=Ee,r=Pe,i=Pn,o=xo,a=o.key,u=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(i=t,n):i},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?o=t:(o=Ls.get(t)||xo).key,n):a},n.tension=function(t){return arguments.length?(u=t,n):u},n}function xo(t){return t.length>1?t.join("L"):t+"Z"}function wo(t){return t.join("L")+"Z"}function Co(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("H",(r[0]+(r=t[n])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function So(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("V",(r=t[n])[1],"H",r[0]);return i.join("")}function Mo(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("H",(r=t[n])[0],"V",r[1]);return i.join("")}function _o(t,n){return t.length<4?xo(t):t[1]+Eo(t.slice(1,-1),Po(t,n))}function ko(t,n){return t.length<3?wo(t):t[0]+Eo((t.push(t[0]),t),Po([t[t.length-2]].concat(t,[t[1]]),n))}function Ao(t,n){return t.length<3?xo(t):t[0]+Eo(t,Po(t,n))}function Eo(t,n){if(n.length<1||t.length!=n.length&&t.length!=n.length+2)return xo(t);var e=t.length!=n.length,r="",i=t[0],o=t[1],a=n[0],u=a,s=1;if(e&&(r+="Q"+(o[0]-2*a[0]/3)+","+(o[1]-2*a[1]/3)+","+o[0]+","+o[1],i=t[1],s=2),n.length>1){u=n[1],o=t[s],s++,r+="C"+(i[0]+a[0])+","+(i[1]+a[1])+","+(o[0]-u[0])+","+(o[1]-u[1])+","+o[0]+","+o[1];for(var l=2;l<n.length;l++,s++)o=t[s],u=n[l],r+="S"+(o[0]-u[0])+","+(o[1]-u[1])+","+o[0]+","+o[1]}if(e){var c=t[s];r+="Q"+(o[0]+2*u[0]/3)+","+(o[1]+2*u[1]/3)+","+c[0]+","+c[1]}return r}function Po(t,n){for(var e,r=[],i=(1-n)/2,o=t[0],a=t[1],u=1,s=t.length;++u<s;)e=o,o=a,a=t[u],r.push([i*(a[0]-e[0]),i*(a[1]-e[1])]);return r}function Oo(t){if(t.length<3)return xo(t);var n=1,e=t.length,r=t[0],i=r[0],o=r[1],a=[i,i,i,(r=t[1])[0]],u=[o,o,o,r[1]],s=[i,",",o,"L",jo(Rs,a),",",jo(Rs,u)];for(t.push(t[e-1]);++n<=e;)r=t[n],a.shift(),a.push(r[0]),u.shift(),u.push(r[1]),Ro(s,a,u);return t.pop(),s.push("L",r),s.join("")}function To(t){if(t.length<4)return xo(t);for(var n,e=[],r=-1,i=t.length,o=[0],a=[0];++r<3;)n=t[r],o.push(n[0]),a.push(n[1]);for(e.push(jo(Rs,o)+","+jo(Rs,a)),--r;++r<i;)n=t[r],o.shift(),o.push(n[0]),a.shift(),a.push(n[1]),Ro(e,o,a);return e.join("")}function Lo(t){for(var n,e,r=-1,i=t.length,o=i+4,a=[],u=[];++r<4;)e=t[r%i],a.push(e[0]),u.push(e[1]);for(n=[jo(Rs,a),",",jo(Rs,u)],--r;++r<o;)e=t[r%i],a.shift(),a.push(e[0]),u.shift(),u.push(e[1]),Ro(n,a,u);return n.join("")}function No(t,n){var e=t.length-1;if(e)for(var r,i,o=t[0][0],a=t[0][1],u=t[e][0]-o,s=t[e][1]-a,l=-1;++l<=e;)r=t[l],i=l/e,r[0]=n*r[0]+(1-n)*(o+i*u),r[1]=n*r[1]+(1-n)*(a+i*s);return Oo(t)}function jo(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ro(t,n,e){t.push("C",jo(Ns,n),",",jo(Ns,e),",",jo(js,n),",",jo(js,e),",",jo(Rs,n),",",jo(Rs,e))}function Do(t,n){return(n[1]-t[1])/(n[0]-t[0])}function Fo(t){for(var n=0,e=t.length-1,r=[],i=t[0],o=t[1],a=r[0]=Do(i,o);++n<e;)r[n]=(a+(a=Do(i=o,o=t[n+1])))/2;return r[n]=a,r}function Io(t){for(var n,e,r,i,o=[],a=Fo(t),u=-1,s=t.length-1;++u<s;)n=Do(t[u],t[u+1]),ba(n)<Da?a[u]=a[u+1]=0:(e=a[u]/n,r=a[u+1]/n,i=e*e+r*r,i>9&&(i=3*n/Math.sqrt(i),a[u]=i*e,a[u+1]=i*r));for(u=-1;++u<=s;)i=(t[Math.min(s,u+1)][0]-t[Math.max(0,u-1)][0])/(6*(1+a[u]*a[u])),o.push([i||0,a[u]*i||0]);return o}function Vo(t){return t.length<3?xo(t):t[0]+Eo(t,Io(t))}function qo(t){for(var n,e,r,i=-1,o=t.length;++i<o;)n=t[i],e=n[0],r=n[1]-za,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function zo(t){function n(n){function s(){v.push("M",u(t(m),f),c,l(t(g.reverse()),f),"Z")}for(var h,p,d,v=[],g=[],m=[],y=-1,$=n.length,b=_t(e),x=_t(i),w=e===r?function(){return p}:_t(r),C=i===o?function(){return d}:_t(o);++y<$;)a.call(this,h=n[y],y)?(g.push([p=+b.call(this,h,y),d=+x.call(this,h,y)]),m.push([+w.call(this,h,y),+C.call(this,h,y)])):g.length&&(s(),g=[],m=[]);return g.length&&s(),v.length?v.join(""):null}var e=Ee,r=Ee,i=0,o=Pe,a=Pn,u=xo,s=u.key,l=u,c="L",f=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(i=o=t,n):o},n.y0=function(t){return arguments.length?(i=t,n):i},n.y1=function(t){return arguments.length?(o=t,n):o},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(s="function"==typeof t?u=t:(u=Ls.get(t)||xo).key,l=u.reverse||u,c=u.closed?"M":"L",n):s},n.tension=function(t){return arguments.length?(f=t,n):f},n}function Bo(t){return t.radius}function Uo(t){return[t.x,t.y]}function Wo(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]-za;return[e*Math.cos(r),e*Math.sin(r)]}}function Ho(){return 64}function Yo(){return"circle"}function Go(t){var n=Math.sqrt(t/Ia);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Zo(t){return function(){var n,e,r;(n=this[t])&&(r=n[e=n.active])&&(r.timer.c=null,r.timer.t=NaN,--n.count?delete n[e]:delete this[t],n.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Xo(t,n,e){return Ma(t,Bs),t.namespace=n,t.id=e,t}function Jo(t,n,e,r){var i=t.id,o=t.namespace;return B(t,"function"==typeof e?function(t,a,u){t[o][i].tween.set(n,r(e.call(t,t.__data__,a,u)))}:(e=r(e),function(t){t[o][i].tween.set(n,e)}))}function Ko(t){return null==t&&(t=""),function(){this.textContent=t}}function Qo(t){return null==t?"__transition__":"__transition_"+t+"__"}function ta(t,n,e,r,i){function o(t){var n=v.delay;return c.t=n+s,n<=t?a(t-n):void(c.c=a)}function a(e){var i=d.active,o=d[i];o&&(o.timer.c=null,o.timer.t=NaN,--d.count,delete d[i],o.event&&o.event.interrupt.call(t,t.__data__,o.index));for(var a in d)if(+a<r){var l=d[a];l.timer.c=null,l.timer.t=NaN,--d.count,delete d[a]}c.c=u,Ot(function(){return c.c&&u(e||1)&&(c.c=null,c.t=NaN),1},0,s),d.active=r,v.event&&v.event.start.call(t,t.__data__,n),p=[],v.tween.forEach(function(e,r){(r=r.call(t,t.__data__,n))&&p.push(r)}),h=v.ease,f=v.duration}function u(i){for(var o=i/f,a=h(o),u=p.length;u>0;)p[--u].call(t,a);if(o>=1)return v.event&&v.event.end.call(t,t.__data__,n),--d.count?delete d[r]:delete t[e],1}var s,c,f,h,p,d=t[e]||(t[e]={active:0,count:0}),v=d[r];v||(s=i.time,c=Ot(o,0,s),v=d[r]={tween:new l,time:s,timer:c,delay:i.delay,duration:i.duration,ease:i.ease,index:n},i=null,++d.count)}function na(t,n,e){t.attr("transform",function(t){var r=n(t);return"translate("+(isFinite(r)?r:e(t))+",0)"})}function ea(t,n,e){t.attr("transform",function(t){var r=n(t);return"translate(0,"+(isFinite(r)?r:e(t))+")"})}function ra(t){return t.toISOString()}function ia(t,n,e){function r(n){return t(n)}function i(t,e){var r=t[1]-t[0],i=r/e,o=sa.bisect(Ks,i);return o==Ks.length?[n.year,Ki(t.map(function(t){return t/31536e6}),e)[2]]:o?n[i/Ks[o-1]<Ks[o]/i?o-1:o]:[nl,Ki(t,e)[2]]}return r.invert=function(n){return oa(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(oa)},r.nice=function(t,n){function e(e){return!isNaN(e)&&!t.range(e,oa(+e+1),n).length}var o=r.domain(),a=Bi(o),u=null==t?i(a,10):"number"==typeof t&&i(a,t);return u&&(t=u[0],n=u[1]),r.domain(Hi(o,n>1?{floor:function(n){for(;e(n=t.floor(n));)n=oa(n-1);return n},ceil:function(n){for(;e(n=t.ceil(n));)n=oa(+n+1);return n}}:t))},r.ticks=function(t,n){var e=Bi(r.domain()),o=null==t?i(e,10):"number"==typeof t?i(e,t):!t.range&&[{range:t},n];return o&&(t=o[0],n=o[1]),t.range(e[0],oa(+e[1]+1),n<1?1:n)},r.tickFormat=function(){return e},r.copy=function(){return ia(t.copy(),n,e)},Xi(r,t)}function oa(t){return new Date(t)}function aa(t){return JSON.parse(t.responseText)}function ua(t){var n=fa.createRange();return n.selectNode(fa.body),n.createContextualFragment(t.responseText)}var sa={version:"3.5.17"},la=[].slice,ca=function(t){return la.call(t)},fa=this.document;if(fa)try{ca(fa.documentElement.childNodes)[0].nodeType}catch(ha){ca=function(t){for(var n=t.length,e=new Array(n);n--;)e[n]=t[n];return e}}if(Date.now||(Date.now=function(){return+new Date}),fa)try{fa.createElement("DIV").style.setProperty("opacity",0,"")}catch(pa){var da=this.Element.prototype,va=da.setAttribute,ga=da.setAttributeNS,ma=this.CSSStyleDeclaration.prototype,ya=ma.setProperty;da.setAttribute=function(t,n){va.call(this,t,n+"")},da.setAttributeNS=function(t,n,e){ga.call(this,t,n,e+"")},ma.setProperty=function(t,n,e){ya.call(this,t,n+"",e)}}sa.ascending=e,sa.descending=function(t,n){return n<t?-1:n>t?1:n>=t?0:NaN},sa.min=function(t,n){var e,r,i=-1,o=t.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=t[i])&&r>=r){e=r;break}for(;++i<o;)null!=(r=t[i])&&e>r&&(e=r)}else{for(;++i<o;)if(null!=(r=n.call(t,t[i],i))&&r>=r){e=r;break}for(;++i<o;)null!=(r=n.call(t,t[i],i))&&e>r&&(e=r)}return e},sa.max=function(t,n){var e,r,i=-1,o=t.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=t[i])&&r>=r){e=r;break}for(;++i<o;)null!=(r=t[i])&&r>e&&(e=r)}else{for(;++i<o;)if(null!=(r=n.call(t,t[i],i))&&r>=r){e=r;break}for(;++i<o;)null!=(r=n.call(t,t[i],i))&&r>e&&(e=r)}return e},sa.extent=function(t,n){var e,r,i,o=-1,a=t.length;if(1===arguments.length){for(;++o<a;)if(null!=(r=t[o])&&r>=r){e=i=r;break}for(;++o<a;)null!=(r=t[o])&&(e>r&&(e=r),i<r&&(i=r))}else{for(;++o<a;)if(null!=(r=n.call(t,t[o],o))&&r>=r){e=i=r;break}for(;++o<a;)null!=(r=n.call(t,t[o],o))&&(e>r&&(e=r),i<r&&(i=r))}return[e,i]},sa.sum=function(t,n){var e,r=0,o=t.length,a=-1;if(1===arguments.length)for(;++a<o;)i(e=+t[a])&&(r+=e);else for(;++a<o;)i(e=+n.call(t,t[a],a))&&(r+=e);return r},sa.mean=function(t,n){var e,o=0,a=t.length,u=-1,s=a;if(1===arguments.length)for(;++u<a;)i(e=r(t[u]))?o+=e:--s;else for(;++u<a;)i(e=r(n.call(t,t[u],u)))?o+=e:--s;if(s)return o/s},sa.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),i=+t[r-1],o=e-r;return o?i+o*(t[r]-i):i},sa.median=function(t,n){var o,a=[],u=t.length,s=-1;if(1===arguments.length)for(;++s<u;)i(o=r(t[s]))&&a.push(o);else for(;++s<u;)i(o=r(n.call(t,t[s],s)))&&a.push(o);if(a.length)return sa.quantile(a.sort(e),.5)},sa.variance=function(t,n){var e,o,a=t.length,u=0,s=0,l=-1,c=0;if(1===arguments.length)for(;++l<a;)i(e=r(t[l]))&&(o=e-u,u+=o/++c,s+=o*(e-u));else for(;++l<a;)i(e=r(n.call(t,t[l],l)))&&(o=e-u,u+=o/++c,s+=o*(e-u));if(c>1)return s/(c-1)},sa.deviation=function(){var t=sa.variance.apply(this,arguments);return t?Math.sqrt(t):t};var $a=o(e);sa.bisectLeft=$a.left,sa.bisect=sa.bisectRight=$a.right,sa.bisector=function(t){return o(1===t.length?function(n,r){return e(t(n),r)}:t)},sa.shuffle=function(t,n,e){(o=arguments.length)<3&&(e=t.length,o<2&&(n=0));for(var r,i,o=e-n;o;)i=Math.random()*o--|0,r=t[o+n],t[o+n]=t[i+n],t[i+n]=r;return t},sa.permute=function(t,n){for(var e=n.length,r=new Array(e);e--;)r[e]=t[n[e]];return r},sa.pairs=function(t){for(var n,e=0,r=t.length-1,i=t[0],o=new Array(r<0?0:r);e<r;)o[e]=[n=i,i=t[++e]];return o},sa.transpose=function(t){if(!(i=t.length))return[];for(var n=-1,e=sa.min(t,a),r=new Array(e);++n<e;)for(var i,o=-1,u=r[n]=new Array(i);++o<i;)u[o]=t[o][n];return r},sa.zip=function(){return sa.transpose(arguments)},sa.keys=function(t){var n=[];for(var e in t)n.push(e);return n},sa.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},sa.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},sa.merge=function(t){for(var n,e,r,i=t.length,o=-1,a=0;++o<i;)a+=t[o].length;for(e=new Array(a);--i>=0;)for(r=t[i],n=r.length;--n>=0;)e[--a]=r[n];return e};var ba=Math.abs;sa.range=function(t,n,e){if(arguments.length<3&&(e=1,arguments.length<2&&(n=t,t=0)),(n-t)/e===1/0)throw new Error("infinite range");var r,i=[],o=u(ba(e)),a=-1;if(t*=o,n*=o,e*=o,e<0)for(;(r=t+e*++a)>n;)i.push(r/o);else for(;(r=t+e*++a)<n;)i.push(r/o);return i},sa.map=function(t,n){var e=new l;if(t instanceof l)t.forEach(function(t,n){e.set(t,n)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(1===arguments.length)for(;++i<o;)e.set(i,t[i]);else for(;++i<o;)e.set(n.call(t,r=t[i],i),r)}else for(var a in t)e.set(a,t[a]);return e};var xa="__proto__",wa="\0";s(l,{has:h,get:function(t){return this._[c(t)]},set:function(t,n){return this._[c(t)]=n},remove:p,keys:d,values:function(){var t=[];for(var n in this._)t.push(this._[n]);return t},entries:function(){var t=[];for(var n in this._)t.push({key:f(n),value:this._[n]});return t},size:v,empty:g,forEach:function(t){for(var n in this._)t.call(this,f(n),this._[n])}}),sa.nest=function(){function t(n,a,u){if(u>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,c,f,h,p=-1,d=a.length,v=o[u++],g=new l;++p<d;)(h=g.get(s=v(c=a[p])))?h.push(c):g.set(s,[c]);return n?(c=n(),f=function(e,r){c.set(e,t(n,r,u))}):(c={},f=function(e,r){c[e]=t(n,r,u)}),g.forEach(f),c}function n(t,e){if(e>=o.length)return t;var r=[],i=a[e++];return t.forEach(function(t,i){r.push({key:t,values:n(i,e)})}),i?r.sort(function(t,n){return i(t.key,n.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(n,e){return t(e,n,0)},i.entries=function(e){return n(t(sa.map,e,0),0)},i.key=function(t){return o.push(t),i},i.sortKeys=function(t){return a[o.length-1]=t,i},i.sortValues=function(t){return e=t,i},i.rollup=function(t){return r=t,i},i},sa.set=function(t){var n=new m;if(t)for(var e=0,r=t.length;e<r;++e)n.add(t[e]);return n},s(m,{has:h,add:function(t){return this._[c(t+="")]=!0,t},remove:p,values:d,size:v,empty:g,forEach:function(t){for(var n in this._)t.call(this,f(n))}}),sa.behavior={},sa.rebind=function(t,n){for(var e,r=1,i=arguments.length;++r<i;)t[e=arguments[r]]=$(t,n,n[e]);return t};var Ca=["webkit","ms","moz","Moz","o","O"];sa.dispatch=function(){for(var t=new w,n=-1,e=arguments.length;++n<e;)t[arguments[n]]=C(t);return t},w.prototype.on=function(t,n){var e=t.indexOf("."),r="";if(e>=0&&(r=t.slice(e+1),t=t.slice(0,e)),t)return arguments.length<2?this[t].on(r):this[t].on(r,n);if(2===arguments.length){if(null==n)for(t in this)this.hasOwnProperty(t)&&this[t].on(r,null);return this}},sa.event=null,sa.requote=function(t){return t.replace(Sa,"\\$&")};var Sa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Ma={}.__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]},_a=function(t,n){return n.querySelector(t)},ka=function(t,n){return n.querySelectorAll(t)},Aa=function(t,n){var e=t.matches||t[b(t,"matchesSelector")];return(Aa=function(t,n){return e.call(t,n)})(t,n)};"function"==typeof Sizzle&&(_a=function(t,n){return Sizzle(t,n)[0]||null},ka=Sizzle,Aa=Sizzle.matchesSelector),sa.selection=function(){return sa.select(fa.documentElement)};var Ea=sa.selection.prototype=[];Ea.select=function(t){var n,e,r,i,o=[];t=A(t);for(var a=-1,u=this.length;++a<u;){o.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var s=-1,l=r.length;++s<l;)(i=r[s])?(n.push(e=t.call(i,i.__data__,s,a)),e&&"__data__"in i&&(e.__data__=i.__data__)):n.push(null)}return k(o)},Ea.selectAll=function(t){var n,e,r=[];t=E(t);for(var i=-1,o=this.length;++i<o;)for(var a=this[i],u=-1,s=a.length;++u<s;)(e=a[u])&&(r.push(n=ca(t.call(e,e.__data__,u,i))),n.parentNode=e);return k(r)};var Pa="http://www.w3.org/1999/xhtml",Oa={svg:"http://www.w3.org/2000/svg",xhtml:Pa,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};sa.ns={prefix:Oa,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Oa.hasOwnProperty(e)?{space:Oa[e],local:t}:t}},Ea.attr=function(t,n){if(arguments.length<2){if("string"==typeof t){var e=this.node();return t=sa.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(P(n,t[n]));return this}return this.each(P(t,n))},Ea.classed=function(t,n){if(arguments.length<2){if("string"==typeof t){var e=this.node(),r=(t=L(t)).length,i=-1;if(n=e.classList){for(;++i<r;)if(!n.contains(t[i]))return!1}else for(n=e.getAttribute("class");++i<r;)if(!T(t[i]).test(n))return!1;return!0}for(n in t)this.each(N(n,t[n]));return this}return this.each(N(t,n))},Ea.style=function(t,e,r){var i=arguments.length;if(i<3){if("string"!=typeof t){i<2&&(e="");for(r in t)this.each(R(r,t[r],e));return this}if(i<2){var o=this.node();return n(o).getComputedStyle(o,null).getPropertyValue(t)}r=""}return this.each(R(t,e,r))},Ea.property=function(t,n){if(arguments.length<2){if("string"==typeof t)return this.node()[t];for(n in t)this.each(D(n,t[n]));return this}return this.each(D(t,n))},Ea.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Ea.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Ea.append=function(t){return t=F(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Ea.insert=function(t,n){return t=F(t),n=A(n),this.select(function(){return this.insertBefore(t.apply(this,arguments),n.apply(this,arguments)||null)})},Ea.remove=function(){return this.each(I)},Ea.data=function(t,n){function e(t,e){var r,i,o,a=t.length,f=e.length,h=Math.min(a,f),p=new Array(f),d=new Array(f),v=new Array(a);if(n){var g,m=new l,y=new Array(a);for(r=-1;++r<a;)(i=t[r])&&(m.has(g=n.call(i,i.__data__,r))?v[r]=i:m.set(g,i),y[r]=g);for(r=-1;++r<f;)(i=m.get(g=n.call(e,o=e[r],r)))?i!==!0&&(p[r]=i,i.__data__=o):d[r]=V(o),m.set(g,!0);for(r=-1;++r<a;)r in y&&m.get(y[r])!==!0&&(v[r]=t[r])}else{for(r=-1;++r<h;)i=t[r],o=e[r],i?(i.__data__=o,p[r]=i):d[r]=V(o);for(;r<f;++r)d[r]=V(e[r]);for(;r<a;++r)v[r]=t[r]}d.update=p,d.parentNode=p.parentNode=v.parentNode=t.parentNode,u.push(d),s.push(p),c.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(t=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(t[o]=i.__data__);return t}var u=U([]),s=k([]),c=k([]);if("function"==typeof t)for(;++o<a;)e(r=this[o],t.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],t);return s.enter=function(){return u},s.exit=function(){return c},s},Ea.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Ea.filter=function(t){var n,e,r,i=[];"function"!=typeof t&&(t=q(t));for(var o=0,a=this.length;o<a;o++){i.push(n=[]),n.parentNode=(e=this[o]).parentNode;for(var u=0,s=e.length;u<s;u++)(r=e[u])&&t.call(r,r.__data__,u,o)&&n.push(r)}return k(i)},Ea.order=function(){for(var t=-1,n=this.length;++t<n;)for(var e,r=this[t],i=r.length-1,o=r[i];--i>=0;)(e=r[i])&&(o&&o!==e.nextSibling&&o.parentNode.insertBefore(e,o),o=e);return this},Ea.sort=function(t){t=z.apply(this,arguments);for(var n=-1,e=this.length;++n<e;)this[n].sort(t);return this.order()},Ea.each=function(t){return B(this,function(n,e,r){t.call(n,n.__data__,e,r)})},Ea.call=function(t){var n=ca(arguments);return t.apply(n[0]=this,n),this},Ea.empty=function(){return!this.node()},Ea.node=function(){for(var t=0,n=this.length;t<n;t++)for(var e=this[t],r=0,i=e.length;r<i;r++){var o=e[r];if(o)return o}return null},Ea.size=function(){var t=0;return B(this,function(){++t}),t};var Ta=[];sa.selection.enter=U,sa.selection.enter.prototype=Ta,Ta.append=Ea.append,Ta.empty=Ea.empty,Ta.node=Ea.node,Ta.call=Ea.call,Ta.size=Ea.size,Ta.select=function(t){for(var n,e,r,i,o,a=[],u=-1,s=this.length;++u<s;){r=(i=this[u]).update,a.push(n=[]),n.parentNode=i.parentNode;for(var l=-1,c=i.length;++l<c;)(o=i[l])?(n.push(r[l]=e=t.call(i.parentNode,o.__data__,l,u)),e.__data__=o.__data__):n.push(null)}return k(a)},Ta.insert=function(t,n){return arguments.length<2&&(n=W(this)),Ea.insert.call(this,t,n)},sa.select=function(n){var e;return"string"==typeof n?(e=[_a(n,fa)],e.parentNode=fa.documentElement):(e=[n],e.parentNode=t(n)),k([e])},sa.selectAll=function(t){var n;return"string"==typeof t?(n=ca(ka(t,fa)),n.parentNode=fa.documentElement):(n=ca(t),n.parentNode=null),k([n])},Ea.on=function(t,n,e){var r=arguments.length;if(r<3){if("string"!=typeof t){r<2&&(n=!1);for(e in t)this.each(H(e,t[e],n));return this}if(r<2)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(H(t,n,e))};var La=sa.map({mouseenter:"mouseover",mouseleave:"mouseout"});fa&&La.forEach(function(t){"on"+t in fa&&La.remove(t)});var Na,ja=0;sa.mouse=function(t){return X(t,M())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;sa.touch=function(t,n,e){if(arguments.length<3&&(e=n,n=M().changedTouches),n)for(var r,i=0,o=n.length;i<o;++i)if((r=n[i]).identifier===e)return X(t,r)},sa.behavior.drag=function(){function t(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function e(t,n,e,o,a){return function(){function u(){var t,e,r=n(h,v);r&&(t=r[0]-$[0],e=r[1]-$[1],d|=t|e,$=r,p({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:t,dy:e}))}function s(){n(h,v)&&(m.on(o+g,null).on(a+g,null),y(d),p({type:"dragend"}))}var l,c=this,f=sa.event.target.correspondingElement||sa.event.target,h=c.parentNode,p=r.of(c,arguments),d=0,v=t(),g=".drag"+(null==v?"":"-"+v),m=sa.select(e(f)).on(o+g,u).on(a+g,s),y=Z(f),$=n(h,v);i?(l=i.apply(c,arguments),l=[l.x-$[0],l.y-$[1]]):l=[0,0],p({type:"dragstart"})}}var r=_(t,"drag","dragstart","dragend"),i=null,o=e(x,sa.mouse,n,"mousemove","mouseup"),a=e(J,sa.touch,y,"touchmove","touchend");return t.origin=function(n){return arguments.length?(i=n,t):i},sa.rebind(t,r,"on")},sa.touches=function(t,n){return arguments.length<2&&(n=M().touches),n?ca(n).map(function(n){var e=X(t,n);return e.identifier=n.identifier,e}):[]};var Da=1e-6,Fa=Da*Da,Ia=Math.PI,Va=2*Ia,qa=Va-Da,za=Ia/2,Ba=Ia/180,Ua=180/Ia,Wa=Math.SQRT2,Ha=2,Ya=4;sa.interpolateZoom=function(t,n){var e,r,i=t[0],o=t[1],a=t[2],u=n[0],s=n[1],l=n[2],c=u-i,f=s-o,h=c*c+f*f;if(h<Fa)r=Math.log(l/a)/Wa,e=function(t){return[i+t*c,o+t*f,a*Math.exp(Wa*t*r)]};else{var p=Math.sqrt(h),d=(l*l-a*a+Ya*h)/(2*a*Ha*p),v=(l*l-a*a-Ya*h)/(2*l*Ha*p),g=Math.log(Math.sqrt(d*d+1)-d),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-g)/Wa,e=function(t){var n=t*r,e=rt(g),u=a/(Ha*p)*(e*it(Wa*n+g)-et(g));return[i+u*c,o+u*f,a*e/rt(Wa*n+g)]}}return e.duration=1e3*r,e},sa.behavior.zoom=function(){function t(t){t.on(O,f).on(Za+".zoom",p).on("dblclick.zoom",d).on(N,h)}function e(t){return[(t[0]-M.x)/M.k,(t[1]-M.y)/M.k]}function r(t){return[t[0]*M.k+M.x,t[1]*M.k+M.y]}function i(t){M.k=Math.max(A[0],Math.min(A[1],t))}function o(t,n){n=r(n),M.x+=t[0]-n[0],M.y+=t[1]-n[1]}function a(n,e,r,a){n.__chart__={x:M.x,y:M.y,k:M.k},i(Math.pow(2,a)),o(g=e,r),n=sa.select(n),E>0&&(n=n.transition().duration(E)),n.call(t.event)}function u(){x&&x.domain(b.range().map(function(t){return(t-M.x)/M.k}).map(b.invert)),C&&C.domain(w.range().map(function(t){return(t-M.y)/M.k}).map(w.invert))}function s(t){P++||t({type:"zoomstart"})}function l(t){u(),t({type:"zoom",scale:M.k,translate:[M.x,M.y]})}function c(t){--P||(t({type:"zoomend"}),g=null)}function f(){function t(){u=1,o(sa.mouse(i),h),l(a)}function r(){f.on(T,null).on(L,null),p(u),c(a)}var i=this,a=j.of(i,arguments),u=0,f=sa.select(n(i)).on(T,t).on(L,r),h=e(sa.mouse(i)),p=Z(i);zs.call(i),s(a)}function h(){function t(){var t=sa.touches(d);return p=M.k,t.forEach(function(t){t.identifier in g&&(g[t.identifier]=e(t))}),t}function n(){var n=sa.event.target;sa.select(n).on(b,r).on(x,u),w.push(n);for(var e=sa.event.changedTouches,i=0,o=e.length;i<o;++i)g[e[i].identifier]=null;var s=t(),l=Date.now();if(1===s.length){if(l-$<500){var c=s[0];a(d,c,g[c.identifier],Math.floor(Math.log(M.k)/Math.LN2)+1),S()}$=l}else if(s.length>1){var c=s[0],f=s[1],h=c[0]-f[0],p=c[1]-f[1];m=h*h+p*p}}function r(){var t,n,e,r,a=sa.touches(d);zs.call(d);for(var u=0,s=a.length;u<s;++u,r=null)if(e=a[u],r=g[e.identifier]){if(n)break;t=e,n=r}if(r){var c=(c=e[0]-t[0])*c+(c=e[1]-t[1])*c,f=m&&Math.sqrt(c/m);t=[(t[0]+e[0])/2,(t[1]+e[1])/2],n=[(n[0]+r[0])/2,(n[1]+r[1])/2],i(f*p)}$=null,o(t,n),l(v)}function u(){if(sa.event.touches.length){for(var n=sa.event.changedTouches,e=0,r=n.length;e<r;++e)delete g[n[e].identifier];for(var i in g)return void t()}sa.selectAll(w).on(y,null),C.on(O,f).on(N,h),_(),c(v)}var p,d=this,v=j.of(d,arguments),g={},m=0,y=".zoom-"+sa.event.changedTouches[0].identifier,b="touchmove"+y,x="touchend"+y,w=[],C=sa.select(d),_=Z(d);n(),s(v),C.on(O,null).on(N,n)}function p(){var t=j.of(this,arguments);y?clearTimeout(y):(zs.call(this),v=e(g=m||sa.mouse(this)),s(t)),y=setTimeout(function(){y=null,c(t)},50),S(),i(Math.pow(2,.002*Ga())*M.k),o(g,v),l(t)}function d(){var t=sa.mouse(this),n=Math.log(M.k)/Math.LN2;a(this,t,e(t),sa.event.shiftKey?Math.ceil(n)-1:Math.floor(n)+1)}var v,g,m,y,$,b,x,w,C,M={x:0,y:0,k:1},k=[960,500],A=Xa,E=250,P=0,O="mousedown.zoom",T="mousemove.zoom",L="mouseup.zoom",N="touchstart.zoom",j=_(t,"zoomstart","zoom","zoomend");return Za||(Za="onwheel"in fa?(Ga=function(){return-sa.event.deltaY*(sa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fa?(Ga=function(){
-return sa.event.wheelDelta},"mousewheel"):(Ga=function(){return-sa.event.detail},"MozMousePixelScroll")),t.event=function(t){t.each(function(){var t=j.of(this,arguments),n=M;Vs?sa.select(this).transition().each("start.zoom",function(){M=this.__chart__||{x:0,y:0,k:1},s(t)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],i=g?g[0]:e/2,o=g?g[1]:r/2,a=sa.interpolateZoom([(i-M.x)/M.k,(o-M.y)/M.k,e/M.k],[(i-n.x)/n.k,(o-n.y)/n.k,e/n.k]);return function(n){var r=a(n),u=e/r[2];this.__chart__=M={x:i-r[0]*u,y:o-r[1]*u,k:u},l(t)}}).each("interrupt.zoom",function(){c(t)}).each("end.zoom",function(){c(t)}):(this.__chart__=M,s(t),l(t),c(t))})},t.translate=function(n){return arguments.length?(M={x:+n[0],y:+n[1],k:M.k},u(),t):[M.x,M.y]},t.scale=function(n){return arguments.length?(M={x:M.x,y:M.y,k:null},i(+n),u(),t):M.k},t.scaleExtent=function(n){return arguments.length?(A=null==n?Xa:[+n[0],+n[1]],t):A},t.center=function(n){return arguments.length?(m=n&&[+n[0],+n[1]],t):m},t.size=function(n){return arguments.length?(k=n&&[+n[0],+n[1]],t):k},t.duration=function(n){return arguments.length?(E=+n,t):E},t.x=function(n){return arguments.length?(x=n,b=n.copy(),M={x:0,y:0,k:1},t):x},t.y=function(n){return arguments.length?(C=n,w=n.copy(),M={x:0,y:0,k:1},t):C},sa.rebind(t,j,"on")};var Ga,Za,Xa=[0,1/0];sa.color=at,at.prototype.toString=function(){return this.rgb()+""},sa.hsl=ut;var Ja=ut.prototype=new at;Ja.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new ut(this.h,this.s,this.l/t)},Ja.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new ut(this.h,this.s,t*this.l)},Ja.rgb=function(){return st(this.h,this.s,this.l)},sa.hcl=lt;var Ka=lt.prototype=new at;Ka.brighter=function(t){return new lt(this.h,this.c,Math.min(100,this.l+Qa*(arguments.length?t:1)))},Ka.darker=function(t){return new lt(this.h,this.c,Math.max(0,this.l-Qa*(arguments.length?t:1)))},Ka.rgb=function(){return ct(this.h,this.c,this.l).rgb()},sa.lab=ft;var Qa=18,tu=.95047,nu=1,eu=1.08883,ru=ft.prototype=new at;ru.brighter=function(t){return new ft(Math.min(100,this.l+Qa*(arguments.length?t:1)),this.a,this.b)},ru.darker=function(t){return new ft(Math.max(0,this.l-Qa*(arguments.length?t:1)),this.a,this.b)},ru.rgb=function(){return ht(this.l,this.a,this.b)},sa.rgb=mt;var iu=mt.prototype=new at;iu.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,i=30;return n||e||r?(n&&n<i&&(n=i),e&&e<i&&(e=i),r&&r<i&&(r=i),new mt(Math.min(255,n/t),Math.min(255,e/t),Math.min(255,r/t))):new mt(i,i,i)},iu.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new mt(t*this.r,t*this.g,t*this.b)},iu.hsl=function(){return wt(this.r,this.g,this.b)},iu.toString=function(){return"#"+bt(this.r)+bt(this.g)+bt(this.b)};var ou=sa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ou.forEach(function(t,n){ou.set(t,yt(n))}),sa.functor=_t,sa.xhr=kt(y),sa.dsv=function(t,n){function e(t,e,o){arguments.length<3&&(o=e,e=null);var a=At(t,n,null==e?r:i(e),o);return a.row=function(t){return arguments.length?a.response(null==(e=t)?r:i(t)):e},a}function r(t){return e.parse(t.responseText)}function i(t){return function(n){return e.parse(n.responseText,t)}}function o(n){return n.map(a).join(t)}function a(t){return u.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var u=new RegExp('["'+t+"\n]"),s=t.charCodeAt(0);return e.parse=function(t,n){var r;return e.parseRows(t,function(t,e){if(r)return r(t,e-1);var i=new Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}");r=n?function(t,e){return n(i(t),e)}:i})},e.parseRows=function(t,n){function e(){if(c>=l)return a;if(i)return i=!1,o;var n=c;if(34===t.charCodeAt(n)){for(var e=n;e++<l;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}c=e+2;var r=t.charCodeAt(e+1);return 13===r?(i=!0,10===t.charCodeAt(e+2)&&++c):10===r&&(i=!0),t.slice(n+1,e).replace(/""/g,'"')}for(;c<l;){var r=t.charCodeAt(c++),u=1;if(10===r)i=!0;else if(13===r)i=!0,10===t.charCodeAt(c)&&(++c,++u);else if(r!==s)continue;return t.slice(n,c-u)}return t.slice(n)}for(var r,i,o={},a={},u=[],l=t.length,c=0,f=0;(r=e())!==a;){for(var h=[];r!==o&&r!==a;)h.push(r),r=e();n&&null==(h=n(h,f++))||u.push(h)}return u},e.format=function(n){if(Array.isArray(n[0]))return e.formatRows(n);var r=new m,i=[];return n.forEach(function(t){for(var n in t)r.has(n)||i.push(r.add(n))}),[i.map(a).join(t)].concat(n.map(function(n){return i.map(function(t){return a(n[t])}).join(t)})).join("\n")},e.formatRows=function(t){return t.map(o).join("\n")},e},sa.csv=sa.dsv(",","text/csv"),sa.tsv=sa.dsv("\t","text/tab-separated-values");var au,uu,su,lu,cu=this[b(this,"requestAnimationFrame")]||function(t){setTimeout(t,17)};sa.timer=function(){Ot.apply(this,arguments)},sa.timer.flush=function(){Lt(),Nt()},sa.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)};var fu=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(Rt);sa.formatPrefix=function(t,n){var e=0;return(t=+t)&&(t<0&&(t*=-1),n&&(t=sa.round(t,jt(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),fu[8+e/3]};var hu=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pu=sa.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return(t=sa.round(t,jt(t,n))).toFixed(Math.max(0,Math.min(20,jt(t*(1+1e-15),n))))}}),du=sa.time={},vu=Date;It.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){gu.setUTCDate.apply(this._,arguments)},setDay:function(){gu.setUTCDay.apply(this._,arguments)},setFullYear:function(){gu.setUTCFullYear.apply(this._,arguments)},setHours:function(){gu.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){gu.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){gu.setUTCMinutes.apply(this._,arguments)},setMonth:function(){gu.setUTCMonth.apply(this._,arguments)},setSeconds:function(){gu.setUTCSeconds.apply(this._,arguments)},setTime:function(){gu.setTime.apply(this._,arguments)}};var gu=Date.prototype;du.year=Vt(function(t){return t=du.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),du.years=du.year.range,du.years.utc=du.year.utc.range,du.day=Vt(function(t){var n=new vu(2e3,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),du.days=du.day.range,du.days.utc=du.day.utc.range,du.dayOfYear=function(t){var n=du.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(t,n){n=7-n;var e=du[t]=Vt(function(t){return(t=du.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=du.year(t).getDay();return Math.floor((du.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});du[t+"s"]=e.range,du[t+"s"].utc=e.utc.range,du[t+"OfYear"]=function(t){var e=du.year(t).getDay();return Math.floor((du.dayOfYear(t)+(e+n)%7)/7)}}),du.week=du.sunday,du.weeks=du.sunday.range,du.weeks.utc=du.sunday.utc.range,du.weekOfYear=du.sundayOfYear;var mu={"-":"",_:" ",0:"0"},yu=/^\s*\d+/,$u=/^%/;sa.locale=function(t){return{numberFormat:Dt(t),timeFormat:zt(t)}};var bu=sa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});sa.format=bu.numberFormat,sa.geo={},cn.prototype={s:0,t:0,add:function(t){fn(t,this.t,xu),fn(xu.s,this.s,this),this.s?this.t+=xu.t:this.s=xu.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xu=new cn;sa.geo.stream=function(t,n){t&&wu.hasOwnProperty(t.type)?wu[t.type](t,n):hn(t,n)};var wu={Feature:function(t,n){hn(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r<i;)hn(e[r].geometry,n)}},Cu={Sphere:function(t,n){n.sphere()},Point:function(t,n){t=t.coordinates,n.point(t[0],t[1],t[2])},MultiPoint:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)t=e[r],n.point(t[0],t[1],t[2])},LineString:function(t,n){pn(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)pn(e[r],n,0)},Polygon:function(t,n){dn(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)dn(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,i=e.length;++r<i;)hn(e[r],n)}};sa.geo.area=function(t){return Su=0,sa.geo.stream(t,_u),Su};var Su,Mu=new cn,_u={sphere:function(){Su+=4*Ia},point:x,lineStart:x,lineEnd:x,polygonStart:function(){Mu.reset(),_u.lineStart=vn},polygonEnd:function(){var t=2*Mu;Su+=t<0?4*Ia+t:t,_u.lineStart=_u.lineEnd=_u.point=x}};sa.geo.bounds=function(){function t(t,n){$.push(b=[c=t,h=t]),n<f&&(f=n),n>p&&(p=n)}function n(n,e){var r=gn([n*Ba,e*Ba]);if(m){var i=yn(m,r),o=[i[1],-i[0],0],a=yn(o,i);xn(a),a=wn(a);var s=n-d,l=s>0?1:-1,v=a[0]*Ua*l,g=ba(s)>180;if(g^(l*d<v&&v<l*n)){var y=a[1]*Ua;y>p&&(p=y)}else if(v=(v+360)%360-180,g^(l*d<v&&v<l*n)){var y=-a[1]*Ua;y<f&&(f=y)}else e<f&&(f=e),e>p&&(p=e);g?n<d?u(c,n)>u(c,h)&&(h=n):u(n,h)>u(c,h)&&(c=n):h>=c?(n<c&&(c=n),n>h&&(h=n)):n>d?u(c,n)>u(c,h)&&(h=n):u(n,h)>u(c,h)&&(c=n)}else t(n,e);m=r,d=n}function e(){x.point=n}function r(){b[0]=c,b[1]=h,x.point=t,m=null}function i(t,e){if(m){var r=t-d;y+=ba(r)>180?r+(r>0?360:-360):r}else v=t,g=e;_u.point(t,e),n(t,e)}function o(){_u.lineStart()}function a(){i(v,g),_u.lineEnd(),ba(y)>Da&&(c=-(h=180)),b[0]=c,b[1]=h,m=null}function u(t,n){return(n-=t)<0?n+360:n}function s(t,n){return t[0]-n[0]}function l(t,n){return n[0]<=n[1]?n[0]<=t&&t<=n[1]:t<n[0]||n[1]<t}var c,f,h,p,d,v,g,m,y,$,b,x={point:t,lineStart:e,lineEnd:r,polygonStart:function(){x.point=i,x.lineStart=o,x.lineEnd=a,y=0,_u.polygonStart()},polygonEnd:function(){_u.polygonEnd(),x.point=t,x.lineStart=e,x.lineEnd=r,Mu<0?(c=-(h=180),f=-(p=90)):y>Da?p=90:y<-Da&&(f=-90),b[0]=c,b[1]=h}};return function(t){p=h=-(c=f=1/0),$=[],sa.geo.stream(t,x);var n=$.length;if(n){$.sort(s);for(var e,r=1,i=$[0],o=[i];r<n;++r)e=$[r],l(e[0],i)||l(e[1],i)?(u(i[0],e[1])>u(i[0],i[1])&&(i[1]=e[1]),u(e[0],i[1])>u(i[0],i[1])&&(i[0]=e[0])):o.push(i=e);for(var a,e,d=-(1/0),n=o.length-1,r=0,i=o[n];r<=n;i=e,++r)e=o[r],(a=u(i[1],e[0]))>d&&(d=a,c=e[0],h=i[1])}return $=b=null,c===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[c,f],[h,p]]}}(),sa.geo.centroid=function(t){ku=Au=Eu=Pu=Ou=Tu=Lu=Nu=ju=Ru=Du=0,sa.geo.stream(t,Fu);var n=ju,e=Ru,r=Du,i=n*n+e*e+r*r;return i<Fa&&(n=Tu,e=Lu,r=Nu,Au<Da&&(n=Eu,e=Pu,r=Ou),i=n*n+e*e+r*r,i<Fa)?[NaN,NaN]:[Math.atan2(e,n)*Ua,nt(r/Math.sqrt(i))*Ua]};var ku,Au,Eu,Pu,Ou,Tu,Lu,Nu,ju,Ru,Du,Fu={sphere:x,point:Sn,lineStart:_n,lineEnd:kn,polygonStart:function(){Fu.lineStart=An},polygonEnd:function(){Fu.lineStart=_n}},Iu=Nn(Pn,Fn,Vn,[-Ia,-Ia/2]),Vu=1e9;sa.geo.clipExtent=function(){var t,n,e,r,i,o,a={stream:function(t){return i&&(i.valid=!1),i=o(t),i.valid=!0,i},extent:function(u){return arguments.length?(o=Un(t=+u[0][0],n=+u[0][1],e=+u[1][0],r=+u[1][1]),i&&(i.valid=!1,i=null),a):[[t,n],[e,r]]}};return a.extent([[0,0],[960,500]])},(sa.geo.conicEqualArea=function(){return Wn(Hn)}).raw=Hn,sa.geo.albers=function(){return sa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},sa.geo.albersUsa=function(){function t(t){var o=t[0],a=t[1];return n=null,e(o,a),n||(r(o,a),n)||i(o,a),n}var n,e,r,i,o=sa.geo.albers(),a=sa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),u=sa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),s={point:function(t,e){n=[t,e]}};return t.invert=function(t){var n=o.scale(),e=o.translate(),r=(t[0]-e[0])/n,i=(t[1]-e[1])/n;return(i>=.12&&i<.234&&r>=-.425&&r<-.214?a:i>=.166&&i<.234&&r>=-.214&&r<-.115?u:o).invert(t)},t.stream=function(t){var n=o.stream(t),e=a.stream(t),r=u.stream(t);return{point:function(t,i){n.point(t,i),e.point(t,i),r.point(t,i)},sphere:function(){n.sphere(),e.sphere(),r.sphere()},lineStart:function(){n.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){n.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){n.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){n.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},t.precision=function(n){return arguments.length?(o.precision(n),a.precision(n),u.precision(n),t):o.precision()},t.scale=function(n){return arguments.length?(o.scale(n),a.scale(.35*n),u.scale(n),t.translate(o.translate())):o.scale()},t.translate=function(n){if(!arguments.length)return o.translate();var l=o.scale(),c=+n[0],f=+n[1];return e=o.translate(n).clipExtent([[c-.455*l,f-.238*l],[c+.455*l,f+.238*l]]).stream(s).point,r=a.translate([c-.307*l,f+.201*l]).clipExtent([[c-.425*l+Da,f+.12*l+Da],[c-.214*l-Da,f+.234*l-Da]]).stream(s).point,i=u.translate([c-.205*l,f+.212*l]).clipExtent([[c-.214*l+Da,f+.166*l+Da],[c-.115*l-Da,f+.234*l-Da]]).stream(s).point,t},t.scale(1070)};var qu,zu,Bu,Uu,Wu,Hu,Yu={point:x,lineStart:x,lineEnd:x,polygonStart:function(){zu=0,Yu.lineStart=Yn},polygonEnd:function(){Yu.lineStart=Yu.lineEnd=Yu.point=x,qu+=ba(zu/2)}},Gu={point:Gn,lineStart:x,lineEnd:x,polygonStart:x,polygonEnd:x},Zu={point:Jn,lineStart:Kn,lineEnd:Qn,polygonStart:function(){Zu.lineStart=te},polygonEnd:function(){Zu.point=Jn,Zu.lineStart=Kn,Zu.lineEnd=Qn}};sa.geo.path=function(){function t(t){return t&&("function"==typeof u&&o.pointRadius(+u.apply(this,arguments)),a&&a.valid||(a=i(o)),sa.geo.stream(t,a)),o.result()}function n(){return a=null,t}var e,r,i,o,a,u=4.5;return t.area=function(t){return qu=0,sa.geo.stream(t,i(Yu)),qu},t.centroid=function(t){return Eu=Pu=Ou=Tu=Lu=Nu=ju=Ru=Du=0,sa.geo.stream(t,i(Zu)),Du?[ju/Du,Ru/Du]:Nu?[Tu/Nu,Lu/Nu]:Ou?[Eu/Ou,Pu/Ou]:[NaN,NaN]},t.bounds=function(t){return Wu=Hu=-(Bu=Uu=1/0),sa.geo.stream(t,i(Gu)),[[Bu,Uu],[Wu,Hu]]},t.projection=function(t){return arguments.length?(i=(e=t)?t.stream||re(t):y,n()):e},t.context=function(t){return arguments.length?(o=null==(r=t)?new Zn:new ne(t),"function"!=typeof u&&o.pointRadius(u),n()):r},t.pointRadius=function(n){return arguments.length?(u="function"==typeof n?n:(o.pointRadius(+n),+n),t):u},t.projection(sa.geo.albersUsa()).context(null)},sa.geo.transform=function(t){return{stream:function(n){var e=new ie(n);for(var r in t)e[r]=t[r];return e}}},ie.prototype={point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},sa.geo.projection=ae,sa.geo.projectionMutator=ue,(sa.geo.equirectangular=function(){return ae(le)}).raw=le.invert=le,sa.geo.rotation=function(t){function n(n){return n=t(n[0]*Ba,n[1]*Ba),n[0]*=Ua,n[1]*=Ua,n}return t=fe(t[0]%360*Ba,t[1]*Ba,t.length>2?t[2]*Ba:0),n.invert=function(n){return n=t.invert(n[0]*Ba,n[1]*Ba),n[0]*=Ua,n[1]*=Ua,n},n},ce.invert=le,sa.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=fe(-t[0]*Ba,-t[1]*Ba,0).invert,i=[];return e(null,null,1,{point:function(t,e){i.push(t=n(t,e)),t[0]*=Ua,t[1]*=Ua}}),{type:"Polygon",coordinates:[i]}}var n,e,r=[0,0],i=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=ve((n=+r)*Ba,i*Ba),t):n},t.precision=function(r){return arguments.length?(e=ve(n*Ba,(i=+r)*Ba),t):i},t.angle(90)},sa.geo.distance=function(t,n){var e,r=(n[0]-t[0])*Ba,i=t[1]*Ba,o=n[1]*Ba,a=Math.sin(r),u=Math.cos(r),s=Math.sin(i),l=Math.cos(i),c=Math.sin(o),f=Math.cos(o);return Math.atan2(Math.sqrt((e=f*a)*e+(e=l*c-s*f*u)*e),s*c+l*f*u)},sa.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return sa.range(Math.ceil(o/g)*g,i,g).map(h).concat(sa.range(Math.ceil(l/m)*m,s,m).map(p)).concat(sa.range(Math.ceil(r/d)*d,e,d).filter(function(t){return ba(t%g)>Da}).map(c)).concat(sa.range(Math.ceil(u/v)*v,a,v).filter(function(t){return ba(t%m)>Da}).map(f))}var e,r,i,o,a,u,s,l,c,f,h,p,d=10,v=d,g=90,m=360,y=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(p(s).slice(1),h(i).reverse().slice(1),p(l).reverse().slice(1))]}},t.extent=function(n){return arguments.length?t.majorExtent(n).minorExtent(n):t.minorExtent()},t.majorExtent=function(n){return arguments.length?(o=+n[0][0],i=+n[1][0],l=+n[0][1],s=+n[1][1],o>i&&(n=o,o=i,i=n),l>s&&(n=l,l=s,s=n),t.precision(y)):[[o,l],[i,s]]},t.minorExtent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],u=+n[0][1],a=+n[1][1],r>e&&(n=r,r=e,e=n),u>a&&(n=u,u=a,a=n),t.precision(y)):[[r,u],[e,a]]},t.step=function(n){return arguments.length?t.majorStep(n).minorStep(n):t.minorStep()},t.majorStep=function(n){return arguments.length?(g=+n[0],m=+n[1],t):[g,m]},t.minorStep=function(n){return arguments.length?(d=+n[0],v=+n[1],t):[d,v]},t.precision=function(n){return arguments.length?(y=+n,c=me(u,a,90),f=ye(r,e,y),h=me(l,s,90),p=ye(o,i,y),t):y},t.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},sa.geo.greatArc=function(){function t(){return{type:"LineString",coordinates:[n||r.apply(this,arguments),e||i.apply(this,arguments)]}}var n,e,r=$e,i=be;return t.distance=function(){return sa.geo.distance(n||r.apply(this,arguments),e||i.apply(this,arguments))},t.source=function(e){return arguments.length?(r=e,n="function"==typeof e?null:e,t):r},t.target=function(n){return arguments.length?(i=n,e="function"==typeof n?null:n,t):i},t.precision=function(){return arguments.length?t:0},t},sa.geo.interpolate=function(t,n){return xe(t[0]*Ba,t[1]*Ba,n[0]*Ba,n[1]*Ba)},sa.geo.length=function(t){return Xu=0,sa.geo.stream(t,Ju),Xu};var Xu,Ju={sphere:x,point:x,lineStart:we,lineEnd:x,polygonStart:x,polygonEnd:x},Ku=Ce(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(sa.geo.azimuthalEqualArea=function(){return ae(Ku)}).raw=Ku;var Qu=Ce(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},y);(sa.geo.azimuthalEquidistant=function(){return ae(Qu)}).raw=Qu,(sa.geo.conicConformal=function(){return Wn(Se)}).raw=Se,(sa.geo.conicEquidistant=function(){return Wn(Me)}).raw=Me;var ts=Ce(function(t){return 1/t},Math.atan);(sa.geo.gnomonic=function(){return ae(ts)}).raw=ts,_e.invert=function(t,n){return[t,2*Math.atan(Math.exp(n))-za]},(sa.geo.mercator=function(){return ke(_e)}).raw=_e;var ns=Ce(function(){return 1},Math.asin);(sa.geo.orthographic=function(){return ae(ns)}).raw=ns;var es=Ce(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(sa.geo.stereographic=function(){return ae(es)}).raw=es,Ae.invert=function(t,n){return[-n,2*Math.atan(Math.exp(t))-za]},(sa.geo.transverseMercator=function(){var t=ke(Ae),n=t.center,e=t.rotate;return t.center=function(t){return t?n([-t[1],t[0]]):(t=n(),[t[1],-t[0]])},t.rotate=function(t){return t?e([t[0],t[1],t.length>2?t[2]+90:90]):(t=e(),[t[0],t[1],t[2]-90])},e([0,0,90])}).raw=Ae,sa.geom={},sa.geom.hull=function(t){function n(t){if(t.length<3)return[];var n,i=_t(e),o=_t(r),a=t.length,u=[],s=[];for(n=0;n<a;n++)u.push([+i.call(this,t[n],n),+o.call(this,t[n],n),n]);for(u.sort(Te),n=0;n<a;n++)s.push([u[n][0],-u[n][1]]);var l=Oe(u),c=Oe(s),f=c[0]===l[0],h=c[c.length-1]===l[l.length-1],p=[];for(n=l.length-1;n>=0;--n)p.push(t[u[l[n]][2]]);for(n=+f;n<c.length-h;++n)p.push(t[u[c[n]][2]]);return p}var e=Ee,r=Pe;return arguments.length?n(t):(n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n)},sa.geom.polygon=function(t){return Ma(t,rs),t};var rs=sa.geom.polygon.prototype=[];rs.area=function(){for(var t,n=-1,e=this.length,r=this[e-1],i=0;++n<e;)t=r,r=this[n],i+=t[1]*r[0]-t[0]*r[1];return.5*i},rs.centroid=function(t){var n,e,r=-1,i=this.length,o=0,a=0,u=this[i-1];for(arguments.length||(t=-1/(6*this.area()));++r<i;)n=u,u=this[r],e=n[0]*u[1]-u[0]*n[1],o+=(n[0]+u[0])*e,a+=(n[1]+u[1])*e;return[o*t,a*t]},rs.clip=function(t){for(var n,e,r,i,o,a,u=je(t),s=-1,l=this.length-je(this),c=this[l-1];++s<l;){for(n=t.slice(),t.length=0,i=this[s],o=n[(r=n.length-u)-1],e=-1;++e<r;)a=n[e],Le(a,c,i)?(Le(o,c,i)||t.push(Ne(o,a,c,i)),t.push(a)):Le(o,c,i)&&t.push(Ne(o,a,c,i)),o=a;u&&t.push(t[0]),c=i}return t};var is,os,as,us,ss,ls=[],cs=[];Be.prototype.prepare=function(){for(var t,n=this.edges,e=n.length;e--;)t=n[e].edge,t.b&&t.a||n.splice(e,1);return n.sort(We),n.length},nr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=ar(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)r=e.U,e===r.L?(i=r.R,i&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(ir(this,e),t=e,e=t.U),e.C=!1,r.C=!0,or(this,r))):(i=r.L,i&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&(or(this,e),t=e,e=t.U),e.C=!1,r.C=!0,ir(this,r))),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,a=t.R;if(e=o?a?ar(a):o:a,i?i.L===t?i.L=e:i.R=e:this._=e,o&&a?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==a?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=a,a.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r){if(t&&t.C)return void(t.C=!1);do{if(t===this._)break;if(t===i.L){if(n=i.R,n.C&&(n.C=!1,i.C=!0,ir(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,or(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,ir(this,i),t=this._;break}}else if(n=i.L,n.C&&(n.C=!1,i.C=!0,or(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,ir(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,or(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}},sa.geom.voronoi=function(t){function n(t){var n=new Array(t.length),r=u[0][0],i=u[0][1],o=u[1][0],a=u[1][1];return ur(e(t),u).cells.forEach(function(e,u){var s=e.edges,l=e.site,c=n[u]=s.length?s.map(function(t){var n=t.start();return[n.x,n.y]}):l.x>=r&&l.x<=o&&l.y>=i&&l.y<=a?[[r,a],[o,a],[o,i],[r,i]]:[];c.point=t[u]}),n}function e(t){return t.map(function(t,n){return{x:Math.round(o(t,n)/Da)*Da,y:Math.round(a(t,n)/Da)*Da,i:n}})}var r=Ee,i=Pe,o=r,a=i,u=fs;return t?n(t):(n.links=function(t){return ur(e(t)).edges.filter(function(t){return t.l&&t.r}).map(function(n){return{source:t[n.l.i],target:t[n.r.i]}})},n.triangles=function(t){var n=[];return ur(e(t)).cells.forEach(function(e,r){for(var i,o,a=e.site,u=e.edges.sort(We),s=-1,l=u.length,c=u[l-1].edge,f=c.l===a?c.r:c.l;++s<l;)i=c,o=f,c=u[s].edge,f=c.l===a?c.r:c.l,r<o.i&&r<f.i&&lr(a,o,f)<0&&n.push([t[r],t[o.i],t[f.i]])}),n},n.x=function(t){return arguments.length?(o=_t(r=t),n):r},n.y=function(t){return arguments.length?(a=_t(i=t),n):i},n.clipExtent=function(t){return arguments.length?(u=null==t?fs:t,n):u===fs?null:u},n.size=function(t){return arguments.length?n.clipExtent(t&&[[0,0],t]):u===fs?null:u&&u[1]},n)};var fs=[[-1e6,-1e6],[1e6,1e6]];sa.geom.delaunay=function(t){return sa.geom.voronoi().triangles(t)},sa.geom.quadtree=function(t,n,e,r,i){function o(t){function o(t,n,e,r,i,o,a,u){if(!isNaN(e)&&!isNaN(r))if(t.leaf){var s=t.x,c=t.y;if(null!=s)if(ba(s-e)+ba(c-r)<.01)l(t,n,e,r,i,o,a,u);else{var f=t.point;t.x=t.y=t.point=null,l(t,f,s,c,i,o,a,u),l(t,n,e,r,i,o,a,u)}else t.x=e,t.y=r,t.point=n}else l(t,n,e,r,i,o,a,u)}function l(t,n,e,r,i,a,u,s){var l=.5*(i+u),c=.5*(a+s),f=e>=l,h=r>=c,p=h<<1|f;t.leaf=!1,t=t.nodes[p]||(t.nodes[p]=hr()),f?i=l:u=l,h?a=c:s=c,o(t,n,e,r,i,a,u,s)}var c,f,h,p,d,v,g,m,y,$=_t(u),b=_t(s);if(null!=n)v=n,g=e,m=r,y=i;else if(m=y=-(v=g=1/0),f=[],h=[],d=t.length,a)for(p=0;p<d;++p)c=t[p],c.x<v&&(v=c.x),c.y<g&&(g=c.y),c.x>m&&(m=c.x),c.y>y&&(y=c.y),f.push(c.x),h.push(c.y);else for(p=0;p<d;++p){var x=+$(c=t[p],p),w=+b(c,p);x<v&&(v=x),w<g&&(g=w),x>m&&(m=x),w>y&&(y=w),f.push(x),h.push(w)}var C=m-v,S=y-g;C>S?y=g+C:m=v+S;var M=hr();if(M.add=function(t){o(M,t,+$(t,++p),+b(t,p),v,g,m,y)},M.visit=function(t){pr(t,M,v,g,m,y)},M.find=function(t){return dr(M,t[0],t[1],v,g,m,y)},p=-1,null==n){for(;++p<d;)o(M,t[p],f[p],h[p],v,g,m,y);--p}else t.forEach(M.add);return f=h=t=c=null,M}var a,u=Ee,s=Pe;return(a=arguments.length)?(u=cr,s=fr,3===a&&(i=e,r=n,e=n=0),o(t)):(o.x=function(t){return arguments.length?(u=t,o):u},o.y=function(t){return arguments.length?(s=t,o):s},o.extent=function(t){return arguments.length?(null==t?n=e=r=i=null:(n=+t[0][0],e=+t[0][1],r=+t[1][0],i=+t[1][1]),o):null==n?null:[[n,e],[r,i]]},o.size=function(t){return arguments.length?(null==t?n=e=r=i=null:(n=e=0,r=+t[0],i=+t[1]),o):null==n?null:[r-n,i-e]},o)},sa.interpolateRgb=vr,sa.interpolateObject=gr,sa.interpolateNumber=mr,sa.interpolateString=yr;var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ps=new RegExp(hs.source,"g");sa.interpolate=$r,sa.interpolators=[function(t,n){var e=typeof n;return("string"===e?ou.has(n.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(n)?vr:yr:n instanceof at?vr:Array.isArray(n)?br:"object"===e&&isNaN(n)?gr:mr)(t,n)}],sa.interpolateArray=br;var ds=function(){return y},vs=sa.map({linear:ds,poly:kr,quad:function(){return Sr},cubic:function(){return Mr},sin:function(){return Ar},exp:function(){return Er},circle:function(){return Pr},elastic:Or,back:Tr,bounce:function(){return Lr}}),gs=sa.map({"in":y,out:wr,"in-out":Cr,"out-in":function(t){return Cr(wr(t))}});sa.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.slice(0,n):t,r=n>=0?t.slice(n+1):"in";return e=vs.get(e)||ds,r=gs.get(r)||y,xr(r(e.apply(null,la.call(arguments,1))))},sa.interpolateHcl=Nr,sa.interpolateHsl=jr,sa.interpolateLab=Rr,sa.interpolateRound=Dr,sa.transform=function(t){var n=fa.createElementNS(sa.ns.prefix.svg,"g");return(sa.transform=function(t){if(null!=t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate()}return new Fr(e?e.matrix:ms)})(t)},Fr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ms={a:1,b:0,c:0,d:1,e:0,f:0};sa.interpolateTransform=Yr,sa.layout={},sa.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;++e<r;)n.push(Xr(t[e]));return n}},sa.layout.chord=function(){function t(){var t,l,f,h,p,d={},v=[],g=sa.range(o),m=[];for(e=[],r=[],t=0,h=-1;++h<o;){for(l=0,p=-1;++p<o;)l+=i[h][p];v.push(l),m.push(sa.range(o)),t+=l}for(a&&g.sort(function(t,n){return a(v[t],v[n])}),u&&m.forEach(function(t,n){t.sort(function(t,e){return u(i[n][t],i[n][e])})}),t=(Va-c*o)/t,l=0,h=-1;++h<o;){for(f=l,p=-1;++p<o;){var y=g[h],$=m[y][p],b=i[y][$],x=l,w=l+=b*t;d[y+"-"+$]={index:y,subindex:$,startAngle:x,endAngle:w,value:b}}r[y]={index:y,startAngle:f,endAngle:l,value:v[y]},l+=c}for(h=-1;++h<o;)for(p=h-1;++p<o;){var C=d[h+"-"+p],S=d[p+"-"+h];(C.value||S.value)&&e.push(C.value<S.value?{source:S,target:C}:{source:C,target:S})}s&&n()}function n(){e.sort(function(t,n){return s((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,i,o,a,u,s,l={},c=0;return l.matrix=function(t){return arguments.length?(o=(i=t)&&i.length,e=r=null,l):i},l.padding=function(t){return arguments.length?(c=t,e=r=null,l):c},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(u=t,e=null,l):u},l.sortChords=function(t){return arguments.length?(s=t,e&&n(),l):s},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},sa.layout.force=function(){function t(t){return function(n,e,r,i){if(n.point!==t){var o=n.cx-t.x,a=n.cy-t.y,u=i-e,s=o*o+a*a;if(u*u/m<s){if(s<v){var l=n.charge/s;t.px-=o*l,t.py-=a*l}return!0}if(n.point&&s&&s<v){var l=n.pointCharge/s;t.px-=o*l,t.py-=a*l}}return!n.charge}}function n(t){t.px=sa.event.x,t.py=sa.event.y,s.resume()}var e,r,i,o,a,u,s={},l=sa.dispatch("start","tick","end"),c=[1,1],f=.9,h=ys,p=$s,d=-30,v=bs,g=.1,m=.64,$=[],b=[];return s.tick=function(){if((i*=.99)<.005)return e=null,l.end({type:"end",alpha:i=0}),!0;var n,r,s,h,p,v,m,y,x,w=$.length,C=b.length;for(r=0;r<C;++r)s=b[r],h=s.source,p=s.target,y=p.x-h.x,x=p.y-h.y,(v=y*y+x*x)&&(v=i*a[r]*((v=Math.sqrt(v))-o[r])/v,y*=v,x*=v,p.x-=y*(m=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=x*m,h.x+=y*(m=1-m),h.y+=x*m);if((m=i*g)&&(y=c[0]/2,x=c[1]/2,r=-1,m))for(;++r<w;)s=$[r],
-s.x+=(y-s.x)*m,s.y+=(x-s.y)*m;if(d)for(ri(n=sa.geom.quadtree($),i,u),r=-1;++r<w;)(s=$[r]).fixed||n.visit(t(s));for(r=-1;++r<w;)s=$[r],s.fixed?(s.x=s.px,s.y=s.py):(s.x-=(s.px-(s.px=s.x))*f,s.y-=(s.py-(s.py=s.y))*f);l.tick({type:"tick",alpha:i})},s.nodes=function(t){return arguments.length?($=t,s):$},s.links=function(t){return arguments.length?(b=t,s):b},s.size=function(t){return arguments.length?(c=t,s):c},s.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,s):h},s.distance=s.linkDistance,s.linkStrength=function(t){return arguments.length?(p="function"==typeof t?t:+t,s):p},s.friction=function(t){return arguments.length?(f=+t,s):f},s.charge=function(t){return arguments.length?(d="function"==typeof t?t:+t,s):d},s.chargeDistance=function(t){return arguments.length?(v=t*t,s):Math.sqrt(v)},s.gravity=function(t){return arguments.length?(g=+t,s):g},s.theta=function(t){return arguments.length?(m=t*t,s):Math.sqrt(m)},s.alpha=function(t){return arguments.length?(t=+t,i?t>0?i=t:(e.c=null,e.t=NaN,e=null,l.end({type:"end",alpha:i=0})):t>0&&(l.start({type:"start",alpha:i=t}),e=Ot(s.tick)),s):i},s.start=function(){function t(t,r){if(!e){for(e=new Array(i),s=0;s<i;++s)e[s]=[];for(s=0;s<l;++s){var o=b[s];e[o.source.index].push(o.target),e[o.target.index].push(o.source)}}for(var a,u=e[n],s=-1,c=u.length;++s<c;)if(!isNaN(a=u[s][t]))return a;return Math.random()*r}var n,e,r,i=$.length,l=b.length,f=c[0],v=c[1];for(n=0;n<i;++n)(r=$[n]).index=n,r.weight=0;for(n=0;n<l;++n)r=b[n],"number"==typeof r.source&&(r.source=$[r.source]),"number"==typeof r.target&&(r.target=$[r.target]),++r.source.weight,++r.target.weight;for(n=0;n<i;++n)r=$[n],isNaN(r.x)&&(r.x=t("x",f)),isNaN(r.y)&&(r.y=t("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(o=[],"function"==typeof h)for(n=0;n<l;++n)o[n]=+h.call(this,b[n],n);else for(n=0;n<l;++n)o[n]=h;if(a=[],"function"==typeof p)for(n=0;n<l;++n)a[n]=+p.call(this,b[n],n);else for(n=0;n<l;++n)a[n]=p;if(u=[],"function"==typeof d)for(n=0;n<i;++n)u[n]=+d.call(this,$[n],n);else for(n=0;n<i;++n)u[n]=d;return s.resume()},s.resume=function(){return s.alpha(.1)},s.stop=function(){return s.alpha(0)},s.drag=function(){return r||(r=sa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",n).on("dragend.force",ti)),arguments.length?void this.on("mouseover.force",ni).on("mouseout.force",ei).call(r):r},sa.rebind(s,l,"on")};var ys=20,$s=1,bs=1/0;sa.layout.hierarchy=function(){function t(i){var o,a=[i],u=[];for(i.depth=0;null!=(o=a.pop());)if(u.push(o),(l=e.call(t,o,o.depth))&&(s=l.length)){for(var s,l,c;--s>=0;)a.push(c=l[s]),c.parent=o,c.depth=o.depth+1;r&&(o.value=0),o.children=l}else r&&(o.value=+r.call(t,o,o.depth)||0),delete o.children;return ai(i,function(t){var e,i;n&&(e=t.children)&&e.sort(n),r&&(i=t.parent)&&(i.value+=t.value)}),u}var n=li,e=ui,r=si;return t.sort=function(e){return arguments.length?(n=e,t):n},t.children=function(n){return arguments.length?(e=n,t):e},t.value=function(n){return arguments.length?(r=n,t):r},t.revalue=function(n){return r&&(oi(n,function(t){t.children&&(t.value=0)}),ai(n,function(n){var e;n.children||(n.value=+r.call(t,n,n.depth)||0),(e=n.parent)&&(e.value+=n.value)})),n},t},sa.layout.partition=function(){function t(n,e,r,i){var o=n.children;if(n.x=e,n.y=n.depth*i,n.dx=r,n.dy=i,o&&(a=o.length)){var a,u,s,l=-1;for(r=n.value?r/n.value:0;++l<a;)t(u=o[l],e,s=u.value*r,i),e+=s}}function n(t){var e=t.children,r=0;if(e&&(i=e.length))for(var i,o=-1;++o<i;)r=Math.max(r,n(e[o]));return 1+r}function e(e,o){var a=r.call(this,e,o);return t(a[0],0,i[0],i[1]/n(a[0])),a}var r=sa.layout.hierarchy(),i=[1,1];return e.size=function(t){return arguments.length?(i=t,e):i},ii(e,r)},sa.layout.pie=function(){function t(a){var u,s=a.length,l=a.map(function(e,r){return+n.call(t,e,r)}),c=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof i?i.apply(this,arguments):i)-c,h=Math.min(Math.abs(f)/s,+("function"==typeof o?o.apply(this,arguments):o)),p=h*(f<0?-1:1),d=sa.sum(l),v=d?(f-s*p)/d:0,g=sa.range(s),m=[];return null!=e&&g.sort(e===xs?function(t,n){return l[n]-l[t]}:function(t,n){return e(a[t],a[n])}),g.forEach(function(t){m[t]={data:a[t],value:u=l[t],startAngle:c,endAngle:c+=u*v+p,padAngle:h}}),m}var n=Number,e=xs,r=0,i=Va,o=0;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(i=n,t):i},t.padAngle=function(n){return arguments.length?(o=n,t):o},t};var xs={};sa.layout.stack=function(){function t(u,s){if(!(h=u.length))return u;var l=u.map(function(e,r){return n.call(t,e,r)}),c=l.map(function(n){return n.map(function(n,e){return[o.call(t,n,e),a.call(t,n,e)]})}),f=e.call(t,c,s);l=sa.permute(l,f),c=sa.permute(c,f);var h,p,d,v,g=r.call(t,c,s),m=l[0].length;for(d=0;d<m;++d)for(i.call(t,l[0][d],v=g[d],c[0][d][1]),p=1;p<h;++p)i.call(t,l[p][d],v+=c[p-1][d][1],c[p][d][1]);return u}var n=y,e=di,r=vi,i=pi,o=fi,a=hi;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:ws.get(n)||di,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:Cs.get(n)||vi,t):r},t.x=function(n){return arguments.length?(o=n,t):o},t.y=function(n){return arguments.length?(a=n,t):a},t.out=function(n){return arguments.length?(i=n,t):i},t};var ws=sa.map({"inside-out":function(t){var n,e,r=t.length,i=t.map(gi),o=t.map(mi),a=sa.range(r).sort(function(t,n){return i[t]-i[n]}),u=0,s=0,l=[],c=[];for(n=0;n<r;++n)e=a[n],u<s?(u+=o[e],l.push(e)):(s+=o[e],c.push(e));return c.reverse().concat(l)},reverse:function(t){return sa.range(t.length).reverse()},"default":di}),Cs=sa.map({silhouette:function(t){var n,e,r,i=t.length,o=t[0].length,a=[],u=0,s=[];for(e=0;e<o;++e){for(n=0,r=0;n<i;n++)r+=t[n][e][1];r>u&&(u=r),a.push(r)}for(e=0;e<o;++e)s[e]=(u-a[e])/2;return s},wiggle:function(t){var n,e,r,i,o,a,u,s,l,c=t.length,f=t[0],h=f.length,p=[];for(p[0]=s=l=0,e=1;e<h;++e){for(n=0,i=0;n<c;++n)i+=t[n][e][1];for(n=0,o=0,u=f[e][0]-f[e-1][0];n<c;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*u);r<n;++r)a+=(t[r][e][1]-t[r][e-1][1])/u;o+=a*t[n][e][1]}p[e]=s-=i?o/i*u:0,s<l&&(l=s)}for(e=0;e<h;++e)p[e]-=l;return p},expand:function(t){var n,e,r,i=t.length,o=t[0].length,a=1/i,u=[];for(e=0;e<o;++e){for(n=0,r=0;n<i;n++)r+=t[n][e][1];if(r)for(n=0;n<i;n++)t[n][e][1]/=r;else for(n=0;n<i;n++)t[n][e][1]=a}for(e=0;e<o;++e)u[e]=0;return u},zero:vi});sa.layout.histogram=function(){function t(t,o){for(var a,u,s=[],l=t.map(e,this),c=r.call(this,l,o),f=i.call(this,c,l,o),o=-1,h=l.length,p=f.length-1,d=n?1:1/h;++o<p;)a=s[o]=[],a.dx=f[o+1]-(a.x=f[o]),a.y=0;if(p>0)for(o=-1;++o<h;)u=l[o],u>=c[0]&&u<=c[1]&&(a=s[sa.bisect(f,u,1,p)-1],a.y+=d,a.push(t[o]));return s}var n=!0,e=Number,r=xi,i=$i;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=_t(n),t):r},t.bins=function(n){return arguments.length?(i="number"==typeof n?function(t){return bi(t,n)}:_t(n),t):i},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},sa.layout.pack=function(){function t(t,o){var a=e.call(this,t,o),u=a[0],s=i[0],l=i[1],c=null==n?Math.sqrt:"function"==typeof n?n:function(){return n};if(u.x=u.y=0,ai(u,function(t){t.r=+c(t.value)}),ai(u,_i),r){var f=r*(n?1:Math.max(2*u.r/s,2*u.r/l))/2;ai(u,function(t){t.r+=f}),ai(u,_i),ai(u,function(t){t.r-=f})}return Ei(u,s/2,l/2,n?1:1/Math.max(2*u.r/s,2*u.r/l)),a}var n,e=sa.layout.hierarchy().sort(wi),r=0,i=[1,1];return t.size=function(n){return arguments.length?(i=n,t):i},t.radius=function(e){return arguments.length?(n=null==e||"function"==typeof e?e:+e,t):n},t.padding=function(n){return arguments.length?(r=+n,t):r},ii(t,e)},sa.layout.tree=function(){function t(t,i){var c=a.call(this,t,i),f=c[0],h=n(f);if(ai(h,e),h.parent.m=-h.z,oi(h,r),l)oi(f,o);else{var p=f,d=f,v=f;oi(f,function(t){t.x<p.x&&(p=t),t.x>d.x&&(d=t),t.depth>v.depth&&(v=t)});var g=u(p,d)/2-p.x,m=s[0]/(d.x+u(d,p)/2+g),y=s[1]/(v.depth||1);oi(f,function(t){t.x=(t.x+g)*m,t.y=t.depth*y})}return c}function n(t){for(var n,e={A:null,children:[t]},r=[e];null!=(n=r.pop());)for(var i,o=n.children,a=0,u=o.length;a<u;++a)r.push((o[a]=i={_:o[a],parent:n,children:(i=o[a].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=i);return e.children[0]}function e(t){var n=t.children,e=t.parent.children,r=t.i?e[t.i-1]:null;if(n.length){ji(t);var o=(n[0].z+n[n.length-1].z)/2;r?(t.z=r.z+u(t._,r._),t.m=t.z-o):t.z=o}else r&&(t.z=r.z+u(t._,r._));t.parent.A=i(t,r,t.parent.A||e[0])}function r(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function i(t,n,e){if(n){for(var r,i=t,o=t,a=n,s=i.parent.children[0],l=i.m,c=o.m,f=a.m,h=s.m;a=Li(a),i=Ti(i),a&&i;)s=Ti(s),o=Li(o),o.a=t,r=a.z+f-i.z-l+u(a._,i._),r>0&&(Ni(Ri(a,t,e),t,r),l+=r,c+=r),f+=a.m,l+=i.m,h+=s.m,c+=o.m;a&&!Li(o)&&(o.t=a,o.m+=f-c),i&&!Ti(s)&&(s.t=i,s.m+=l-h,e=t)}return e}function o(t){t.x*=s[0],t.y=t.depth*s[1]}var a=sa.layout.hierarchy().sort(null).value(null),u=Oi,s=[1,1],l=null;return t.separation=function(n){return arguments.length?(u=n,t):u},t.size=function(n){return arguments.length?(l=null==(s=n)?o:null,t):l?null:s},t.nodeSize=function(n){return arguments.length?(l=null==(s=n)?null:o,t):l?s:null},ii(t,a)},sa.layout.cluster=function(){function t(t,o){var a,u=n.call(this,t,o),s=u[0],l=0;ai(s,function(t){var n=t.children;n&&n.length?(t.x=Fi(n),t.y=Di(n)):(t.x=a?l+=e(t,a):0,t.y=0,a=t)});var c=Ii(s),f=Vi(s),h=c.x-e(c,f)/2,p=f.x+e(f,c)/2;return ai(s,i?function(t){t.x=(t.x-s.x)*r[0],t.y=(s.y-t.y)*r[1]}:function(t){t.x=(t.x-h)/(p-h)*r[0],t.y=(1-(s.y?t.y/s.y:1))*r[1]}),u}var n=sa.layout.hierarchy().sort(null).value(null),e=Oi,r=[1,1],i=!1;return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(i=null==(r=n),t):i?null:r},t.nodeSize=function(n){return arguments.length?(i=null!=(r=n),t):i?r:null},ii(t,n)},sa.layout.treemap=function(){function t(t,n){for(var e,r,i=-1,o=t.length;++i<o;)r=(e=t[i]).value*(n<0?0:n),e.area=isNaN(r)||r<=0?0:r}function n(e){var o=e.children;if(o&&o.length){var a,u,s,l=f(e),c=[],h=o.slice(),d=1/0,v="slice"===p?l.dx:"dice"===p?l.dy:"slice-dice"===p?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),c.area=0;(s=h.length)>0;)c.push(a=h[s-1]),c.area+=a.area,"squarify"!==p||(u=r(c,v))<=d?(h.pop(),d=u):(c.area-=c.pop().area,i(c,v,l,!1),v=Math.min(l.dx,l.dy),c.length=c.area=0,d=1/0);c.length&&(i(c,v,l,!0),c.length=c.area=0),o.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var o,a=f(n),u=r.slice(),s=[];for(t(u,a.dx*a.dy/n.value),s.area=0;o=u.pop();)s.push(o),s.area+=o.area,null!=o.z&&(i(s,o.z?a.dx:a.dy,a,!u.length),s.length=s.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,i=0,o=1/0,a=-1,u=t.length;++a<u;)(e=t[a].area)&&(e<o&&(o=e),e>i&&(i=e));return r*=r,n*=n,r?Math.max(n*i*d/r,r/(n*o*d)):1/0}function i(t,n,e,r){var i,o=-1,a=t.length,u=e.x,l=e.y,c=n?s(t.area/n):0;if(n==e.dx){for((r||c>e.dy)&&(c=e.dy);++o<a;)i=t[o],i.x=u,i.y=l,i.dy=c,u+=i.dx=Math.min(e.x+e.dx-u,c?s(i.area/c):0);i.z=!0,i.dx+=e.x+e.dx-u,e.y+=c,e.dy-=c}else{for((r||c>e.dx)&&(c=e.dx);++o<a;)i=t[o],i.x=u,i.y=l,i.dx=c,l+=i.dy=Math.min(e.y+e.dy-l,c?s(i.area/c):0);i.z=!1,i.dy+=e.y+e.dy-l,e.x+=c,e.dx-=c}}function o(r){var i=a||u(r),o=i[0];return o.x=o.y=0,o.value?(o.dx=l[0],o.dy=l[1]):o.dx=o.dy=0,a&&u.revalue(o),t([o],o.dx*o.dy/o.value),(a?e:n)(o),h&&(a=i),i}var a,u=sa.layout.hierarchy(),s=Math.round,l=[1,1],c=null,f=qi,h=!1,p="squarify",d=.5*(1+Math.sqrt(5));return o.size=function(t){return arguments.length?(l=t,o):l},o.padding=function(t){function n(n){var e=t.call(o,n,n.depth);return null==e?qi(n):zi(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return zi(n,t)}if(!arguments.length)return c;var r;return f=null==(c=t)?qi:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,o},o.round=function(t){return arguments.length?(s=t?Math.round:Number,o):s!=Number},o.sticky=function(t){return arguments.length?(h=t,a=null,o):h},o.ratio=function(t){return arguments.length?(d=t,o):d},o.mode=function(t){return arguments.length?(p=t+"",o):p},ii(o,u)},sa.random={normal:function(t,n){var e=arguments.length;return e<2&&(n=1),e<1&&(t=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return t+n*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=sa.random.normal.apply(sa,arguments);return function(){return Math.exp(t())}},bates:function(t){var n=sa.random.irwinHall(t);return function(){return n()/t}},irwinHall:function(t){return function(){for(var n=0,e=0;e<t;e++)n+=Math.random();return n}}},sa.scale={};var Ss={floor:y,ceil:y};sa.scale.linear=function(){return Zi([0,1],[0,1],$r,!1)};var Ms={s:1,g:1,p:1,r:1,e:1};sa.scale.log=function(){return ro(sa.scale.linear().domain([0,1]),10,!0,[1,10])};var _s=sa.format(".0e"),ks={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};sa.scale.pow=function(){return io(sa.scale.linear(),1,[0,1])},sa.scale.sqrt=function(){return sa.scale.pow().exponent(.5)},sa.scale.ordinal=function(){return ao([],{t:"range",a:[[]]})},sa.scale.category10=function(){return sa.scale.ordinal().range(As)},sa.scale.category20=function(){return sa.scale.ordinal().range(Es)},sa.scale.category20b=function(){return sa.scale.ordinal().range(Ps)},sa.scale.category20c=function(){return sa.scale.ordinal().range(Os)};var As=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map($t),Es=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map($t),Ps=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map($t),Os=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map($t);sa.scale.quantile=function(){return uo([],[])},sa.scale.quantize=function(){return so(0,1,[0,1])},sa.scale.threshold=function(){return lo([.5],[0,1])},sa.scale.identity=function(){return co([0,1])},sa.svg={},sa.svg.arc=function(){function t(){var t=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),c=a.apply(this,arguments)-za,f=u.apply(this,arguments)-za,h=Math.abs(f-c),p=c>f?0:1;if(l<t&&(d=l,l=t,t=d),h>=qa)return n(l,p)+(t?n(t,1-p):"")+"Z";var d,v,g,m,y,$,b,x,w,C,S,M,_=0,k=0,A=[];if((m=(+s.apply(this,arguments)||0)/2)&&(g=o===Ts?Math.sqrt(t*t+l*l):+o.apply(this,arguments),p||(k*=-1),l&&(k=nt(g/l*Math.sin(m))),t&&(_=nt(g/t*Math.sin(m)))),l){y=l*Math.cos(c+k),$=l*Math.sin(c+k),b=l*Math.cos(f-k),x=l*Math.sin(f-k);var E=Math.abs(f-c-2*k)<=Ia?0:1;if(k&&yo(y,$,b,x)===p^E){var P=(c+f)/2;y=l*Math.cos(P),$=l*Math.sin(P),b=x=null}}else y=$=0;if(t){w=t*Math.cos(f-_),C=t*Math.sin(f-_),S=t*Math.cos(c+_),M=t*Math.sin(c+_);var O=Math.abs(c-f+2*_)<=Ia?0:1;if(_&&yo(w,C,S,M)===1-p^O){var T=(c+f)/2;w=t*Math.cos(T),C=t*Math.sin(T),S=M=null}}else w=C=0;if(h>Da&&(d=Math.min(Math.abs(l-t)/2,+i.apply(this,arguments)))>.001){v=t<l^p?0:1;var L=d,N=d;if(h<Ia){var j=null==S?[w,C]:null==b?[y,$]:Ne([y,$],[S,M],[b,x],[w,C]),R=y-j[0],D=$-j[1],F=b-j[0],I=x-j[1],V=1/Math.sin(Math.acos((R*F+D*I)/(Math.sqrt(R*R+D*D)*Math.sqrt(F*F+I*I)))/2),q=Math.sqrt(j[0]*j[0]+j[1]*j[1]);N=Math.min(d,(t-q)/(V-1)),L=Math.min(d,(l-q)/(V+1))}if(null!=b){var z=$o(null==S?[w,C]:[S,M],[y,$],l,L,p),B=$o([b,x],[w,C],l,L,p);d===L?A.push("M",z[0],"A",L,",",L," 0 0,",v," ",z[1],"A",l,",",l," 0 ",1-p^yo(z[1][0],z[1][1],B[1][0],B[1][1]),",",p," ",B[1],"A",L,",",L," 0 0,",v," ",B[0]):A.push("M",z[0],"A",L,",",L," 0 1,",v," ",B[0])}else A.push("M",y,",",$);if(null!=S){var U=$o([y,$],[S,M],t,-N,p),W=$o([w,C],null==b?[y,$]:[b,x],t,-N,p);d===N?A.push("L",W[0],"A",N,",",N," 0 0,",v," ",W[1],"A",t,",",t," 0 ",p^yo(W[1][0],W[1][1],U[1][0],U[1][1]),",",1-p," ",U[1],"A",N,",",N," 0 0,",v," ",U[0]):A.push("L",W[0],"A",N,",",N," 0 0,",v," ",U[0])}else A.push("L",w,",",C)}else A.push("M",y,",",$),null!=b&&A.push("A",l,",",l," 0 ",E,",",p," ",b,",",x),A.push("L",w,",",C),null!=S&&A.push("A",t,",",t," 0 ",O,",",1-p," ",S,",",M);return A.push("Z"),A.join("")}function n(t,n){return"M0,"+t+"A"+t+","+t+" 0 1,"+n+" 0,"+-t+"A"+t+","+t+" 0 1,"+n+" 0,"+t}var e=ho,r=po,i=fo,o=Ts,a=vo,u=go,s=mo;return t.innerRadius=function(n){return arguments.length?(e=_t(n),t):e},t.outerRadius=function(n){return arguments.length?(r=_t(n),t):r},t.cornerRadius=function(n){return arguments.length?(i=_t(n),t):i},t.padRadius=function(n){return arguments.length?(o=n==Ts?Ts:_t(n),t):o},t.startAngle=function(n){return arguments.length?(a=_t(n),t):a},t.endAngle=function(n){return arguments.length?(u=_t(n),t):u},t.padAngle=function(n){return arguments.length?(s=_t(n),t):s},t.centroid=function(){var t=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,n=(+a.apply(this,arguments)+ +u.apply(this,arguments))/2-za;return[Math.cos(n)*t,Math.sin(n)*t]},t};var Ts="auto";sa.svg.line=function(){return bo(y)};var Ls=sa.map({linear:xo,"linear-closed":wo,step:Co,"step-before":So,"step-after":Mo,basis:Oo,"basis-open":To,"basis-closed":Lo,bundle:No,cardinal:Ao,"cardinal-open":_o,"cardinal-closed":ko,monotone:Vo});Ls.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ns=[0,2/3,1/3,0],js=[0,1/3,2/3,0],Rs=[0,1/6,2/3,1/6];sa.svg.line.radial=function(){var t=bo(qo);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},So.reverse=Mo,Mo.reverse=So,sa.svg.area=function(){return zo(y)},sa.svg.area.radial=function(){var t=zo(qo);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},sa.svg.chord=function(){function t(t,u){var s=n(this,o,t,u),l=n(this,a,t,u);return"M"+s.p0+r(s.r,s.p1,s.a1-s.a0)+(e(s,l)?i(s.r,s.p1,s.r,s.p0):i(s.r,s.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+i(l.r,l.p1,s.r,s.p0))+"Z"}function n(t,n,e,r){var i=n.call(t,e,r),o=u.call(t,i,r),a=s.call(t,i,r)-za,c=l.call(t,i,r)-za;return{r:o,a0:a,a1:c,p0:[o*Math.cos(a),o*Math.sin(a)],p1:[o*Math.cos(c),o*Math.sin(c)]}}function e(t,n){return t.a0==n.a0&&t.a1==n.a1}function r(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ia)+",1 "+n}function i(t,n,e,r){return"Q 0,0 "+r}var o=$e,a=be,u=Bo,s=vo,l=go;return t.radius=function(n){return arguments.length?(u=_t(n),t):u},t.source=function(n){return arguments.length?(o=_t(n),t):o},t.target=function(n){return arguments.length?(a=_t(n),t):a},t.startAngle=function(n){return arguments.length?(s=_t(n),t):s},t.endAngle=function(n){return arguments.length?(l=_t(n),t):l},t},sa.svg.diagonal=function(){function t(t,i){var o=n.call(this,t,i),a=e.call(this,t,i),u=(o.y+a.y)/2,s=[o,{x:o.x,y:u},{x:a.x,y:u},a];return s=s.map(r),"M"+s[0]+"C"+s[1]+" "+s[2]+" "+s[3]}var n=$e,e=be,r=Uo;return t.source=function(e){return arguments.length?(n=_t(e),t):n},t.target=function(n){return arguments.length?(e=_t(n),t):e},t.projection=function(n){return arguments.length?(r=n,t):r},t},sa.svg.diagonal.radial=function(){var t=sa.svg.diagonal(),n=Uo,e=t.projection;return t.projection=function(t){return arguments.length?e(Wo(n=t)):n},t},sa.svg.symbol=function(){function t(t,r){return(Ds.get(n.call(this,t,r))||Go)(e.call(this,t,r))}var n=Yo,e=Ho;return t.type=function(e){return arguments.length?(n=_t(e),t):n},t.size=function(n){return arguments.length?(e=_t(n),t):e},t};var Ds=sa.map({circle:Go,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Is)),e=n*Is;return"M0,"+-n+"L"+e+",0 0,"+n+" "+-e+",0Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Fs),e=n*Fs/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Fs),e=n*Fs/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});sa.svg.symbolTypes=Ds.keys();var Fs=Math.sqrt(3),Is=Math.tan(30*Ba);Ea.transition=function(t){for(var n,e,r=Vs||++Us,i=Qo(t),o=[],a=qs||{time:Date.now(),ease:_r,delay:0,duration:250},u=-1,s=this.length;++u<s;){o.push(n=[]);for(var l=this[u],c=-1,f=l.length;++c<f;)(e=l[c])&&ta(e,c,i,r,a),n.push(e)}return Xo(o,i,r)},Ea.interrupt=function(t){return this.each(null==t?zs:Zo(Qo(t)))};var Vs,qs,zs=Zo(Qo()),Bs=[],Us=0;Bs.call=Ea.call,Bs.empty=Ea.empty,Bs.node=Ea.node,Bs.size=Ea.size,sa.transition=function(t,n){return t&&t.transition?Vs?t.transition(n):t:sa.selection().transition(t)},sa.transition.prototype=Bs,Bs.select=function(t){var n,e,r,i=this.id,o=this.namespace,a=[];t=A(t);for(var u=-1,s=this.length;++u<s;){a.push(n=[]);for(var l=this[u],c=-1,f=l.length;++c<f;)(r=l[c])&&(e=t.call(r,r.__data__,c,u))?("__data__"in r&&(e.__data__=r.__data__),ta(e,c,o,i,r[o][i]),n.push(e)):n.push(null)}return Xo(a,o,i)},Bs.selectAll=function(t){var n,e,r,i,o,a=this.id,u=this.namespace,s=[];t=E(t);for(var l=-1,c=this.length;++l<c;)for(var f=this[l],h=-1,p=f.length;++h<p;)if(r=f[h]){o=r[u][a],e=t.call(r,r.__data__,h,l),s.push(n=[]);for(var d=-1,v=e.length;++d<v;)(i=e[d])&&ta(i,d,u,a,o),n.push(i)}return Xo(s,u,a)},Bs.filter=function(t){var n,e,r,i=[];"function"!=typeof t&&(t=q(t));for(var o=0,a=this.length;o<a;o++){i.push(n=[]);for(var e=this[o],u=0,s=e.length;u<s;u++)(r=e[u])&&t.call(r,r.__data__,u,o)&&n.push(r)}return Xo(i,this.namespace,this.id)},Bs.tween=function(t,n){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(t):B(this,null==n?function(n){n[r][e].tween.remove(t)}:function(i){i[r][e].tween.set(t,n)})},Bs.attr=function(t,n){function e(){this.removeAttribute(u)}function r(){this.removeAttributeNS(u.space,u.local)}function i(t){return null==t?e:(t+="",function(){var n,e=this.getAttribute(u);return e!==t&&(n=a(e,t),function(t){this.setAttribute(u,n(t))})})}function o(t){return null==t?r:(t+="",function(){var n,e=this.getAttributeNS(u.space,u.local);return e!==t&&(n=a(e,t),function(t){this.setAttributeNS(u.space,u.local,n(t))})})}if(arguments.length<2){for(n in t)this.attr(n,t[n]);return this}var a="transform"==t?Yr:$r,u=sa.ns.qualify(t);return Jo(this,"attr."+t,n,u.local?o:i)},Bs.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(i));return r&&function(t){this.setAttribute(i,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(i.space,i.local));return r&&function(t){this.setAttributeNS(i.space,i.local,r(t))}}var i=sa.ns.qualify(t);return this.tween("attr."+t,i.local?r:e)},Bs.style=function(t,e,r){function i(){this.style.removeProperty(t)}function o(e){return null==e?i:(e+="",function(){var i,o=n(this).getComputedStyle(this,null).getPropertyValue(t);return o!==e&&(i=$r(o,e),function(n){this.style.setProperty(t,i(n),r)})})}var a=arguments.length;if(a<3){if("string"!=typeof t){a<2&&(e="");for(r in t)this.style(r,t[r],e);return this}r=""}return Jo(this,"style."+t,e,o)},Bs.styleTween=function(t,e,r){function i(i,o){var a=e.call(this,i,o,n(this).getComputedStyle(this,null).getPropertyValue(t));return a&&function(n){this.style.setProperty(t,a(n),r)}}return arguments.length<3&&(r=""),this.tween("style."+t,i)},Bs.text=function(t){return Jo(this,"text",t,Ko)},Bs.remove=function(){var t=this.namespace;return this.each("end.transition",function(){var n;this[t].count<2&&(n=this.parentNode)&&n.removeChild(this)})},Bs.ease=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].ease:("function"!=typeof t&&(t=sa.ease.apply(sa,arguments)),B(this,function(r){r[e][n].ease=t}))},Bs.delay=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].delay:B(this,"function"==typeof t?function(r,i,o){r[e][n].delay=+t.call(r,r.__data__,i,o)}:(t=+t,function(r){r[e][n].delay=t}))},Bs.duration=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].duration:B(this,"function"==typeof t?function(r,i,o){r[e][n].duration=Math.max(1,t.call(r,r.__data__,i,o))}:(t=Math.max(1,t),function(r){r[e][n].duration=t}))},Bs.each=function(t,n){var e=this.id,r=this.namespace;if(arguments.length<2){var i=qs,o=Vs;try{Vs=e,B(this,function(n,i,o){qs=n[r][e],t.call(n,n.__data__,i,o)})}finally{qs=i,Vs=o}}else B(this,function(i){var o=i[r][e];(o.event||(o.event=sa.dispatch("start","end","interrupt"))).on(t,n)});return this},Bs.transition=function(){for(var t,n,e,r,i=this.id,o=++Us,a=this.namespace,u=[],s=0,l=this.length;s<l;s++){u.push(t=[]);for(var n=this[s],c=0,f=n.length;c<f;c++)(e=n[c])&&(r=e[a][i],ta(e,c,a,o,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),t.push(e)}return Xo(u,a,o)},sa.svg.axis=function(){function t(t){t.each(function(){var t,l=sa.select(this),c=this.__chart__||e,f=this.__chart__=e.copy(),h=null==s?f.ticks?f.ticks.apply(f,u):f.domain():s,p=null==n?f.tickFormat?f.tickFormat.apply(f,u):y:n,d=l.selectAll(".tick").data(h,f),v=d.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),g=sa.transition(d.exit()).style("opacity",Da).remove(),m=sa.transition(d.order()).style("opacity",1),$=Math.max(i,0)+a,b=Ui(f),x=l.selectAll(".domain").data([0]),w=(x.enter().append("path").attr("class","domain"),sa.transition(x));v.append("line"),v.append("text");var C,S,M,_,k=v.select("line"),A=m.select("line"),E=d.select("text").text(p),P=v.select("text"),O=m.select("text"),T="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(t=na,C="x",M="y",S="x2",_="y2",E.attr("dy",T<0?"0em":".71em").style("text-anchor","middle"),w.attr("d","M"+b[0]+","+T*o+"V0H"+b[1]+"V"+T*o)):(t=ea,C="y",M="x",S="y2",_="x2",E.attr("dy",".32em").style("text-anchor",T<0?"end":"start"),w.attr("d","M"+T*o+","+b[0]+"H0V"+b[1]+"H"+T*o)),k.attr(_,T*i),P.attr(M,T*$),A.attr(S,0).attr(_,T*i),O.attr(C,0).attr(M,T*$),f.rangeBand){var L=f,N=L.rangeBand()/2;c=f=function(t){return L(t)+N}}else c.rangeBand?c=f:g.call(t,f,c);v.call(t,c,f),m.call(t,f,f)})}var n,e=sa.scale.linear(),r=Ws,i=6,o=6,a=3,u=[10],s=null;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n in Hs?n+"":Ws,t):r},t.ticks=function(){return arguments.length?(u=ca(arguments),t):u},t.tickValues=function(n){return arguments.length?(s=n,t):s},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n){var e=arguments.length;return e?(i=+n,o=+arguments[e-1],t):i},t.innerTickSize=function(n){return arguments.length?(i=+n,t):i},t.outerTickSize=function(n){return arguments.length?(o=+n,t):o},t.tickPadding=function(n){return arguments.length?(a=+n,t):a},t.tickSubdivide=function(){return arguments.length&&t},t};var Ws="bottom",Hs={top:1,right:1,bottom:1,left:1};sa.svg.brush=function(){function t(n){n.each(function(){var n=sa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",o).on("touchstart.brush",o),a=n.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),n.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var u=n.selectAll(".resize").data(v,y);u.exit().remove(),u.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ys[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),u.style("display",t.empty()?"none":null);var s,f=sa.transition(n),h=sa.transition(a);l&&(s=Ui(l),h.attr("x",s[0]).attr("width",s[1]-s[0]),r(f)),c&&(s=Ui(c),h.attr("y",s[0]).attr("height",s[1]-s[0]),i(f)),e(f)})}function e(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+f[+/e$/.test(t)]+","+h[+/^s/.test(t)]+")"})}function r(t){t.select(".extent").attr("x",f[0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function i(t){t.select(".extent").attr("y",h[0]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function o(){function o(){32==sa.event.keyCode&&(E||($=null,O[0]-=f[1],O[1]-=h[1],E=2),S())}function v(){32==sa.event.keyCode&&2==E&&(O[0]+=f[1],O[1]+=h[1],E=0,S())}function g(){var t=sa.mouse(x),n=!1;b&&(t[0]+=b[0],t[1]+=b[1]),E||(sa.event.altKey?($||($=[(f[0]+f[1])/2,(h[0]+h[1])/2]),O[0]=f[+(t[0]<$[0])],O[1]=h[+(t[1]<$[1])]):$=null),k&&m(t,l,0)&&(r(M),n=!0),A&&m(t,c,1)&&(i(M),n=!0),n&&(e(M),C({type:"brush",mode:E?"move":"resize"}))}function m(t,n,e){var r,i,o=Ui(n),s=o[0],l=o[1],c=O[e],v=e?h:f,g=v[1]-v[0];if(E&&(s-=c,l-=g+c),r=(e?d:p)?Math.max(s,Math.min(l,t[e])):t[e],E?i=(r+=c)+g:($&&(c=Math.max(s,Math.min(l,2*$[e]-r))),c<r?(i=r,r=c):i=c),v[0]!=r||v[1]!=i)return e?u=null:a=null,v[0]=r,v[1]=i,!0}function y(){g(),M.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),sa.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),P(),C({type:"brushend"})}var $,b,x=this,w=sa.select(sa.event.target),C=s.of(x,arguments),M=sa.select(x),_=w.datum(),k=!/^(n|s)$/.test(_)&&l,A=!/^(e|w)$/.test(_)&&c,E=w.classed("extent"),P=Z(x),O=sa.mouse(x),T=sa.select(n(x)).on("keydown.brush",o).on("keyup.brush",v);if(sa.event.changedTouches?T.on("touchmove.brush",g).on("touchend.brush",y):T.on("mousemove.brush",g).on("mouseup.brush",y),M.interrupt().selectAll("*").interrupt(),E)O[0]=f[0]-O[0],O[1]=h[0]-O[1];else if(_){var L=+/w$/.test(_),N=+/^n/.test(_);b=[f[1-L]-O[0],h[1-N]-O[1]],O[0]=f[L],O[1]=h[N]}else sa.event.altKey&&($=O.slice());M.style("pointer-events","none").selectAll(".resize").style("display",null),sa.select("body").style("cursor",w.style("cursor")),C({type:"brushstart"}),g()}var a,u,s=_(t,"brushstart","brush","brushend"),l=null,c=null,f=[0,0],h=[0,0],p=!0,d=!0,v=Gs[0];return t.event=function(t){t.each(function(){var t=s.of(this,arguments),n={x:f,y:h,i:a,j:u},e=this.__chart__||n;this.__chart__=n,Vs?sa.select(this).transition().each("start.brush",function(){a=e.i,u=e.j,f=e.x,h=e.y,t({type:"brushstart"})}).tween("brush:brush",function(){var e=br(f,n.x),r=br(h,n.y);return a=u=null,function(i){f=n.x=e(i),h=n.y=r(i),t({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=n.i,u=n.j,t({type:"brush",mode:"resize"}),t({type:"brushend"})}):(t({type:"brushstart"}),t({type:"brush",mode:"resize"}),t({type:"brushend"}))})},t.x=function(n){return arguments.length?(l=n,v=Gs[!l<<1|!c],t):l},t.y=function(n){return arguments.length?(c=n,v=Gs[!l<<1|!c],t):c},t.clamp=function(n){return arguments.length?(l&&c?(p=!!n[0],d=!!n[1]):l?p=!!n:c&&(d=!!n),t):l&&c?[p,d]:l?p:c?d:null},t.extent=function(n){var e,r,i,o,s;return arguments.length?(l&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),a=[e,r],l.invert&&(e=l(e),r=l(r)),r<e&&(s=e,e=r,r=s),e==f[0]&&r==f[1]||(f=[e,r])),c&&(i=n[0],o=n[1],l&&(i=i[1],o=o[1]),u=[i,o],c.invert&&(i=c(i),o=c(o)),o<i&&(s=i,i=o,o=s),i==h[0]&&o==h[1]||(h=[i,o])),t):(l&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),r<e&&(s=e,e=r,r=s))),c&&(u?(i=u[0],o=u[1]):(i=h[0],o=h[1],c.invert&&(i=c.invert(i),o=c.invert(o)),o<i&&(s=i,i=o,o=s))),l&&c?[[e,i],[r,o]]:l?[e,r]:c&&[i,o])},t.clear=function(){return t.empty()||(f=[0,0],h=[0,0],a=u=null),t},t.empty=function(){return!!l&&f[0]==f[1]||!!c&&h[0]==h[1]},sa.rebind(t,s,"on")};var Ys={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Gs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Zs=du.format=bu.timeFormat,Xs=Zs.utc,Js=Xs("%Y-%m-%dT%H:%M:%S.%LZ");Zs.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ra:Js,ra.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},ra.toString=Js.toString,du.second=Vt(function(t){return new vu(1e3*Math.floor(t/1e3));
-},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),du.seconds=du.second.range,du.seconds.utc=du.second.utc.range,du.minute=Vt(function(t){return new vu(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),du.minutes=du.minute.range,du.minutes.utc=du.minute.utc.range,du.hour=Vt(function(t){var n=t.getTimezoneOffset()/60;return new vu(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),du.hours=du.hour.range,du.hours.utc=du.hour.utc.range,du.month=Vt(function(t){return t=du.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),du.months=du.month.range,du.months.utc=du.month.utc.range;var Ks=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qs=[[du.second,1],[du.second,5],[du.second,15],[du.second,30],[du.minute,1],[du.minute,5],[du.minute,15],[du.minute,30],[du.hour,1],[du.hour,3],[du.hour,6],[du.hour,12],[du.day,1],[du.day,2],[du.week,1],[du.month,1],[du.month,3],[du.year,1]],tl=Zs.multi([[".%L",function(t){return t.getMilliseconds()}],[":%S",function(t){return t.getSeconds()}],["%I:%M",function(t){return t.getMinutes()}],["%I %p",function(t){return t.getHours()}],["%a %d",function(t){return t.getDay()&&1!=t.getDate()}],["%b %d",function(t){return 1!=t.getDate()}],["%B",function(t){return t.getMonth()}],["%Y",Pn]]),nl={range:function(t,n,e){return sa.range(Math.ceil(t/e)*e,+n,e).map(oa)},floor:y,ceil:y};Qs.year=du.year,du.scale=function(){return ia(sa.scale.linear(),Qs,tl)};var el=Qs.map(function(t){return[t[0].utc,t[1]]}),rl=Xs.multi([[".%L",function(t){return t.getUTCMilliseconds()}],[":%S",function(t){return t.getUTCSeconds()}],["%I:%M",function(t){return t.getUTCMinutes()}],["%I %p",function(t){return t.getUTCHours()}],["%a %d",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],["%b %d",function(t){return 1!=t.getUTCDate()}],["%B",function(t){return t.getUTCMonth()}],["%Y",Pn]]);el.year=du.year.utc,du.scale.utc=function(){return ia(sa.scale.linear(),el,rl)},sa.text=kt(function(t){return t.responseText}),sa.json=function(t,n){return At(t,"application/json",aa,n)},sa.html=function(t,n){return At(t,"text/html",ua,n)},sa.xml=kt(function(t){return t.responseXML}),"function"==typeof define&&define.amd?(this.d3=sa,define(sa)):"object"==typeof module&&module.exports?module.exports=sa:this.d3=sa}(),angular.module("RecursionHelper",[]).factory("RecursionHelper",["$compile",function(t){return{compile:function(n,e){angular.isFunction(e)&&(e={post:e});var r,i=n.contents().remove();return{pre:e&&e.pre?e.pre:null,post:function(n,o){r||(r=t(i)),r(n,function(t){o.append(t)}),e&&e.post&&e.post.apply(null,arguments)}}}}}]);
\ No newline at end of file
+!function(t){"use strict";function n(t,n){return n=n||Error,function(){var e,r,i=2,o=arguments,a=o[0],u="["+(t?t+":":"")+a+"] ",s=o[1];for(u+=s.replace(/\{\d+\}/g,function(t){var n=+t.slice(1,-1),e=n+i;return e<o.length?yt(o[e]):t}),u+="\nhttp://errors.angularjs.org/1.5.8/"+(t?t+"/":"")+a,r=i,e="?";r<o.length;r++,e="&")u+=e+"p"+(r-i)+"="+encodeURIComponent(yt(o[r]));return new n(u)}}function e(t){if(null==t||M(t))return!1;if(Zr(t)||x(t)||Fr&&t instanceof Fr)return!0;var n="length"in Object(t)&&t.length;return w(n)&&(n>=0&&(n-1 in t||t instanceof Array)||"function"==typeof t.item)}function r(t,n,i){var o,a;if(t)if(S(t))for(o in t)"prototype"==o||"length"==o||"name"==o||t.hasOwnProperty&&!t.hasOwnProperty(o)||n.call(i,t[o],o,t);else if(Zr(t)||e(t)){var u="object"!=typeof t;for(o=0,a=t.length;o<a;o++)(u||o in t)&&n.call(i,t[o],o,t)}else if(t.forEach&&t.forEach!==r)t.forEach(n,i,t);else if(b(t))for(o in t)n.call(i,t[o],o,t);else if("function"==typeof t.hasOwnProperty)for(o in t)t.hasOwnProperty(o)&&n.call(i,t[o],o,t);else for(o in t)Tr.call(t,o)&&n.call(i,t[o],o,t);return t}function i(t,n,e){for(var r=Object.keys(t).sort(),i=0;i<r.length;i++)n.call(e,t[r[i]],r[i]);return r}function o(t){return function(n,e){t(e,n)}}function a(){return++Gr}function u(t,n){n?t.$$hashKey=n:delete t.$$hashKey}function s(t,n,e){for(var r=t.$$hashKey,i=0,o=n.length;i<o;++i){var a=n[i];if($(a)||S(a))for(var l=Object.keys(a),c=0,f=l.length;c<f;c++){var h=l[c],p=a[h];e&&$(p)?C(p)?t[h]=new Date(p.valueOf()):_(p)?t[h]=new RegExp(p):p.nodeName?t[h]=p.cloneNode(!0):N(p)?t[h]=p.clone():($(t[h])||(t[h]=Zr(p)?[]:{}),s(t[h],[p],!0)):t[h]=p}}return u(t,r),t}function l(t){return s(t,zr.call(arguments,1),!1)}function c(t){return s(t,zr.call(arguments,1),!0)}function f(t){return parseInt(t,10)}function h(t,n){return l(Object.create(t),n)}function p(){}function d(t){return t}function v(t){return function(){return t}}function g(t){return S(t.toString)&&t.toString!==Ur}function m(t){return"undefined"==typeof t}function y(t){return"undefined"!=typeof t}function $(t){return null!==t&&"object"==typeof t}function b(t){return null!==t&&"object"==typeof t&&!Wr(t)}function x(t){return"string"==typeof t}function w(t){return"number"==typeof t}function C(t){return"[object Date]"===Ur.call(t)}function S(t){return"function"==typeof t}function _(t){return"[object RegExp]"===Ur.call(t)}function M(t){return t&&t.window===t}function k(t){return t&&t.$evalAsync&&t.$watch}function A(t){return"[object File]"===Ur.call(t)}function E(t){return"[object FormData]"===Ur.call(t)}function P(t){return"[object Blob]"===Ur.call(t)}function O(t){return"boolean"==typeof t}function T(t){return t&&S(t.then)}function L(t){return t&&w(t.length)&&Xr.test(Ur.call(t))}function j(t){return"[object ArrayBuffer]"===Ur.call(t)}function N(t){return!(!t||!(t.nodeName||t.prop&&t.attr&&t.find))}function R(t){var n,e={},r=t.split(",");for(n=0;n<r.length;n++)e[r[n]]=!0;return e}function D(t){return Lr(t.nodeName||t[0]&&t[0].nodeName)}function F(t,n){var e=t.indexOf(n);return e>=0&&t.splice(e,1),e}function I(t,n){function e(t,n){var e,r=n.$$hashKey;if(Zr(t))for(var o=0,a=t.length;o<a;o++)n.push(i(t[o]));else if(b(t))for(e in t)n[e]=i(t[e]);else if(t&&"function"==typeof t.hasOwnProperty)for(e in t)t.hasOwnProperty(e)&&(n[e]=i(t[e]));else for(e in t)Tr.call(t,e)&&(n[e]=i(t[e]));return u(n,r),n}function i(t){if(!$(t))return t;var n=a.indexOf(t);if(n!==-1)return s[n];if(M(t)||k(t))throw Hr("cpws","Can't copy! Making copies of Window or Scope instances is not supported.");var r=!1,i=o(t);return void 0===i&&(i=Zr(t)?[]:Object.create(Wr(t)),r=!0),a.push(t),s.push(i),r?e(t,i):i}function o(t){switch(Ur.call(t)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new t.constructor(i(t.buffer),t.byteOffset,t.length);case"[object ArrayBuffer]":if(!t.slice){var n=new ArrayBuffer(t.byteLength);return new Uint8Array(n).set(new Uint8Array(t)),n}return t.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new t.constructor(t.valueOf());case"[object RegExp]":var e=new RegExp(t.source,t.toString().match(/[^\/]*$/)[0]);return e.lastIndex=t.lastIndex,e;case"[object Blob]":return new t.constructor([t],{type:t.type})}if(S(t.cloneNode))return t.cloneNode(!0)}var a=[],s=[];if(n){if(L(n)||j(n))throw Hr("cpta","Can't copy! TypedArray destination cannot be mutated.");if(t===n)throw Hr("cpi","Can't copy! Source and destination are identical.");return Zr(n)?n.length=0:r(n,function(t,e){"$$hashKey"!==e&&delete n[e]}),a.push(t),s.push(n),e(t,n)}return i(t)}function q(t,n){if(t===n)return!0;if(null===t||null===n)return!1;if(t!==t&&n!==n)return!0;var e,r,i,o=typeof t,a=typeof n;if(o==a&&"object"==o){if(!Zr(t)){if(C(t))return!!C(n)&&q(t.getTime(),n.getTime());if(_(t))return!!_(n)&&t.toString()==n.toString();if(k(t)||k(n)||M(t)||M(n)||Zr(n)||C(n)||_(n))return!1;i=dt();for(r in t)if("$"!==r.charAt(0)&&!S(t[r])){if(!q(t[r],n[r]))return!1;i[r]=!0}for(r in n)if(!(r in i)&&"$"!==r.charAt(0)&&y(n[r])&&!S(n[r]))return!1;return!0}if(!Zr(n))return!1;if((e=t.length)==n.length){for(r=0;r<e;r++)if(!q(t[r],n[r]))return!1;return!0}}return!1}function z(t,n,e){return t.concat(zr.call(n,e))}function V(t,n){return zr.call(t,n||0)}function B(t,n){var e=arguments.length>2?V(arguments,2):[];return!S(n)||n instanceof RegExp?n:e.length?function(){return arguments.length?n.apply(t,z(e,arguments,0)):n.apply(t,e)}:function(){return arguments.length?n.apply(t,arguments):n.call(t)}}function U(n,e){var r=e;return"string"==typeof n&&"$"===n.charAt(0)&&"$"===n.charAt(1)?r=void 0:M(e)?r="$WINDOW":e&&t.document===e?r="$DOCUMENT":k(e)&&(r="$SCOPE"),r}function W(t,n){if(!m(t))return w(n)||(n=n?2:null),JSON.stringify(t,U,n)}function H(t){return x(t)?JSON.parse(t):t}function Y(t,n){t=t.replace(ni,"");var e=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(e)?n:e}function G(t,n){return t=new Date(t.getTime()),t.setMinutes(t.getMinutes()+n),t}function Z(t,n,e){e=e?-1:1;var r=t.getTimezoneOffset(),i=Y(n,r);return G(t,e*(i-r))}function X(t){t=Fr(t).clone();try{t.empty()}catch(n){}var e=Fr("<div>").append(t).html();try{return t[0].nodeType===ui?Lr(e):e.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(t,n){return"<"+Lr(n)})}catch(n){return Lr(e)}}function J(t){try{return decodeURIComponent(t)}catch(n){}}function K(t){var n={};return r((t||"").split("&"),function(t){var e,r,i;t&&(r=t=t.replace(/\+/g,"%20"),e=t.indexOf("="),e!==-1&&(r=t.substring(0,e),i=t.substring(e+1)),r=J(r),y(r)&&(i=!y(i)||J(i),Tr.call(n,r)?Zr(n[r])?n[r].push(i):n[r]=[n[r],i]:n[r]=i))}),n}function Q(t){var n=[];return r(t,function(t,e){Zr(t)?r(t,function(t){n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}):n.push(nt(e,!0)+(t===!0?"":"="+nt(t,!0)))}),n.length?n.join("&"):""}function tt(t){return nt(t,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function nt(t,n){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,n?"%20":"+")}function et(t,n){var e,r,i=ei.length;for(r=0;r<i;++r)if(e=ei[r]+n,x(e=t.getAttribute(e)))return e;return null}function rt(t,n){var e,i,o={};r(ei,function(n){var r=n+"app";!e&&t.hasAttribute&&t.hasAttribute(r)&&(e=t,i=t.getAttribute(r))}),r(ei,function(n){var r,o=n+"app";!e&&(r=t.querySelector("["+o.replace(":","\\:")+"]"))&&(e=r,i=r.getAttribute(o))}),e&&(o.strictDi=null!==et(e,"strict-di"),n(e,i?[i]:[],o))}function it(n,e,i){$(i)||(i={});var o={strictDi:!1};i=l(o,i);var a=function(){if(n=Fr(n),n.injector()){var r=n[0]===t.document?"document":X(n);throw Hr("btstrpd","App already bootstrapped with this element '{0}'",r.replace(/</,"&lt;").replace(/>/,"&gt;"))}e=e||[],e.unshift(["$provide",function(t){t.value("$rootElement",n)}]),i.debugInfoEnabled&&e.push(["$compileProvider",function(t){t.debugInfoEnabled(!0)}]),e.unshift("ng");var o=rn(e,i.strictDi);return o.invoke(["$rootScope","$rootElement","$compile","$injector",function(t,n,e,r){t.$apply(function(){n.data("$injector",r),e(n)(t)})}]),o},u=/^NG_ENABLE_DEBUG_INFO!/,s=/^NG_DEFER_BOOTSTRAP!/;return t&&u.test(t.name)&&(i.debugInfoEnabled=!0,t.name=t.name.replace(u,"")),t&&!s.test(t.name)?a():(t.name=t.name.replace(s,""),Yr.resumeBootstrap=function(t){return r(t,function(t){e.push(t)}),a()},void(S(Yr.resumeDeferredBootstrap)&&Yr.resumeDeferredBootstrap()))}function ot(){t.name="NG_ENABLE_DEBUG_INFO!"+t.name,t.location.reload()}function at(t){var n=Yr.element(t).injector();if(!n)throw Hr("test","no injector found for element argument to getTestability");return n.get("$$testability")}function ut(t,n){return n=n||"_",t.replace(ri,function(t,e){return(e?n:"")+t.toLowerCase()})}function st(){var n;if(!ii){var e=ti();Ir=m(e)?t.jQuery:e?t[e]:void 0,Ir&&Ir.fn.on?(Fr=Ir,l(Ir.fn,{scope:Mi.scope,isolateScope:Mi.isolateScope,controller:Mi.controller,injector:Mi.injector,inheritedData:Mi.inheritedData}),n=Ir.cleanData,Ir.cleanData=function(t){for(var e,r,i=0;null!=(r=t[i]);i++)e=Ir._data(r,"events"),e&&e.$destroy&&Ir(r).triggerHandler("$destroy");n(t)}):Fr=Et,Yr.element=Fr,ii=!0}}function lt(t,n,e){if(!t)throw Hr("areq","Argument '{0}' is {1}",n||"?",e||"required");return t}function ct(t,n,e){return e&&Zr(t)&&(t=t[t.length-1]),lt(S(t),n,"not a function, got "+(t&&"object"==typeof t?t.constructor.name||"Object":typeof t)),t}function ft(t,n){if("hasOwnProperty"===t)throw Hr("badname","hasOwnProperty is not a valid {0} name",n)}function ht(t,n,e){if(!n)return t;for(var r,i=n.split("."),o=t,a=i.length,u=0;u<a;u++)r=i[u],t&&(t=(o=t)[r]);return!e&&S(t)?B(o,t):t}function pt(t){for(var n,e=t[0],r=t[t.length-1],i=1;e!==r&&(e=e.nextSibling);i++)(n||t[i]!==e)&&(n||(n=Fr(zr.call(t,0,i))),n.push(e));return n||t}function dt(){return Object.create(null)}function vt(t){function e(t,n,e){return t[n]||(t[n]=e())}var r=n("$injector"),i=n("ng"),o=e(t,"angular",Object);return o.$$minErr=o.$$minErr||n,e(o,"module",function(){var t={};return function(n,o,a){var u=function(t,n){if("hasOwnProperty"===t)throw i("badname","hasOwnProperty is not a valid {0} name",n)};return u(n,"module"),o&&t.hasOwnProperty(n)&&(t[n]=null),e(t,n,function(){function t(t,n,e,r){return r||(r=i),function(){return r[e||"push"]([t,n,arguments]),c}}function e(t,e){return function(r,o){return o&&S(o)&&(o.$$moduleName=n),i.push([t,e,arguments]),c}}if(!o)throw r("nomod","Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.",n);var i=[],u=[],s=[],l=t("$injector","invoke","push",u),c={_invokeQueue:i,_configBlocks:u,_runBlocks:s,requires:o,name:n,provider:e("$provide","provider"),factory:e("$provide","factory"),service:e("$provide","service"),value:t("$provide","value"),constant:t("$provide","constant","unshift"),decorator:e("$provide","decorator"),animation:e("$animateProvider","register"),filter:e("$filterProvider","register"),controller:e("$controllerProvider","register"),directive:e("$compileProvider","directive"),component:e("$compileProvider","component"),config:l,run:function(t){return s.push(t),this}};return a&&l(a),c})}})}function gt(t,n){if(Zr(t)){n=n||[];for(var e=0,r=t.length;e<r;e++)n[e]=t[e]}else if($(t)){n=n||{};for(var i in t)"$"===i.charAt(0)&&"$"===i.charAt(1)||(n[i]=t[i])}return n||t}function mt(t){var n=[];return JSON.stringify(t,function(t,e){if(e=U(t,e),$(e)){if(n.indexOf(e)>=0)return"...";n.push(e)}return e})}function yt(t){return"function"==typeof t?t.toString().replace(/ \{[\s\S]*$/,""):m(t)?"undefined":"string"!=typeof t?mt(t):t}function $t(e){l(e,{bootstrap:it,copy:I,extend:l,merge:c,equals:q,element:Fr,forEach:r,injector:rn,noop:p,bind:B,toJson:W,fromJson:H,identity:d,isUndefined:m,isDefined:y,isString:x,isFunction:S,isObject:$,isNumber:w,isElement:N,isArray:Zr,version:fi,isDate:C,lowercase:Lr,uppercase:jr,callbacks:{$$counter:0},getTestability:at,$$minErr:n,$$csp:Qr,reloadWithDebugInfo:ot}),(qr=vt(t))("ng",["ngLocale"],["$provide",function(t){t.provider({$$sanitizeUri:_e}),t.provider("$compile",vn).directive({a:No,input:ta,textarea:ta,form:qo,script:Za,select:Ka,style:tu,option:Qa,ngBind:ra,ngBindHtml:oa,ngBindTemplate:ia,ngClass:ua,ngClassEven:la,ngClassOdd:sa,ngCloak:ca,ngController:fa,ngForm:zo,ngHide:Va,ngIf:da,ngInclude:va,ngInit:ma,ngNonBindable:La,ngPluralize:Da,ngRepeat:Fa,ngShow:za,ngStyle:Ba,ngSwitch:Ua,ngSwitchWhen:Wa,ngSwitchDefault:Ha,ngOptions:Ra,ngTransclude:Ga,ngModel:Pa,ngList:ya,ngChange:aa,pattern:eu,ngPattern:eu,required:nu,ngRequired:nu,minlength:iu,ngMinlength:iu,maxlength:ru,ngMaxlength:ru,ngValue:ea,ngModelOptions:Ta}).directive({ngInclude:ga}).directive(Ro).directive(ha),t.provider({$anchorScroll:on,$animate:Vi,$animateCss:Wi,$$animateJs:qi,$$animateQueue:zi,$$AnimateRunner:Ui,$$animateAsyncRun:Bi,$browser:fn,$cacheFactory:hn,$controller:xn,$document:wn,$exceptionHandler:Cn,$filter:Ie,$$forceReflow:Ji,$interpolate:Dn,$interval:Fn,$http:Ln,$httpParamSerializer:_n,$httpParamSerializerJQLike:Mn,$httpBackend:Nn,$xhrFactory:jn,$jsonpCallbacks:ao,$location:Qn,$log:te,$parse:$e,$rootScope:Se,$q:be,$$q:xe,$sce:Ee,$sceDelegate:Ae,$sniffer:Pe,$templateCache:pn,$templateRequest:Oe,$$testability:Te,$timeout:Le,$window:Re,$$rAF:Ce,$$jqLite:Xt,$$HashMap:Pi,$$cookieReader:Fe})}])}function bt(){return++pi}function xt(t){return t.replace(gi,function(t,n,e,r){return r?e.toUpperCase():e}).replace(mi,"Moz$1")}function wt(t){return!xi.test(t)}function Ct(t){var n=t.nodeType;return n===oi||!n||n===li}function St(t){for(var n in hi[t.ng339])return!0;return!1}function _t(t){for(var n=0,e=t.length;n<e;n++)Lt(t[n])}function Mt(t,n){var e,i,o,a,u=n.createDocumentFragment(),s=[];if(wt(t))s.push(n.createTextNode(t));else{for(e=u.appendChild(n.createElement("div")),i=(wi.exec(t)||["",""])[1].toLowerCase(),o=Si[i]||Si._default,e.innerHTML=o[1]+t.replace(Ci,"<$1></$2>")+o[2],a=o[0];a--;)e=e.lastChild;s=z(s,e.childNodes),e=u.firstChild,e.textContent=""}return u.textContent="",u.innerHTML="",r(s,function(t){u.appendChild(t)}),u}function kt(n,e){e=e||t.document;var r;return(r=bi.exec(n))?[e.createElement(r[1])]:(r=Mt(n,e))?r.childNodes:[]}function At(t,n){var e=t.parentNode;e&&e.replaceChild(n,t),n.appendChild(t)}function Et(t){if(t instanceof Et)return t;var n;if(x(t)&&(t=Jr(t),n=!0),!(this instanceof Et)){if(n&&"<"!=t.charAt(0))throw $i("nosel","Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element");return new Et(t)}n?It(this,kt(t)):It(this,t)}function Pt(t){return t.cloneNode(!0)}function Ot(t,n){if(n||Lt(t),t.querySelectorAll)for(var e=t.querySelectorAll("*"),r=0,i=e.length;r<i;r++)Lt(e[r])}function Tt(t,n,e,i){if(y(i))throw $i("offargs","jqLite#off() does not support the `selector` argument");var o=jt(t),a=o&&o.events,u=o&&o.handle;if(u)if(n){var s=function(n){var r=a[n];y(e)&&F(r||[],e),y(e)&&r&&r.length>0||(vi(t,n,u),delete a[n])};r(n.split(" "),function(t){s(t),yi[t]&&s(yi[t])})}else for(n in a)"$destroy"!==n&&vi(t,n,u),delete a[n]}function Lt(t,n){var e=t.ng339,r=e&&hi[e];if(r){if(n)return void delete r.data[n];r.handle&&(r.events.$destroy&&r.handle({},"$destroy"),Tt(t)),delete hi[e],t.ng339=void 0}}function jt(t,n){var e=t.ng339,r=e&&hi[e];return n&&!r&&(t.ng339=e=bt(),r=hi[e]={events:{},data:{},handle:void 0}),r}function Nt(t,n,e){if(Ct(t)){var r=y(e),i=!r&&n&&!$(n),o=!n,a=jt(t,!i),u=a&&a.data;if(r)u[n]=e;else{if(o)return u;if(i)return u&&u[n];l(u,n)}}}function Rt(t,n){return!!t.getAttribute&&(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+n+" ")>-1}function Dt(t,n){n&&t.setAttribute&&r(n.split(" "),function(n){t.setAttribute("class",Jr((" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Jr(n)+" "," ")))})}function Ft(t,n){if(n&&t.setAttribute){var e=(" "+(t.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(n.split(" "),function(t){t=Jr(t),e.indexOf(" "+t+" ")===-1&&(e+=t+" ")}),t.setAttribute("class",Jr(e))}}function It(t,n){if(n)if(n.nodeType)t[t.length++]=n;else{var e=n.length;if("number"==typeof e&&n.window!==n){if(e)for(var r=0;r<e;r++)t[t.length++]=n[r]}else t[t.length++]=n}}function qt(t,n){return zt(t,"$"+(n||"ngController")+"Controller")}function zt(t,n,e){t.nodeType==li&&(t=t.documentElement);for(var r=Zr(n)?n:[n];t;){for(var i=0,o=r.length;i<o;i++)if(y(e=Fr.data(t,r[i])))return e;t=t.parentNode||t.nodeType===ci&&t.host}}function Vt(t){for(Ot(t,!0);t.firstChild;)t.removeChild(t.firstChild)}function Bt(t,n){n||Ot(t);var e=t.parentNode;e&&e.removeChild(t)}function Ut(n,e){e=e||t,"complete"===e.document.readyState?e.setTimeout(n):Fr(e).on("load",n)}function Wt(t,n){var e=ki[n.toLowerCase()];return e&&Ai[D(t)]&&e}function Ht(t){return Ei[t]}function Yt(t,n){var e=function(e,r){e.isDefaultPrevented=function(){return e.defaultPrevented};var i=n[r||e.type],o=i?i.length:0;if(o){if(m(e.immediatePropagationStopped)){var a=e.stopImmediatePropagation;e.stopImmediatePropagation=function(){e.immediatePropagationStopped=!0,e.stopPropagation&&e.stopPropagation(),a&&a.call(e)}}e.isImmediatePropagationStopped=function(){return e.immediatePropagationStopped===!0};var u=i.specialHandlerWrapper||Gt;o>1&&(i=gt(i));for(var s=0;s<o;s++)e.isImmediatePropagationStopped()||u(t,e,i[s])}};return e.elem=t,e}function Gt(t,n,e){e.call(t,n)}function Zt(t,n,e){var r=n.relatedTarget;r&&(r===t||_i.call(t,r))||e.call(t,n)}function Xt(){this.$get=function(){return l(Et,{hasClass:function(t,n){return t.attr&&(t=t[0]),Rt(t,n)},addClass:function(t,n){return t.attr&&(t=t[0]),Ft(t,n)},removeClass:function(t,n){return t.attr&&(t=t[0]),Dt(t,n)}})}}function Jt(t,n){var e=t&&t.$$hashKey;if(e)return"function"==typeof e&&(e=t.$$hashKey()),e;var r=typeof t;return e="function"==r||"object"==r&&null!==t?t.$$hashKey=r+":"+(n||a)():r+":"+t}function Kt(t,n){if(n){var e=0;this.nextUid=function(){return++e}}r(t,this.put,this)}function Qt(t){return Function.prototype.toString.call(t)+" "}function tn(t){var n=Qt(t).replace(Ni,""),e=n.match(Oi)||n.match(Ti);return e}function nn(t){var n=tn(t);return n?"function("+(n[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function en(t,n,e){var i,o,a;if("function"==typeof t){if(!(i=t.$inject)){if(i=[],t.length){if(n)throw x(e)&&e||(e=t.name||nn(t)),Ri("strictdi","{0} is not using explicit annotation and cannot be invoked in strict mode",e);o=tn(t),r(o[1].split(Li),function(t){t.replace(ji,function(t,n,e){i.push(e)})})}t.$inject=i}}else Zr(t)?(a=t.length-1,ct(t[a],"fn"),i=t.slice(0,a)):ct(t,"fn",!0);return i}function rn(t,n){function e(t){return function(n,e){return $(n)?void r(n,o(t)):t(n,e)}}function i(t,n){if(ft(t,"service"),(S(n)||Zr(n))&&(n=C.instantiate(n)),!n.$get)throw Ri("pget","Provider '{0}' must define $get factory method.",t);return w[t+g]=n}function a(t,n){return function(){var e=k.invoke(n,this);if(m(e))throw Ri("undef","Provider '{0}' must return a value from $get factory method.",t);return e}}function u(t,n,e){return i(t,{$get:e!==!1?a(t,n):n})}function s(t,n){return u(t,["$injector",function(t){return t.instantiate(n)}])}function l(t,n){return u(t,v(n),!1)}function c(t,n){ft(t,"constant"),w[t]=n,_[t]=n}function f(t,n){var e=C.get(t+g),r=e.$get;e.$get=function(){var t=k.invoke(r,e);return k.invoke(n,null,{$delegate:t})}}function h(t){lt(m(t)||Zr(t),"modulesToLoad","not an array");var n,e=[];return r(t,function(t){function r(t){var n,e;for(n=0,e=t.length;n<e;n++){var r=t[n],i=C.get(r[0]);i[r[1]].apply(i,r[2])}}if(!b.get(t)){b.put(t,!0);try{x(t)?(n=qr(t),e=e.concat(h(n.requires)).concat(n._runBlocks),r(n._invokeQueue),r(n._configBlocks)):S(t)?e.push(C.invoke(t)):Zr(t)?e.push(C.invoke(t)):ct(t,"module")}catch(i){throw Zr(t)&&(t=t[t.length-1]),i.message&&i.stack&&i.stack.indexOf(i.message)==-1&&(i=i.message+"\n"+i.stack),Ri("modulerr","Failed to instantiate module {0} due to:\n{1}",t,i.stack||i.message||i)}}}),e}function p(t,e){function r(n,r){if(t.hasOwnProperty(n)){if(t[n]===d)throw Ri("cdep","Circular dependency found: {0}",n+" <- "+y.join(" <- "));return t[n]}try{return y.unshift(n),t[n]=d,t[n]=e(n,r)}catch(i){throw t[n]===d&&delete t[n],i}finally{y.shift()}}function i(t,e,i){for(var o=[],a=rn.$$annotate(t,n,i),u=0,s=a.length;u<s;u++){var l=a[u];if("string"!=typeof l)throw Ri("itkn","Incorrect injection token! Expected service name as string, got {0}",l);o.push(e&&e.hasOwnProperty(l)?e[l]:r(l,i))}return o}function o(t){return!(Dr<=11)&&("function"==typeof t&&/^(?:class\b|constructor\()/.test(Qt(t)))}function a(t,n,e,r){"string"==typeof e&&(r=e,e=null);var a=i(t,e,r);return Zr(t)&&(t=t[t.length-1]),o(t)?(a.unshift(null),new(Function.prototype.bind.apply(t,a))):t.apply(n,a)}function u(t,n,e){var r=Zr(t)?t[t.length-1]:t,o=i(t,n,e);return o.unshift(null),new(Function.prototype.bind.apply(r,o))}return{invoke:a,instantiate:u,get:r,annotate:rn.$$annotate,has:function(n){return w.hasOwnProperty(n+g)||t.hasOwnProperty(n)}}}n=n===!0;var d={},g="Provider",y=[],b=new Kt([],(!0)),w={$provide:{provider:e(i),factory:e(u),service:e(s),value:e(l),constant:e(c),decorator:f}},C=w.$injector=p(w,function(t,n){throw Yr.isString(n)&&y.push(n),Ri("unpr","Unknown provider: {0}",y.join(" <- "))}),_={},M=p(_,function(t,n){var e=C.get(t+g,n);return k.invoke(e.$get,e,void 0,t)}),k=M;w["$injector"+g]={$get:v(M)};var A=h(t);return k=M.get("$injector"),k.strictDi=n,r(A,function(t){t&&k.invoke(t)}),k}function on(){var t=!0;this.disableAutoScrolling=function(){t=!1},this.$get=["$window","$location","$rootScope",function(n,e,r){function i(t){var n=null;return Array.prototype.some.call(t,function(t){if("a"===D(t))return n=t,!0}),n}function o(){var t=u.yOffset;if(S(t))t=t();else if(N(t)){var e=t[0],r=n.getComputedStyle(e);t="fixed"!==r.position?0:e.getBoundingClientRect().bottom}else w(t)||(t=0);return t}function a(t){if(t){t.scrollIntoView();var e=o();if(e){var r=t.getBoundingClientRect().top;n.scrollBy(0,r-e)}}else n.scrollTo(0,0)}function u(t){t=x(t)?t:e.hash();var n;t?(n=s.getElementById(t))?a(n):(n=i(s.getElementsByName(t)))?a(n):"top"===t&&a(null):a(null)}var s=n.document;return t&&r.$watch(function(){return e.hash()},function(t,n){t===n&&""===t||Ut(function(){r.$evalAsync(u)})}),u}]}function an(t,n){return t||n?t?n?(Zr(t)&&(t=t.join(" ")),Zr(n)&&(n=n.join(" ")),t+" "+n):t:n:""}function un(t){for(var n=0;n<t.length;n++){var e=t[n];if(e.nodeType===Fi)return e}}function sn(t){x(t)&&(t=t.split(" "));var n=dt();return r(t,function(t){t.length&&(n[t]=!0)}),n}function ln(t){return $(t)?t:{}}function cn(t,n,e,i){function o(t){try{t.apply(null,V(arguments,1))}finally{if(y--,0===y)for(;$.length;)try{$.pop()()}catch(n){e.error(n)}}}function a(t){var n=t.indexOf("#");return n===-1?"":t.substr(n)}function u(){S=null,s(),l()}function s(){b=_(),b=m(b)?null:b,q(b,A)&&(b=A),A=b}function l(){w===c.url()&&x===b||(w=c.url(),x=b,r(M,function(t){t(c.url(),b)}))}var c=this,f=t.location,h=t.history,d=t.setTimeout,v=t.clearTimeout,g={};c.isMock=!1;var y=0,$=[];c.$$completeOutstandingRequest=o,c.$$incOutstandingRequestCount=function(){y++},c.notifyWhenNoOutstandingRequests=function(t){0===y?t():$.push(t)};var b,x,w=f.href,C=n.find("base"),S=null,_=i.history?function(){try{return h.state}catch(t){}}:p;s(),x=b,c.url=function(n,e,r){if(m(r)&&(r=null),f!==t.location&&(f=t.location),h!==t.history&&(h=t.history),n){var o=x===r;if(w===n&&(!i.history||o))return c;var u=w&&Un(w)===Un(n);return w=n,x=r,!i.history||u&&o?(u||(S=n),e?f.replace(n):u?f.hash=a(n):f.href=n,f.href!==n&&(S=n)):(h[e?"replaceState":"pushState"](r,"",n),s(),x=b),S&&(S=n),c}return S||f.href.replace(/%27/g,"'")},c.state=function(){return b};var M=[],k=!1,A=null;c.onUrlChange=function(n){return k||(i.history&&Fr(t).on("popstate",u),Fr(t).on("hashchange",u),k=!0),M.push(n),n},c.$$applicationDestroyed=function(){Fr(t).off("hashchange popstate",u)},c.$$checkUrlChange=l,c.baseHref=function(){var t=C.attr("href");return t?t.replace(/^(https?\:)?\/\/[^\/]*/,""):""},c.defer=function(t,n){var e;return y++,e=d(function(){delete g[e],o(t)},n||0),g[e]=!0,e},c.defer.cancel=function(t){return!!g[t]&&(delete g[t],v(t),o(p),!0)}}function fn(){this.$get=["$window","$log","$sniffer","$document",function(t,n,e,r){return new cn(t,r,n,e)}]}function hn(){this.$get=function(){function t(t,r){function i(t){t!=h&&(p?p==t&&(p=t.n):p=t,o(t.n,t.p),o(t,h),h=t,h.n=null)}function o(t,n){t!=n&&(t&&(t.p=n),n&&(n.n=t))}if(t in e)throw n("$cacheFactory")("iid","CacheId '{0}' is already taken!",t);var a=0,u=l({},r,{id:t}),s=dt(),c=r&&r.capacity||Number.MAX_VALUE,f=dt(),h=null,p=null;return e[t]={put:function(t,n){if(!m(n)){if(c<Number.MAX_VALUE){var e=f[t]||(f[t]={key:t});i(e)}return t in s||a++,s[t]=n,a>c&&this.remove(p.key),n}},get:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;i(n)}return s[t]},remove:function(t){if(c<Number.MAX_VALUE){var n=f[t];if(!n)return;n==h&&(h=n.p),n==p&&(p=n.n),o(n.n,n.p),delete f[t]}t in s&&(delete s[t],a--)},removeAll:function(){s=dt(),a=0,f=dt(),h=p=null},destroy:function(){s=null,u=null,f=null,delete e[t]},info:function(){return l({},u,{size:a})}}}var e={};return t.info=function(){var t={};return r(e,function(n,e){t[e]=n.info()}),t},t.get=function(t){return e[t]},t}}function pn(){this.$get=["$cacheFactory",function(t){return t("templates")}]}function dn(){}function vn(n,e){function i(t,n,e){var i=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,o=dt();return r(t,function(t,r){if(t in M)return void(o[r]=M[t]);var a=t.match(i);if(!a)throw Hi("iscp","Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}",n,r,t,e?"controller bindings definition":"isolate scope definition");o[r]={mode:a[1][0],collection:"*"===a[2],optional:"?"===a[3],attrName:a[4]||r},a[4]&&(M[t]=o[r])}),o}function a(t,n){var e={isolateScope:null,bindToController:null};if($(t.scope)&&(t.bindToController===!0?(e.bindToController=i(t.scope,n,!0),e.isolateScope={}):e.isolateScope=i(t.scope,n,!1)),$(t.bindToController)&&(e.bindToController=i(t.bindToController,n,!0)),$(e.bindToController)){var r=t.controller,o=t.controllerAs;if(!r)throw Hi("noctrl","Cannot bind to controller without directive '{0}'s controller.",n);if(!bn(r,o))throw Hi("noident","Cannot bind to controller without identifier for directive '{0}'.",n)}return e}function u(t){var n=t.charAt(0);if(!n||n!==Lr(n))throw Hi("baddir","Directive/Component name '{0}' is invalid. The first character must be a lowercase letter",t);if(t!==t.trim())throw Hi("baddir","Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces",t)}function s(t){var n=t.require||t.controller&&t.name;return!Zr(n)&&$(n)&&r(n,function(t,e){var r=t.match(C),i=t.substring(r[0].length);i||(n[e]=r[0]+e)}),n}var c={},f="Directive",g=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,b=/(([\w\-]+)(?:\:([^;]+))?;?)/,w=R("ngSrc,ngSrcset,src,srcset"),C=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,_=/^(on[a-z]+|formaction)$/,M=dt();this.directive=function P(t,e){return ft(t,"directive"),x(t)?(u(t),lt(e,"directiveFactory"),c.hasOwnProperty(t)||(c[t]=[],n.factory(t+f,["$injector","$exceptionHandler",function(n,e){var i=[];return r(c[t],function(r,o){try{var a=n.invoke(r);S(a)?a={compile:v(a)}:!a.compile&&a.link&&(a.compile=v(a.link)),a.priority=a.priority||0,a.index=o,a.name=a.name||t,a.require=s(a),a.restrict=a.restrict||"EA",a.$$moduleName=r.$$moduleName,i.push(a)}catch(u){e(u)}}),i}])),c[t].push(e)):r(t,o(P)),this},this.component=function(t,n){function e(t){function e(n){return S(n)||Zr(n)?function(e,r){return t.invoke(n,this,{$element:e,$attrs:r})}:n}var o=n.template||n.templateUrl?n.template:"",a={controller:i,controllerAs:bn(n.controller)||n.controllerAs||"$ctrl",template:e(o),templateUrl:e(n.templateUrl),transclude:n.transclude,scope:{},bindToController:n.bindings||{},restrict:"E",require:n.require};return r(n,function(t,n){"$"===n.charAt(0)&&(a[n]=t)}),a}var i=n.controller||function(){};return r(n,function(t,n){"$"===n.charAt(0)&&(e[n]=t,S(i)&&(i[n]=t))}),e.$inject=["$injector"],this.directive(t,e)},this.aHrefSanitizationWhitelist=function(t){return y(t)?(e.aHrefSanitizationWhitelist(t),this):e.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(e.imgSrcSanitizationWhitelist(t),this):e.imgSrcSanitizationWhitelist()};var A=!0;this.debugInfoEnabled=function(t){return y(t)?(A=t,this):A};var E=10;this.onChangesTtl=function(t){return arguments.length?(E=t,this):E},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(n,e,i,o,u,s,v,M,P,T){function L(){try{if(!--Ct)throw $t=void 0,Hi("infchng","{0} $onChanges() iterations reached. Aborting!\n",E);v.$apply(function(){for(var t=[],n=0,e=$t.length;n<e;++n)try{$t[n]()}catch(r){t.push(r)}if($t=void 0,t.length)throw t})}finally{Ct++}}function j(t,n){if(n){var e,r,i,o=Object.keys(n);for(e=0,r=o.length;e<r;e++)i=o[e],this[i]=n[i]}else this.$attr={};this.$$element=t}function N(t,n,e){xt.innerHTML="<span "+n+">";var r=xt.firstChild.attributes,i=r[0];r.removeNamedItem(i.name),i.value=e,t.attributes.setNamedItem(i)}function R(t,n){try{t.addClass(n)}catch(e){}}function I(n,e,r,i,o){n instanceof Fr||(n=Fr(n));for(var a=/\S+/,u=0,s=n.length;u<s;u++){var l=n[u];l.nodeType===ui&&l.nodeValue.match(a)&&At(l,n[u]=t.document.createElement("span"))}var c=U(n,e,n,r,i,o);I.$$addScopeClass(n);var f=null;return function(t,e,r){lt(t,"scope"),o&&o.needsNewScope&&(t=t.$parent.$new()),r=r||{};var i=r.parentBoundTranscludeFn,a=r.transcludeControllers,u=r.futureParentElement;i&&i.$$boundTransclude&&(i=i.$$boundTransclude),f||(f=z(u));var s;if(s="html"!==f?Fr(ft(f,Fr("<div>").append(n).html())):e?Mi.clone.call(n):n,a)for(var l in a)s.data("$"+l+"Controller",a[l].instance);return I.$$addScopeInfo(s,t),e&&e(s,t),c&&c(t,s,s,i),s}}function z(t){var n=t&&t[0];return n&&"foreignobject"!==D(n)&&Ur.call(n).match(/SVG/)?"svg":"html"}function U(t,n,e,r,i,o){function a(t,e,r,i){var o,a,u,s,l,c,f,h,v;if(p){var g=e.length;for(v=new Array(g),l=0;l<d.length;l+=3)f=d[l],v[f]=e[f]}else v=e;for(l=0,c=d.length;l<c;)u=v[d[l++]],o=d[l++],a=d[l++],o?(o.scope?(s=t.$new(),I.$$addScopeInfo(Fr(u),s)):s=t,h=o.transcludeOnThisElement?W(t,o.transclude,i):!o.templateOnThisElement&&i?i:!i&&n?W(t,n):null,o(a,s,u,r,h)):a&&a(t,u.childNodes,void 0,i)}for(var u,s,l,c,f,h,p,d=[],v=0;v<t.length;v++)u=new j,s=H(t[v],[],u,0===v?r:void 0,i),l=s.length?K(s,t[v],u,n,e,null,[],[],o):null,l&&l.scope&&I.$$addScopeClass(u.$$element),f=l&&l.terminal||!(c=t[v].childNodes)||!c.length?null:U(c,l?(l.transcludeOnThisElement||!l.templateOnThisElement)&&l.transclude:n),(l||f)&&(d.push(v,l,f),h=!0,p=p||l),o=null;return h?a:null}function W(t,n,e){function r(r,i,o,a,u){return r||(r=t.$new(!1,u),r.$$transcluded=!0),n(r,i,{parentBoundTranscludeFn:e,transcludeControllers:o,futureParentElement:a})}var i=r.$$slots=dt();for(var o in n.$$slots)n.$$slots[o]?i[o]=W(t,n.$$slots[o],e):i[o]=null;return r}function H(t,n,e,r,i){var o,a,u=t.nodeType,s=e.$attr;switch(u){case oi:et(n,mn(D(t)),"E",r,i);for(var l,c,f,h,p,d,v=t.attributes,g=0,m=v&&v.length;g<m;g++){var y=!1,w=!1;l=v[g],c=l.name,p=Jr(l.value),h=mn(c),(d=kt.test(h))&&(c=c.replace(Gi,"").substr(8).replace(/_(.)/g,function(t,n){return n.toUpperCase()}));var C=h.match(Et);C&&rt(C[1])&&(y=c,w=c.substr(0,c.length-5)+"end",c=c.substr(0,c.length-6)),f=mn(c.toLowerCase()),s[f]=c,!d&&e.hasOwnProperty(f)||(e[f]=p,Wt(t,f)&&(e[f]=!0)),pt(t,n,p,f,d),et(n,f,"A",r,i,y,w)}if(a=t.className,$(a)&&(a=a.animVal),x(a)&&""!==a)for(;o=b.exec(a);)f=mn(o[2]),et(n,f,"C",r,i)&&(e[f]=Jr(o[3])),a=a.substr(o.index+o[0].length);break;case ui:if(11===Dr)for(;t.parentNode&&t.nextSibling&&t.nextSibling.nodeType===ui;)t.nodeValue=t.nodeValue+t.nextSibling.nodeValue,t.parentNode.removeChild(t.nextSibling);ct(n,t.nodeValue);break;case si:Y(t,n,e,r,i)}return n.sort(at),n}function Y(t,n,e,r,i){try{var o=g.exec(t.nodeValue);if(o){var a=mn(o[1]);
+et(n,a,"M",r,i)&&(e[a]=Jr(o[2]))}}catch(u){}}function G(t,n,e){var r=[],i=0;if(n&&t.hasAttribute&&t.hasAttribute(n)){do{if(!t)throw Hi("uterdir","Unterminated attribute, found '{0}' but no matching '{1}' found.",n,e);t.nodeType==oi&&(t.hasAttribute(n)&&i++,t.hasAttribute(e)&&i--),r.push(t),t=t.nextSibling}while(i>0)}else r.push(t);return Fr(r)}function Z(t,n,e){return function(r,i,o,a,u){return i=G(i[0],n,e),t(r,i,o,a,u)}}function J(t,n,e,r,i,o){var a;return t?I(n,e,r,i,o):function(){return a||(a=I(n,e,r,i,o),n=e=o=null),a.apply(this,arguments)}}function K(t,n,e,o,a,u,s,c,f){function h(t,n,e,r){t&&(e&&(t=Z(t,e,r)),t.require=d.require,t.directiveName=v,(_===d||d.$$isolateScope)&&(t=gt(t,{isolateScope:!0})),s.push(t)),n&&(e&&(n=Z(n,e,r)),n.require=d.require,n.directiveName=v,(_===d||d.$$isolateScope)&&(n=gt(n,{isolateScope:!0})),c.push(n))}function p(t,o,a,u,f){function h(t,n,e,r){var i;if(k(t)||(r=e,e=n,n=t,t=void 0),O&&(i=b),e||(e=O?A.parent():A),!r)return f(t,n,i,e,F);var o=f.$$slots[r];if(o)return o(t,n,i,e,F);if(m(o))throw Hi("noslot",'No parent directive that requires a transclusion with slot name "{0}". Element: {1}',r,X(A))}var p,d,v,g,y,b,x,A,E,P;n===a?(E=e,A=e.$$element):(A=Fr(a),E=new j(A,e)),y=o,_?g=o.$new(!0):w&&(y=o.$parent),f&&(x=h,x.$$boundTransclude=f,x.isSlotFilled=function(t){return!!f.$$slots[t]}),C&&(b=tt(A,E,x,C,g,o,_)),_&&(I.$$addScopeInfo(A,g,!0,!(M&&(M===_||M===_.$$originalDirective))),I.$$addScopeClass(A,!0),g.$$isolateBindings=_.$$isolateBindings,P=yt(o,E,g,g.$$isolateBindings,_),P.removeWatches&&g.$on("$destroy",P.removeWatches));for(var T in b){var L=C[T],N=b[T],R=L.$$bindings.bindToController;N.identifier&&R?N.bindingInfo=yt(y,E,N.instance,R,L):N.bindingInfo={};var D=N();D!==N.instance&&(N.instance=D,A.data("$"+L.name+"Controller",D),N.bindingInfo.removeWatches&&N.bindingInfo.removeWatches(),N.bindingInfo=yt(y,E,N.instance,R,L))}for(r(C,function(t,n){var e=t.require;t.bindToController&&!Zr(e)&&$(e)&&l(b[n].instance,Q(n,e,A,b))}),r(b,function(t){var n=t.instance;if(S(n.$onChanges))try{n.$onChanges(t.bindingInfo.initialChanges)}catch(e){i(e)}if(S(n.$onInit))try{n.$onInit()}catch(e){i(e)}S(n.$doCheck)&&(y.$watch(function(){n.$doCheck()}),n.$doCheck()),S(n.$onDestroy)&&y.$on("$destroy",function(){n.$onDestroy()})}),p=0,d=s.length;p<d;p++)v=s[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);var F=o;for(_&&(_.template||null===_.templateUrl)&&(F=g),t&&t(F,a.childNodes,void 0,f),p=c.length-1;p>=0;p--)v=c[p],mt(v,v.isolateScope?g:o,A,E,v.require&&Q(v.directiveName,v.require,A,b),x);r(b,function(t){var n=t.instance;S(n.$postLink)&&n.$postLink()})}f=f||{};for(var d,v,g,y,b,x=-Number.MAX_VALUE,w=f.newScopeDirective,C=f.controllerDirectives,_=f.newIsolateScopeDirective,M=f.templateDirective,A=f.nonTlbTranscludeDirective,E=!1,P=!1,O=f.hasElementTranscludeDirective,T=e.$$element=Fr(n),L=u,N=o,R=!1,F=!1,q=0,z=t.length;q<z;q++){d=t[q];var U=d.$$start,W=d.$$end;if(U&&(T=G(n,U,W)),g=void 0,x>d.priority)break;if((b=d.scope)&&(d.templateUrl||($(b)?(st("new/isolated scope",_||w,d,T),_=d):st("new/isolated scope",_,d,T)),w=w||d),v=d.name,!R&&(d.replace&&(d.templateUrl||d.template)||d.transclude&&!d.$$tlb)){for(var Y,K=q+1;Y=t[K++];)if(Y.transclude&&!Y.$$tlb||Y.replace&&(Y.templateUrl||Y.template)){F=!0;break}R=!0}if(!d.templateUrl&&d.controller&&(b=d.controller,C=C||dt(),st("'"+v+"' controller",C[v],d,T),C[v]=d),b=d.transclude)if(E=!0,d.$$tlb||(st("transclusion",A,d,T),A=d),"element"==b)O=!0,x=d.priority,g=T,T=e.$$element=Fr(I.$$createComment(v,e[v])),n=T[0],vt(a,V(g),n),g[0].$$parentNode=g[0].parentNode,N=J(F,g,o,x,L&&L.name,{nonTlbTranscludeDirective:A});else{var et=dt();if(g=Fr(Pt(n)).contents(),$(b)){g=[];var rt=dt(),at=dt();r(b,function(t,n){var e="?"===t.charAt(0);t=e?t.substring(1):t,rt[t]=n,et[n]=null,at[n]=e}),r(T.contents(),function(t){var n=rt[mn(D(t))];n?(at[n]=!0,et[n]=et[n]||[],et[n].push(t)):g.push(t)}),r(at,function(t,n){if(!t)throw Hi("reqslot","Required transclusion slot `{0}` was not filled.",n)});for(var ut in et)et[ut]&&(et[ut]=J(F,et[ut],o))}T.empty(),N=J(F,g,o,void 0,void 0,{needsNewScope:d.$$isolateScope||d.$$newScope}),N.$$slots=et}if(d.template)if(P=!0,st("template",M,d,T),M=d,b=S(d.template)?d.template(T,e):d.template,b=Mt(b),d.replace){if(L=d,g=wt(b)?[]:$n(ft(d.templateNamespace,Jr(b))),n=g[0],1!=g.length||n.nodeType!==oi)throw Hi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",v,"");vt(a,T,n);var lt={$attr:{}},ct=H(n,[],lt),ht=t.splice(q+1,t.length-(q+1));(_||w)&&nt(ct,_,w),t=t.concat(ct).concat(ht),it(e,lt),z=t.length}else T.html(b);if(d.templateUrl)P=!0,st("template",M,d,T),M=d,d.replace&&(L=d),p=ot(t.splice(q,t.length-q),T,e,a,E&&N,s,c,{controllerDirectives:C,newScopeDirective:w!==d&&w,newIsolateScopeDirective:_,templateDirective:M,nonTlbTranscludeDirective:A}),z=t.length;else if(d.compile)try{y=d.compile(T,e,N);var pt=d.$$originalDirective||d;S(y)?h(null,B(pt,y),U,W):y&&h(B(pt,y.pre),B(pt,y.post),U,W)}catch($t){i($t,X(T))}d.terminal&&(p.terminal=!0,x=Math.max(x,d.priority))}return p.scope=w&&w.scope===!0,p.transcludeOnThisElement=E,p.templateOnThisElement=P,p.transclude=N,f.hasElementTranscludeDirective=O,p}function Q(t,n,e,i){var o;if(x(n)){var a=n.match(C),u=n.substring(a[0].length),s=a[1]||a[3],l="?"===a[2];if("^^"===s?e=e.parent():(o=i&&i[u],o=o&&o.instance),!o){var c="$"+u+"Controller";o=s?e.inheritedData(c):e.data(c)}if(!o&&!l)throw Hi("ctreq","Controller '{0}', required by directive '{1}', can't be found!",u,t)}else if(Zr(n)){o=[];for(var f=0,h=n.length;f<h;f++)o[f]=Q(t,n[f],e,i)}else $(n)&&(o={},r(n,function(n,r){o[r]=Q(t,n,e,i)}));return o||null}function tt(t,n,e,r,i,o,a){var u=dt();for(var l in r){var c=r[l],f={$scope:c===a||c.$$isolateScope?i:o,$element:t,$attrs:n,$transclude:e},h=c.controller;"@"==h&&(h=n[c.name]);var p=s(h,f,!0,c.controllerAs);u[c.name]=p,t.data("$"+c.name+"Controller",p.instance)}return u}function nt(t,n,e){for(var r=0,i=t.length;r<i;r++)t[r]=h(t[r],{$$isolateScope:n,$$newScope:e})}function et(t,e,r,o,u,s,l){if(e===u)return null;var p=null;if(c.hasOwnProperty(e))for(var d,v=n.get(e+f),g=0,y=v.length;g<y;g++)try{if(d=v[g],(m(o)||o>d.priority)&&d.restrict.indexOf(r)!=-1){if(s&&(d=h(d,{$$start:s,$$end:l})),!d.$$bindings){var b=d.$$bindings=a(d,d.name);$(b.isolateScope)&&(d.$$isolateBindings=b.isolateScope)}t.push(d),p=d}}catch(x){i(x)}return p}function rt(t){if(c.hasOwnProperty(t))for(var e,r=n.get(t+f),i=0,o=r.length;i<o;i++)if(e=r[i],e.multiElement)return!0;return!1}function it(t,n){var e=n.$attr,i=t.$attr;t.$$element;r(t,function(r,i){"$"!=i.charAt(0)&&(n[i]&&n[i]!==r&&(r+=("style"===i?";":" ")+n[i]),t.$set(i,r,!0,e[i]))}),r(n,function(n,r){t.hasOwnProperty(r)||"$"===r.charAt(0)||(t[r]=n,"class"!==r&&"style"!==r&&(i[r]=e[r]))})}function ot(t,n,e,i,a,u,s,l){var c,f,p=[],d=n[0],v=t.shift(),g=h(v,{templateUrl:null,transclude:null,replace:null,$$originalDirective:v}),m=S(v.templateUrl)?v.templateUrl(n,e):v.templateUrl,y=v.templateNamespace;return n.empty(),o(m).then(function(o){var h,b,x,w;if(o=Mt(o),v.replace){if(x=wt(o)?[]:$n(ft(y,Jr(o))),h=x[0],1!=x.length||h.nodeType!==oi)throw Hi("tplrt","Template for directive '{0}' must have exactly one root element. {1}",v.name,m);b={$attr:{}},vt(i,n,h);var C=H(h,[],b);$(v.scope)&&nt(C,!0),t=C.concat(t),it(e,b)}else h=d,n.html(o);for(t.unshift(g),c=K(t,h,e,a,n,v,u,s,l),r(i,function(t,e){t==h&&(i[e]=n[0])}),f=U(n[0].childNodes,a);p.length;){var S=p.shift(),_=p.shift(),M=p.shift(),k=p.shift(),A=n[0];if(!S.$$destroyed){if(_!==d){var E=_.className;l.hasElementTranscludeDirective&&v.replace||(A=Pt(h)),vt(M,Fr(_),A),R(Fr(A),E)}w=c.transcludeOnThisElement?W(S,c.transclude,k):k,c(f,S,A,i,w)}}p=null}),function(t,n,e,r,i){var o=i;n.$$destroyed||(p?p.push(n,e,r,o):(c.transcludeOnThisElement&&(o=W(n,c.transclude,i)),c(f,n,e,r,o)))}}function at(t,n){var e=n.priority-t.priority;return 0!==e?e:t.name!==n.name?t.name<n.name?-1:1:t.index-n.index}function st(t,n,e,r){function i(t){return t?" (module: "+t+")":""}if(n)throw Hi("multidir","Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}",n.name,i(n.$$moduleName),e.name,i(e.$$moduleName),t,X(r))}function ct(t,n){var r=e(n,!0);r&&t.push({priority:0,compile:function(t){var n=t.parent(),e=!!n.length;return e&&I.$$addBindingClass(n),function(t,n){var i=n.parent();e||I.$$addBindingClass(i),I.$$addBindingInfo(i,r.expressions),t.$watch(r,function(t){n[0].nodeValue=t})}}})}function ft(n,e){switch(n=Lr(n||"html")){case"svg":case"math":var r=t.document.createElement("div");return r.innerHTML="<"+n+">"+e+"</"+n+">",r.childNodes[0].childNodes;default:return e}}function ht(t,n){if("srcdoc"==n)return M.HTML;var e=D(t);return"xlinkHref"==n||"form"==e&&"action"==n||"img"!=e&&("src"==n||"ngSrc"==n)?M.RESOURCE_URL:void 0}function pt(t,n,r,i,o){var a=ht(t,i);o=w[i]||o;var u=e(r,!0,a,o);if(u){if("multiple"===i&&"select"===D(t))throw Hi("selmulti","Binding to the 'multiple' attribute is not supported. Element: {0}",X(t));n.push({priority:100,compile:function(){return{pre:function(t,n,s){var l=s.$$observers||(s.$$observers=dt());if(_.test(i))throw Hi("nodomevents","Interpolations for HTML DOM event attributes are disallowed.  Please use the ng- versions (such as ng-click instead of onclick) instead.");var c=s[i];c!==r&&(u=c&&e(c,!0,a,o),r=c),u&&(s[i]=u(t),(l[i]||(l[i]=[])).$$inter=!0,(s.$$observers&&s.$$observers[i].$$scope||t).$watch(u,function(t,n){"class"===i&&t!=n?s.$updateClass(t,n):s.$set(i,t)}))}}}})}}function vt(n,e,r){var i,o,a=e[0],u=e.length,s=a.parentNode;if(n)for(i=0,o=n.length;i<o;i++)if(n[i]==a){n[i++]=r;for(var l=i,c=l+u-1,f=n.length;l<f;l++,c++)c<f?n[l]=n[c]:delete n[l];n.length-=u-1,n.context===a&&(n.context=r);break}s&&s.replaceChild(r,a);var h=t.document.createDocumentFragment();for(i=0;i<u;i++)h.appendChild(e[i]);for(Fr.hasData(a)&&(Fr.data(r,Fr.data(a)),Fr(a).off("$destroy")),Fr.cleanData(h.querySelectorAll("*")),i=1;i<u;i++)delete e[i];e[0]=r,e.length=1}function gt(t,n){return l(function(){return t.apply(null,arguments)},t,n)}function mt(t,n,e,r,o,a){try{t(n,e,r,o,a)}catch(u){i(u,X(e))}}function yt(t,n,i,o,a){function s(n,e,r){S(i.$onChanges)&&e!==r&&($t||(t.$$postDigest(L),$t=[]),c||(c={},$t.push(l)),c[n]&&(r=c[n].previousValue),c[n]=new gn(r,e))}function l(){i.$onChanges(c),c=void 0}var c,f=[],h={};return r(o,function(r,o){var l,c,d,v,g,m=r.attrName,y=r.optional,$=r.mode;switch($){case"@":y||Tr.call(n,m)||(i[o]=n[m]=void 0),n.$observe(m,function(t){if(x(t)||O(t)){var n=i[o];s(o,t,n),i[o]=t}}),n.$$observers[m].$$scope=t,l=n[m],x(l)?i[o]=e(l)(t):O(l)&&(i[o]=l),h[o]=new gn(Yi,i[o]);break;case"=":if(!Tr.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]),v=c.literal?q:function(t,n){return t===n||t!==t&&n!==n},d=c.assign||function(){throw l=i[o]=c(t),Hi("nonassign","Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!",n[m],m,a.name)},l=i[o]=c(t);var b=function(n){return v(n,i[o])||(v(n,l)?d(t,n=i[o]):i[o]=n),l=n};b.$stateful=!0,g=r.collection?t.$watchCollection(n[m],b):t.$watch(u(n[m],b),null,c.literal),f.push(g);break;case"<":if(!Tr.call(n,m)){if(y)break;n[m]=void 0}if(y&&!n[m])break;c=u(n[m]);var w=i[o]=c(t);h[o]=new gn(Yi,i[o]),g=t.$watch(c,function(t,n){if(n===t){if(n===w)return;n=w}s(o,t,n),i[o]=t},c.literal),f.push(g);break;case"&":if(c=n.hasOwnProperty(m)?u(n[m]):p,c===p&&y)break;i[o]=function(n){return c(t,n)}}}),{initialChanges:h,removeWatches:f.length&&function(){for(var t=0,n=f.length;t<n;++t)f[t]()}}}var $t,bt=/^\w/,xt=t.document.createElement("div"),Ct=E;j.prototype={$normalize:mn,$addClass:function(t){t&&t.length>0&&P.addClass(this.$$element,t)},$removeClass:function(t){t&&t.length>0&&P.removeClass(this.$$element,t)},$updateClass:function(t,n){var e=yn(t,n);e&&e.length&&P.addClass(this.$$element,e);var r=yn(n,t);r&&r.length&&P.removeClass(this.$$element,r)},$set:function(t,n,e,o){var a,u=this.$$element[0],s=Wt(u,t),l=Ht(t),c=t;if(s?(this.$$element.prop(t,n),o=s):l&&(this[l]=n,c=l),this[t]=n,o?this.$attr[t]=o:(o=this.$attr[t],o||(this.$attr[t]=o=ut(t,"-"))),a=D(this.$$element),"a"===a&&("href"===t||"xlinkHref"===t)||"img"===a&&"src"===t)this[t]=n=T(n,"src"===t);else if("img"===a&&"srcset"===t&&y(n)){for(var f="",h=Jr(n),p=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,d=/\s/.test(h)?p:/(,)/,v=h.split(d),g=Math.floor(v.length/2),$=0;$<g;$++){var b=2*$;f+=T(Jr(v[b]),!0),f+=" "+Jr(v[b+1])}var x=Jr(v[2*$]).split(/\s/);f+=T(Jr(x[0]),!0),2===x.length&&(f+=" "+Jr(x[1])),this[t]=n=f}e!==!1&&(null===n||m(n)?this.$$element.removeAttr(o):bt.test(o)?this.$$element.attr(o,n):N(this.$$element[0],o,n));var w=this.$$observers;w&&r(w[c],function(t){try{t(n)}catch(e){i(e)}})},$observe:function(t,n){var e=this,r=e.$$observers||(e.$$observers=dt()),i=r[t]||(r[t]=[]);return i.push(n),v.$evalAsync(function(){i.$$inter||!e.hasOwnProperty(t)||m(e[t])||n(e[t])}),function(){F(i,n)}}};var St=e.startSymbol(),_t=e.endSymbol(),Mt="{{"==St&&"}}"==_t?d:function(t){return t.replace(/\{\{/g,St).replace(/}}/g,_t)},kt=/^ngAttr[A-Z]/,Et=/^(.+)Start$/;return I.$$addBindingInfo=A?function(t,n){var e=t.data("$binding")||[];Zr(n)?e=e.concat(n):e.push(n),t.data("$binding",e)}:p,I.$$addBindingClass=A?function(t){R(t,"ng-binding")}:p,I.$$addScopeInfo=A?function(t,n,e,r){var i=e?r?"$isolateScopeNoTemplate":"$isolateScope":"$scope";t.data(i,n)}:p,I.$$addScopeClass=A?function(t,n){R(t,n?"ng-isolate-scope":"ng-scope")}:p,I.$$createComment=function(n,e){var r="";return A&&(r=" "+(n||"")+": ",e&&(r+=e+" ")),t.document.createComment(r)},I}]}function gn(t,n){this.previousValue=t,this.currentValue=n}function mn(t){return xt(t.replace(Gi,""))}function yn(t,n){var e="",r=t.split(/\s+/),i=n.split(/\s+/);t:for(var o=0;o<r.length;o++){for(var a=r[o],u=0;u<i.length;u++)if(a==i[u])continue t;e+=(e.length>0?" ":"")+a}return e}function $n(t){t=Fr(t);var n=t.length;if(n<=1)return t;for(;n--;){var e=t[n];e.nodeType===si&&Vr.call(t,n,1)}return t}function bn(t,n){if(n&&x(n))return n;if(x(t)){var e=Xi.exec(t);if(e)return e[3]}}function xn(){var t={},e=!1;this.has=function(n){return t.hasOwnProperty(n)},this.register=function(n,e){ft(n,"controller"),$(n)?l(t,n):t[n]=e},this.allowGlobals=function(){e=!0},this.$get=["$injector","$window",function(r,i){function o(t,e,r,i){if(!t||!$(t.$scope))throw n("$controller")("noscp","Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",i,e);t.$scope[e]=r}return function(n,a,u,s){var c,f,h,p;if(u=u===!0,s&&x(s)&&(p=s),x(n)){if(f=n.match(Xi),!f)throw Zi("ctrlfmt","Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.",n);h=f[1],p=p||f[3],n=t.hasOwnProperty(h)?t[h]:ht(a.$scope,h,!0)||(e?ht(i,h,!0):void 0),ct(n,h,!0)}if(u){var d=(Zr(n)?n[n.length-1]:n).prototype;c=Object.create(d||null),p&&o(a,p,c,h||n.name);var v;return v=l(function(){var t=r.invoke(n,c,a,h);return t!==c&&($(t)||S(t))&&(c=t,p&&o(a,p,c,h||n.name)),c},{instance:c,identifier:p})}return c=r.instantiate(n,a,h),p&&o(a,p,c,h||n.name),c}}]}function wn(){this.$get=["$window",function(t){return Fr(t.document)}]}function Cn(){this.$get=["$log",function(t){return function(n,e){t.error.apply(t,arguments)}}]}function Sn(t){return $(t)?C(t)?t.toISOString():W(t):t}function _n(){this.$get=function(){return function(t){if(!t)return"";var n=[];return i(t,function(t,e){null===t||m(t)||(Zr(t)?r(t,function(t){n.push(nt(e)+"="+nt(Sn(t)))}):n.push(nt(e)+"="+nt(Sn(t))))}),n.join("&")}}}function Mn(){this.$get=function(){return function(t){function n(t,o,a){null===t||m(t)||(Zr(t)?r(t,function(t,e){n(t,o+"["+($(t)?e:"")+"]")}):$(t)&&!C(t)?i(t,function(t,e){n(t,o+(a?"":"[")+e+(a?"":"]"))}):e.push(nt(o)+"="+nt(Sn(t))))}if(!t)return"";var e=[];return n(t,"",!0),e.join("&")}}}function kn(t,n){if(x(t)){var e=t.replace(eo,"").trim();if(e){var r=n("Content-Type");(r&&0===r.indexOf(Ki)||An(e))&&(t=H(e))}}return t}function An(t){var n=t.match(to);return n&&no[n[0]].test(t)}function En(t){function n(t,n){t&&(i[t]=i[t]?i[t]+", "+n:n)}var e,i=dt();return x(t)?r(t.split("\n"),function(t){e=t.indexOf(":"),n(Lr(Jr(t.substr(0,e))),Jr(t.substr(e+1)))}):$(t)&&r(t,function(t,e){n(Lr(e),Jr(t))}),i}function Pn(t){var n;return function(e){if(n||(n=En(t)),e){var r=n[Lr(e)];return void 0===r&&(r=null),r}return n}}function On(t,n,e,i){return S(i)?i(t,n,e):(r(i,function(r){t=r(t,n,e)}),t)}function Tn(t){return 200<=t&&t<300}function Ln(){var t=this.defaults={transformResponse:[kn],transformRequest:[function(t){return!$(t)||A(t)||P(t)||E(t)?t:W(t)}],headers:{common:{Accept:"application/json, text/plain, */*"},post:gt(Qi),put:gt(Qi),patch:gt(Qi)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},e=!1;this.useApplyAsync=function(t){return y(t)?(e=!!t,this):e};var i=!0;this.useLegacyPromiseExtensions=function(t){return y(t)?(i=!!t,this):i};var o=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(a,u,s,c,f,h){function p(e){function o(t,n){for(var e=0,r=n.length;e<r;){var i=n[e++],o=n[e++];t=t.then(i,o)}return n.length=0,t}function a(t,n){var e,i={};return r(t,function(t,r){S(t)?(e=t(n),null!=e&&(i[r]=e)):i[r]=t}),i}function u(n){var e,r,i,o=t.headers,u=l({},n.headers);o=l({},o.common,o[Lr(n.method)]);t:for(e in o){r=Lr(e);for(i in u)if(Lr(i)===r)continue t;u[e]=o[e]}return a(u,gt(n))}function s(n){var e=n.headers,i=On(n.data,Pn(e),void 0,n.transformRequest);return m(i)&&r(e,function(t,n){"content-type"===Lr(n)&&delete e[n]}),m(n.withCredentials)&&!m(t.withCredentials)&&(n.withCredentials=t.withCredentials),g(n,i).then(c,c)}function c(t){var n=l({},t);return n.data=On(t.data,t.headers,t.status,p.transformResponse),Tn(t.status)?n:f.reject(n)}if(!$(e))throw n("$http")("badreq","Http request configuration must be an object.  Received: {0}",e);if(!x(e.url))throw n("$http")("badreq","Http request configuration url must be a string.  Received: {0}",e.url);var p=l({method:"get",transformRequest:t.transformRequest,transformResponse:t.transformResponse,paramSerializer:t.paramSerializer},e);p.headers=u(e),p.method=jr(p.method),p.paramSerializer=x(p.paramSerializer)?h.get(p.paramSerializer):p.paramSerializer;var d=[],v=[],y=f.when(p);return r(C,function(t){(t.request||t.requestError)&&d.unshift(t.request,t.requestError),(t.response||t.responseError)&&v.push(t.response,t.responseError)}),y=o(y,d),y=y.then(s),y=o(y,v),i?(y.success=function(t){return ct(t,"fn"),y.then(function(n){t(n.data,n.status,n.headers,p)}),y},y.error=function(t){return ct(t,"fn"),y.then(null,function(n){t(n.data,n.status,n.headers,p)}),y}):(y.success=io("success"),y.error=io("error")),y}function d(t){r(arguments,function(t){p[t]=function(n,e){return p(l({},e||{},{method:t,url:n}))}})}function v(t){r(arguments,function(t){p[t]=function(n,e,r){return p(l({},r||{},{method:t,url:n,data:e}))}})}function g(n,i){function o(t){if(t){var n={};return r(t,function(t,r){n[r]=function(n){function r(){t(n)}e?c.$applyAsync(r):c.$$phase?r():c.$apply(r)}}),n}}function s(t,n,r,i){function o(){l(n,t,r,i)}v&&(Tn(t)?v.put(_,[t,n,En(r),i]):v.remove(_)),e?c.$applyAsync(o):(o(),c.$$phase||c.$apply())}function l(t,e,r,i){e=e>=-1?e:0,(Tn(e)?x.resolve:x.reject)({data:t,status:e,headers:Pn(r),config:n,statusText:i})}function h(t){l(t.data,t.status,gt(t.headers()),t.statusText)}function d(){var t=p.pendingRequests.indexOf(n);t!==-1&&p.pendingRequests.splice(t,1)}var v,g,x=f.defer(),C=x.promise,S=n.headers,_=b(n.url,n.paramSerializer(n.params));if(p.pendingRequests.push(n),C.then(d,d),!n.cache&&!t.cache||n.cache===!1||"GET"!==n.method&&"JSONP"!==n.method||(v=$(n.cache)?n.cache:$(t.cache)?t.cache:w),v&&(g=v.get(_),y(g)?T(g)?g.then(h,h):Zr(g)?l(g[1],g[0],gt(g[2]),g[3]):l(g,200,{},"OK"):v.put(_,C)),m(g)){var M=Ne(n.url)?u()[n.xsrfCookieName||t.xsrfCookieName]:void 0;M&&(S[n.xsrfHeaderName||t.xsrfHeaderName]=M),a(n.method,_,i,s,S,n.timeout,n.withCredentials,n.responseType,o(n.eventHandlers),o(n.uploadEventHandlers))}return C}function b(t,n){return n.length>0&&(t+=(t.indexOf("?")==-1?"?":"&")+n),t}var w=s("$http");t.paramSerializer=x(t.paramSerializer)?h.get(t.paramSerializer):t.paramSerializer;var C=[];return r(o,function(t){C.unshift(x(t)?h.get(t):h.invoke(t))}),p.pendingRequests=[],d("get","delete","head","jsonp"),v("post","put","patch"),p.defaults=t,p}]}function jn(){this.$get=function(){return function(){return new t.XMLHttpRequest}}}function Nn(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(t,n,e,r){return Rn(t,r,t.defer,n,e[0])}]}function Rn(t,n,e,i,o){function a(t,n,e){t=t.replace("JSON_CALLBACK",n);var r=o.createElement("script"),a=null;return r.type="text/javascript",r.src=t,r.async=!0,a=function(t){vi(r,"load",a),vi(r,"error",a),o.body.removeChild(r),r=null;var u=-1,s="unknown";t&&("load"!==t.type||i.wasCalled(n)||(t={type:"error"}),s=t.type,u="error"===t.type?404:200),e&&e(u,s)},di(r,"load",a),di(r,"error",a),o.body.appendChild(r),a}return function(o,u,s,l,c,f,h,d,v,g){function $(){w&&w(),C&&C.abort()}function b(n,r,i,o,a){y(M)&&e.cancel(M),w=C=null,n(r,i,o,a),t.$$completeOutstandingRequest(p)}if(t.$$incOutstandingRequestCount(),u=u||t.url(),"jsonp"===Lr(o))var x=i.createCallback(u),w=a(u,x,function(t,n){var e=200===t&&i.getResponse(x);b(l,t,e,"",n),i.removeCallback(x)});else{var C=n(o,u);C.open(o,u,!0),r(c,function(t,n){y(t)&&C.setRequestHeader(n,t)}),C.onload=function(){var t=C.statusText||"",n="response"in C?C.response:C.responseText,e=1223===C.status?204:C.status;0===e&&(e=n?200:"file"==je(u).protocol?404:0),b(l,e,n,C.getAllResponseHeaders(),t)};var S=function(){b(l,-1,null,null,"")};if(C.onerror=S,C.onabort=S,r(v,function(t,n){C.addEventListener(n,t)}),r(g,function(t,n){C.upload.addEventListener(n,t)}),h&&(C.withCredentials=!0),d)try{C.responseType=d}catch(_){if("json"!==d)throw _}C.send(m(s)?null:s)}if(f>0)var M=e($,f);else T(f)&&f.then($)}}function Dn(){var t="{{",n="}}";this.startSymbol=function(n){return n?(t=n,this):t},this.endSymbol=function(t){return t?(n=t,this):n},this.$get=["$parse","$exceptionHandler","$sce",function(e,r,i){function o(t){return"\\\\\\"+t}function a(e){return e.replace(p,t).replace(d,n)}function u(t){if(null==t)return"";switch(typeof t){case"string":break;case"number":t=""+t;break;default:t=W(t)}return t}function s(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function c(o,c,p,d){function g(t){try{return t=T(t),d&&!y(t)?t:u(t)}catch(n){r(oo.interr(o,n))}}if(!o.length||o.indexOf(t)===-1){var $;if(!c){var b=a(o);$=v(b),$.exp=o,$.expressions=[],$.$$watchDelegate=s}return $}d=!!d;for(var x,w,C,_=0,M=[],k=[],A=o.length,E=[],P=[];_<A;){if((x=o.indexOf(t,_))==-1||(w=o.indexOf(n,x+f))==-1){_!==A&&E.push(a(o.substring(_)));break}_!==x&&E.push(a(o.substring(_,x))),C=o.substring(x+f,w),M.push(C),k.push(e(C,g)),_=w+h,P.push(E.length),E.push("")}if(p&&E.length>1&&oo.throwNoconcat(o),!c||M.length){var O=function(t){for(var n=0,e=M.length;n<e;n++){if(d&&m(t[n]))return;E[P[n]]=t[n]}return E.join("")},T=function(t){return p?i.getTrusted(p,t):i.valueOf(t)};return l(function(t){var n=0,e=M.length,i=new Array(e);try{for(;n<e;n++)i[n]=k[n](t);return O(i)}catch(a){r(oo.interr(o,a))}},{exp:o,expressions:M,$$watchDelegate:function(t,n){var e;return t.$watchGroup(k,function(r,i){var o=O(r);S(n)&&n.call(this,o,r!==i?e:o,t),e=o})}})}}var f=t.length,h=n.length,p=new RegExp(t.replace(/./g,o),"g"),d=new RegExp(n.replace(/./g,o),"g");return c.startSymbol=function(){return t},c.endSymbol=function(){return n},c}]}function Fn(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(t,n,e,r,i){function o(o,u,s,l){function c(){f?o.apply(null,h):o(v)}var f=arguments.length>4,h=f?V(arguments,4):[],p=n.setInterval,d=n.clearInterval,v=0,g=y(l)&&!l,m=(g?r:e).defer(),$=m.promise;return s=y(s)?s:0,$.$$intervalId=p(function(){g?i.defer(c):t.$evalAsync(c),m.notify(v++),s>0&&v>=s&&(m.resolve(v),d($.$$intervalId),delete a[$.$$intervalId]),g||t.$apply()},u),a[$.$$intervalId]=m,$}var a={};return o.cancel=function(t){return!!(t&&t.$$intervalId in a)&&(a[t.$$intervalId].reject("canceled"),n.clearInterval(t.$$intervalId),delete a[t.$$intervalId],!0)},o}]}function In(t){for(var n=t.split("/"),e=n.length;e--;)n[e]=tt(n[e]);return n.join("/")}function qn(t,n){var e=je(t);n.$$protocol=e.protocol,n.$$host=e.hostname,n.$$port=f(e.port)||so[e.protocol]||null}function zn(t,n){var e="/"!==t.charAt(0);e&&(t="/"+t);var r=je(t);n.$$path=decodeURIComponent(e&&"/"===r.pathname.charAt(0)?r.pathname.substring(1):r.pathname),n.$$search=K(r.search),n.$$hash=decodeURIComponent(r.hash),n.$$path&&"/"!=n.$$path.charAt(0)&&(n.$$path="/"+n.$$path)}function Vn(t,n){return 0===t.lastIndexOf(n,0)}function Bn(t,n){if(Vn(n,t))return n.substr(t.length)}function Un(t){var n=t.indexOf("#");return n==-1?t:t.substr(0,n)}function Wn(t){return t.replace(/(#.+)|#$/,"$1")}function Hn(t){return t.substr(0,Un(t).lastIndexOf("/")+1)}function Yn(t){return t.substring(0,t.indexOf("/",t.indexOf("//")+2))}function Gn(t,n,e){this.$$html5=!0,e=e||"",qn(t,this),this.$$parse=function(t){var e=Bn(n,t);if(!x(e))throw lo("ipthprfx",'Invalid url "{0}", missing path prefix "{1}".',t,n);zn(e,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var t=Q(this.$$search),e=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(t?"?"+t:"")+e,this.$$absUrl=n+this.$$url.substr(1)},this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a,u;return y(o=Bn(t,r))?(a=o,u=y(o=Bn(e,o))?n+(Bn("/",o)||o):t+a):y(o=Bn(n,r))?u=n+o:n==r+"/"&&(u=n),u&&this.$$parse(u),!!u}}function Zn(t,n,e){qn(t,this),this.$$parse=function(r){function i(t,n,e){var r,i=/^\/[A-Z]:(\/.*)/;return Vn(n,e)&&(n=n.replace(e,"")),i.exec(n)?t:(r=i.exec(t),r?r[1]:t)}var o,a=Bn(t,r)||Bn(n,r);m(a)||"#"!==a.charAt(0)?this.$$html5?o=a:(o="",m(a)&&(t=r,this.replace())):(o=Bn(e,a),m(o)&&(o=a)),zn(o,this),this.$$path=i(this.$$path,o,t),this.$$compose()},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+(this.$$url?e+this.$$url:"")},this.$$parseLinkUrl=function(n,e){return Un(t)==Un(n)&&(this.$$parse(n),!0)}}function Xn(t,n,e){this.$$html5=!0,Zn.apply(this,arguments),this.$$parseLinkUrl=function(r,i){if(i&&"#"===i[0])return this.hash(i.slice(1)),!0;var o,a;return t==Un(r)?o=r:(a=Bn(n,r))?o=t+e+a:n===r+"/"&&(o=n),o&&this.$$parse(o),!!o},this.$$compose=function(){var n=Q(this.$$search),r=this.$$hash?"#"+tt(this.$$hash):"";this.$$url=In(this.$$path)+(n?"?"+n:"")+r,this.$$absUrl=t+e+this.$$url}}function Jn(t){return function(){return this[t]}}function Kn(t,n){return function(e){return m(e)?this[t]:(this[t]=n(e),this.$$compose(),this)}}function Qn(){var t="",n={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(n){return y(n)?(t=n,this):t},this.html5Mode=function(t){return O(t)?(n.enabled=t,this):$(t)?(O(t.enabled)&&(n.enabled=t.enabled),O(t.requireBase)&&(n.requireBase=t.requireBase),O(t.rewriteLinks)&&(n.rewriteLinks=t.rewriteLinks),this):n},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(e,r,i,o,a){function u(t,n,e){var i=l.url(),o=l.$$state;try{r.url(t,n,e),l.$$state=r.state()}catch(a){throw l.url(i),l.$$state=o,a}}function s(t,n){e.$broadcast("$locationChangeSuccess",l.absUrl(),t,l.$$state,n)}var l,c,f,h=r.baseHref(),p=r.url();if(n.enabled){if(!h&&n.requireBase)throw lo("nobase","$location in HTML5 mode requires a <base> tag to be present!");f=Yn(p)+(h||"/"),c=i.history?Gn:Xn}else f=Un(p),c=Zn;var d=Hn(f);l=new c(f,d,"#"+t),l.$$parseLinkUrl(p,p),l.$$state=r.state();var v=/^\s*(javascript|mailto):/i;o.on("click",function(t){if(n.rewriteLinks&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey&&2!=t.which&&2!=t.button){for(var i=Fr(t.target);"a"!==D(i[0]);)if(i[0]===o[0]||!(i=i.parent())[0])return;var u=i.prop("href"),s=i.attr("href")||i.attr("xlink:href");$(u)&&"[object SVGAnimatedString]"===u.toString()&&(u=je(u.animVal).href),v.test(u)||!u||i.attr("target")||t.isDefaultPrevented()||l.$$parseLinkUrl(u,s)&&(t.preventDefault(),l.absUrl()!=r.url()&&(e.$apply(),a.angular["ff-684208-preventDefault"]=!0))}}),Wn(l.absUrl())!=Wn(p)&&r.url(l.absUrl(),!0);var g=!0;return r.onUrlChange(function(t,n){return m(Bn(d,t))?void(a.location.href=t):(e.$evalAsync(function(){var r,i=l.absUrl(),o=l.$$state;t=Wn(t),l.$$parse(t),l.$$state=n,r=e.$broadcast("$locationChangeStart",t,i,n,o).defaultPrevented,l.absUrl()===t&&(r?(l.$$parse(i),l.$$state=o,u(i,!1,o)):(g=!1,s(i,o)))}),void(e.$$phase||e.$digest()))}),e.$watch(function(){var t=Wn(r.url()),n=Wn(l.absUrl()),o=r.state(),a=l.$$replace,c=t!==n||l.$$html5&&i.history&&o!==l.$$state;(g||c)&&(g=!1,e.$evalAsync(function(){var n=l.absUrl(),r=e.$broadcast("$locationChangeStart",n,t,l.$$state,o).defaultPrevented;l.absUrl()===n&&(r?(l.$$parse(t),l.$$state=o):(c&&u(n,a,o===l.$$state?null:l.$$state),s(t,o)))})),l.$$replace=!1}),l}]}function te(){var t=!0,n=this;this.debugEnabled=function(n){return y(n)?(t=n,this):t},this.$get=["$window",function(e){function i(t){return t instanceof Error&&(t.stack?t=t.message&&t.stack.indexOf(t.message)===-1?"Error: "+t.message+"\n"+t.stack:t.stack:t.sourceURL&&(t=t.message+"\n"+t.sourceURL+":"+t.line)),t}function o(t){var n=e.console||{},o=n[t]||n.log||p,a=!1;try{a=!!o.apply}catch(u){}return a?function(){var t=[];return r(arguments,function(n){t.push(i(n))}),o.apply(n,t)}:function(t,n){o(t,null==n?"":n)}}return{log:o("log"),info:o("info"),warn:o("warn"),error:o("error"),debug:function(){var e=o("debug");return function(){t&&e.apply(n,arguments)}}()}}]}function ne(t,n){if("__defineGetter__"===t||"__defineSetter__"===t||"__lookupGetter__"===t||"__lookupSetter__"===t||"__proto__"===t)throw fo("isecfld","Attempting to access a disallowed field in Angular expressions! Expression: {0}",n);return t}function ee(t){return t+""}function re(t,n){if(t){if(t.constructor===t)throw fo("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t.window===t)throw fo("isecwindow","Referencing the Window in Angular expressions is disallowed! Expression: {0}",n);if(t.children&&(t.nodeName||t.prop&&t.attr&&t.find))throw fo("isecdom","Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}",n);if(t===Object)throw fo("isecobj","Referencing Object in Angular expressions is disallowed! Expression: {0}",n)}return t}function ie(t,n){if(t){if(t.constructor===t)throw fo("isecfn","Referencing Function in Angular expressions is disallowed! Expression: {0}",n);if(t===ho||t===po||t===vo)throw fo("isecff","Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}",n)}}function oe(t,n){if(t&&(t===(0).constructor||t===(!1).constructor||t==="".constructor||t==={}.constructor||t===[].constructor||t===Function.constructor))throw fo("isecaf","Assigning to a constructor is disallowed! Expression: {0}",n)}function ae(t,n){return"undefined"!=typeof t?t:n}function ue(t,n){return"undefined"==typeof t?n:"undefined"==typeof n?t:t+n}function se(t,n){var e=t(n);return!e.$stateful}function le(t,n){var e,i;switch(t.type){case $o.Program:e=!0,r(t.body,function(t){le(t.expression,n),e=e&&t.expression.constant}),t.constant=e;break;case $o.Literal:t.constant=!0,t.toWatch=[];break;case $o.UnaryExpression:le(t.argument,n),t.constant=t.argument.constant,t.toWatch=t.argument.toWatch;break;case $o.BinaryExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.left.toWatch.concat(t.right.toWatch);break;case $o.LogicalExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=t.constant?[]:[t];break;case $o.ConditionalExpression:le(t.test,n),le(t.alternate,n),le(t.consequent,n),t.constant=t.test.constant&&t.alternate.constant&&t.consequent.constant,t.toWatch=t.constant?[]:[t];break;case $o.Identifier:t.constant=!1,t.toWatch=[t];break;case $o.MemberExpression:le(t.object,n),t.computed&&le(t.property,n),t.constant=t.object.constant&&(!t.computed||t.property.constant),t.toWatch=[t];break;case $o.CallExpression:
+e=!!t.filter&&se(n,t.callee.name),i=[],r(t.arguments,function(t){le(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=t.filter&&se(n,t.callee.name)?i:[t];break;case $o.AssignmentExpression:le(t.left,n),le(t.right,n),t.constant=t.left.constant&&t.right.constant,t.toWatch=[t];break;case $o.ArrayExpression:e=!0,i=[],r(t.elements,function(t){le(t,n),e=e&&t.constant,t.constant||i.push.apply(i,t.toWatch)}),t.constant=e,t.toWatch=i;break;case $o.ObjectExpression:e=!0,i=[],r(t.properties,function(t){le(t.value,n),e=e&&t.value.constant&&!t.computed,t.value.constant||i.push.apply(i,t.value.toWatch)}),t.constant=e,t.toWatch=i;break;case $o.ThisExpression:t.constant=!1,t.toWatch=[];break;case $o.LocalsExpression:t.constant=!1,t.toWatch=[]}}function ce(t){if(1==t.length){var n=t[0].expression,e=n.toWatch;return 1!==e.length?e:e[0]!==n?e:void 0}}function fe(t){return t.type===$o.Identifier||t.type===$o.MemberExpression}function he(t){if(1===t.body.length&&fe(t.body[0].expression))return{type:$o.AssignmentExpression,left:t.body[0].expression,right:{type:$o.NGValueParameter},operator:"="}}function pe(t){return 0===t.body.length||1===t.body.length&&(t.body[0].expression.type===$o.Literal||t.body[0].expression.type===$o.ArrayExpression||t.body[0].expression.type===$o.ObjectExpression)}function de(t){return t.constant}function ve(t,n){this.astBuilder=t,this.$filter=n}function ge(t,n){this.astBuilder=t,this.$filter=n}function me(t){return"constructor"==t}function ye(t){return S(t.valueOf)?t.valueOf():xo.call(t)}function $e(){var t,n,e=dt(),i=dt(),o={"true":!0,"false":!1,"null":null,undefined:void 0};this.addLiteral=function(t,n){o[t]=n},this.setIdentifierFns=function(e,r){return t=e,n=r,this},this.$get=["$filter",function(a){function u(t,n,r){var o,u,l;switch(r=r||b,typeof t){case"string":t=t.trim(),l=t;var g=r?i:e;if(o=g[l],!o){":"===t.charAt(0)&&":"===t.charAt(1)&&(u=!0,t=t.substring(2));var y=r?$:m,x=new yo(y),w=new bo(x,a,y);o=w.parse(t),o.constant?o.$$watchDelegate=d:u?o.$$watchDelegate=o.literal?h:f:o.inputs&&(o.$$watchDelegate=c),r&&(o=s(o)),g[l]=o}return v(o,n);case"function":return v(t,n);default:return v(p,n)}}function s(t){function n(n,e,r,i){var o=b;b=!0;try{return t(n,e,r,i)}finally{b=o}}if(!t)return t;n.$$watchDelegate=t.$$watchDelegate,n.assign=s(t.assign),n.constant=t.constant,n.literal=t.literal;for(var e=0;t.inputs&&e<t.inputs.length;++e)t.inputs[e]=s(t.inputs[e]);return n.inputs=t.inputs,n}function l(t,n){return null==t||null==n?t===n:("object"!=typeof t||(t=ye(t),"object"!=typeof t))&&(t===n||t!==t&&n!==n)}function c(t,n,e,r,i){var o,a=r.inputs;if(1===a.length){var u=l;return a=a[0],t.$watch(function(t){var n=a(t);return l(n,u)||(o=r(t,void 0,void 0,[n]),u=n&&ye(n)),o},n,e,i)}for(var s=[],c=[],f=0,h=a.length;f<h;f++)s[f]=l,c[f]=null;return t.$watch(function(t){for(var n=!1,e=0,i=a.length;e<i;e++){var u=a[e](t);(n||(n=!l(u,s[e])))&&(c[e]=u,s[e]=u&&ye(u))}return n&&(o=r(t,void 0,void 0,c)),o},n,e,i)}function f(t,n,e,r){var i,o;return i=t.$watch(function(t){return r(t)},function(t,e,r){o=t,S(n)&&n.apply(this,arguments),y(t)&&r.$$postDigest(function(){y(o)&&i()})},e)}function h(t,n,e,i){function o(t){var n=!0;return r(t,function(t){y(t)||(n=!1)}),n}var a,u;return a=t.$watch(function(t){return i(t)},function(t,e,r){u=t,S(n)&&n.call(this,t,e,r),o(t)&&r.$$postDigest(function(){o(u)&&a()})},e)}function d(t,n,e,r){var i;return i=t.$watch(function(t){return i(),r(t)},n,e)}function v(t,n){if(!n)return t;var e=t.$$watchDelegate,r=!1,i=e!==h&&e!==f,o=i?function(e,i,o,a){var u=r&&a?a[0]:t(e,i,o,a);return n(u,e,i)}:function(e,r,i,o){var a=t(e,r,i,o),u=n(a,e,r);return y(a)?u:a};return t.$$watchDelegate&&t.$$watchDelegate!==c?o.$$watchDelegate=t.$$watchDelegate:n.$stateful||(o.$$watchDelegate=c,r=!t.inputs,o.inputs=t.inputs?t.inputs:[t]),o}var g=Qr().noUnsafeEval,m={csp:g,expensiveChecks:!1,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},$={csp:g,expensiveChecks:!0,literals:I(o),isIdentifierStart:S(t)&&t,isIdentifierContinue:S(n)&&n},b=!1;return u.$$runningExpensiveChecks=function(){return b},u}]}function be(){this.$get=["$rootScope","$exceptionHandler",function(t,n){return we(function(n){t.$evalAsync(n)},n)}]}function xe(){this.$get=["$browser","$exceptionHandler",function(t,n){return we(function(n){t.defer(n)},n)}]}function we(t,e){function i(){this.$$state={status:0}}function o(t,n){return function(e){n.call(t,e)}}function a(t){var n,r,i;i=t.pending,t.processScheduled=!1,t.pending=void 0;for(var o=0,a=i.length;o<a;++o){r=i[o][0],n=i[o][t.status];try{S(n)?r.resolve(n(t.value)):1===t.status?r.resolve(t.value):r.reject(t.value)}catch(u){r.reject(u),e(u)}}}function u(n){!n.processScheduled&&n.pending&&(n.processScheduled=!0,t(function(){a(n)}))}function s(){this.promise=new i}function c(t){var n=new s,e=0,i=Zr(t)?[]:{};return r(t,function(t,r){e++,y(t).then(function(t){i.hasOwnProperty(r)||(i[r]=t,--e||n.resolve(i))},function(t){i.hasOwnProperty(r)||n.reject(t)})}),0===e&&n.resolve(i),n.promise}function f(t){var n=p();return r(t,function(t){y(t).then(n.resolve,n.reject)}),n.promise}var h=n("$q",TypeError),p=function(){var t=new s;return t.resolve=o(t,t.resolve),t.reject=o(t,t.reject),t.notify=o(t,t.notify),t};l(i.prototype,{then:function(t,n,e){if(m(t)&&m(n)&&m(e))return this;var r=new s;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([r,t,n,e]),this.$$state.status>0&&u(this.$$state),r.promise},"catch":function(t){return this.then(null,t)},"finally":function(t,n){return this.then(function(n){return g(n,!0,t)},function(n){return g(n,!1,t)},n)}}),l(s.prototype,{resolve:function(t){this.promise.$$state.status||(t===this.promise?this.$$reject(h("qcycle","Expected promise to be resolved with value other than itself '{0}'",t)):this.$$resolve(t))},$$resolve:function(t){function n(t){s||(s=!0,a.$$resolve(t))}function r(t){s||(s=!0,a.$$reject(t))}var i,a=this,s=!1;try{($(t)||S(t))&&(i=t&&t.then),S(i)?(this.promise.$$state.status=-1,i.call(t,n,r,o(this,this.notify))):(this.promise.$$state.value=t,this.promise.$$state.status=1,u(this.promise.$$state))}catch(l){r(l),e(l)}},reject:function(t){this.promise.$$state.status||this.$$reject(t)},$$reject:function(t){this.promise.$$state.value=t,this.promise.$$state.status=2,u(this.promise.$$state)},notify:function(n){var r=this.promise.$$state.pending;this.promise.$$state.status<=0&&r&&r.length&&t(function(){for(var t,i,o=0,a=r.length;o<a;o++){i=r[o][0],t=r[o][3];try{i.notify(S(t)?t(n):n)}catch(u){e(u)}}})}});var d=function(t){var n=new s;return n.reject(t),n.promise},v=function(t,n){var e=new s;return n?e.resolve(t):e.reject(t),e.promise},g=function(t,n,e){var r=null;try{S(e)&&(r=e())}catch(i){return v(i,!1)}return T(r)?r.then(function(){return v(t,n)},function(t){return v(t,!1)}):v(t,n)},y=function(t,n,e,r){var i=new s;return i.resolve(t),i.promise.then(n,e,r)},b=y,x=function(t){function n(t){r.resolve(t)}function e(t){r.reject(t)}if(!S(t))throw h("norslvr","Expected resolverFn, got '{0}'",t);var r=new s;return t(n,e),r.promise};return x.prototype=i.prototype,x.defer=p,x.reject=d,x.when=y,x.resolve=b,x.all=c,x.race=f,x}function Ce(){this.$get=["$window","$timeout",function(t,n){var e=t.requestAnimationFrame||t.webkitRequestAnimationFrame,r=t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.webkitCancelRequestAnimationFrame,i=!!e,o=i?function(t){var n=e(t);return function(){r(n)}}:function(t){var e=n(t,16.66,!1);return function(){n.cancel(e)}};return o.supported=i,o}]}function Se(){function t(t){function n(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=a(),this.$$ChildScope=null}return n.prototype=t,n}var i=10,o=n("$rootScope"),u=null,s=null;this.digestTtl=function(t){return arguments.length&&(i=t),i},this.$get=["$exceptionHandler","$parse","$browser",function(n,l,c){function f(t){t.currentScope.$$destroyed=!0}function h(t){9===Dr&&(t.$$childHead&&h(t.$$childHead),t.$$nextSibling&&h(t.$$nextSibling)),t.$parent=t.$$nextSibling=t.$$prevSibling=t.$$childHead=t.$$childTail=t.$root=t.$$watchers=null}function d(){this.$id=a(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}function v(t){if(_.$$phase)throw o("inprog","{0} already in progress",_.$$phase);_.$$phase=t}function g(){_.$$phase=null}function y(t,n){do t.$$watchersCount+=n;while(t=t.$parent)}function b(t,n,e){do t.$$listenerCount[e]-=n,0===t.$$listenerCount[e]&&delete t.$$listenerCount[e];while(t=t.$parent)}function x(){}function w(){for(;A.length;)try{A.shift()()}catch(t){n(t)}s=null}function C(){null===s&&(s=c.defer(function(){_.$apply(w)}))}d.prototype={constructor:d,$new:function(n,e){var r;return e=e||this,n?(r=new d,r.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=t(this)),r=new this.$$ChildScope),r.$parent=e,r.$$prevSibling=e.$$childTail,e.$$childHead?(e.$$childTail.$$nextSibling=r,e.$$childTail=r):e.$$childHead=e.$$childTail=r,(n||e!=this)&&r.$on("$destroy",f),r},$watch:function(t,n,e,r){var i=l(t);if(i.$$watchDelegate)return i.$$watchDelegate(this,n,e,i,t);var o=this,a=o.$$watchers,s={fn:n,last:x,get:i,exp:r||t,eq:!!e};return u=null,S(n)||(s.fn=p),a||(a=o.$$watchers=[]),a.unshift(s),y(this,1),function(){F(a,s)>=0&&y(o,-1),u=null}},$watchGroup:function(t,n){function e(){s=!1,l?(l=!1,n(o,o,u)):n(o,i,u)}var i=new Array(t.length),o=new Array(t.length),a=[],u=this,s=!1,l=!0;if(!t.length){var c=!0;return u.$evalAsync(function(){c&&n(o,o,u)}),function(){c=!1}}return 1===t.length?this.$watch(t[0],function(t,e,r){o[0]=t,i[0]=e,n(o,t===e?o:i,r)}):(r(t,function(t,n){var r=u.$watch(t,function(t,r){o[n]=t,i[n]=r,s||(s=!0,u.$evalAsync(e))});a.push(r)}),function(){for(;a.length;)a.shift()()})},$watchCollection:function(t,n){function r(t){o=t;var n,r,i,u,s;if(!m(o)){if($(o))if(e(o)){a!==p&&(a=p,g=a.length=0,f++),n=o.length,g!==n&&(f++,a.length=g=n);for(var l=0;l<n;l++)s=a[l],u=o[l],i=s!==s&&u!==u,i||s===u||(f++,a[l]=u)}else{a!==d&&(a=d={},g=0,f++),n=0;for(r in o)Tr.call(o,r)&&(n++,u=o[r],s=a[r],r in a?(i=s!==s&&u!==u,i||s===u||(f++,a[r]=u)):(g++,a[r]=u,f++));if(g>n){f++;for(r in a)Tr.call(o,r)||(g--,delete a[r])}}else a!==o&&(a=o,f++);return f}}function i(){if(v?(v=!1,n(o,o,s)):n(o,u,s),c)if($(o))if(e(o)){u=new Array(o.length);for(var t=0;t<o.length;t++)u[t]=o[t]}else{u={};for(var r in o)Tr.call(o,r)&&(u[r]=o[r])}else u=o}r.$stateful=!0;var o,a,u,s=this,c=n.length>1,f=0,h=l(t,r),p=[],d={},v=!0,g=0;return this.$watch(h,i)},$digest:function(){var t,e,r,a,l,f,h,p,d,m,y,$,b=i,C=this,A=[];v("$digest"),c.$$checkUrlChange(),this===_&&null!==s&&(c.defer.cancel(s),w()),u=null;do{p=!1,m=C;for(var P=0;P<M.length;P++){try{$=M[P],$.scope.$eval($.expression,$.locals)}catch(O){n(O)}u=null}M.length=0;t:do{if(f=m.$$watchers)for(h=f.length;h--;)try{if(t=f[h])if(l=t.get,(e=l(m))===(r=t.last)||(t.eq?q(e,r):"number"==typeof e&&"number"==typeof r&&isNaN(e)&&isNaN(r))){if(t===u){p=!1;break t}}else p=!0,u=t,t.last=t.eq?I(e,null):e,a=t.fn,a(e,r===x?e:r,m),b<5&&(y=4-b,A[y]||(A[y]=[]),A[y].push({msg:S(t.exp)?"fn: "+(t.exp.name||t.exp.toString()):t.exp,newVal:e,oldVal:r}))}catch(O){n(O)}if(!(d=m.$$watchersCount&&m.$$childHead||m!==C&&m.$$nextSibling))for(;m!==C&&!(d=m.$$nextSibling);)m=m.$parent}while(m=d);if((p||M.length)&&!b--)throw g(),o("infdig","{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}",i,A)}while(p||M.length);for(g();E<k.length;)try{k[E++]()}catch(O){n(O)}k.length=E=0},$destroy:function(){if(!this.$$destroyed){var t=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this===_&&c.$$applicationDestroyed(),y(this,-this.$$watchersCount);for(var n in this.$$listenerCount)b(this,this.$$listenerCount[n],n);t&&t.$$childHead==this&&(t.$$childHead=this.$$nextSibling),t&&t.$$childTail==this&&(t.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=p,this.$on=this.$watch=this.$watchGroup=function(){return p},this.$$listeners={},this.$$nextSibling=null,h(this)}},$eval:function(t,n){return l(t)(this,n)},$evalAsync:function(t,n){_.$$phase||M.length||c.defer(function(){M.length&&_.$digest()}),M.push({scope:this,expression:l(t),locals:n})},$$postDigest:function(t){k.push(t)},$apply:function(t){try{v("$apply");try{return this.$eval(t)}finally{g()}}catch(e){n(e)}finally{try{_.$digest()}catch(e){throw n(e),e}}},$applyAsync:function(t){function n(){e.$eval(t)}var e=this;t&&A.push(n),t=l(t),C()},$on:function(t,n){var e=this.$$listeners[t];e||(this.$$listeners[t]=e=[]),e.push(n);var r=this;do r.$$listenerCount[t]||(r.$$listenerCount[t]=0),r.$$listenerCount[t]++;while(r=r.$parent);var i=this;return function(){var r=e.indexOf(n);r!==-1&&(e[r]=null,b(i,1,t))}},$emit:function(t,e){var r,i,o,a=[],u=this,s=!1,l={name:t,targetScope:u,stopPropagation:function(){s=!0},preventDefault:function(){l.defaultPrevented=!0},defaultPrevented:!1},c=z([l],arguments,1);do{for(r=u.$$listeners[t]||a,l.currentScope=u,i=0,o=r.length;i<o;i++)if(r[i])try{r[i].apply(null,c)}catch(f){n(f)}else r.splice(i,1),i--,o--;if(s)return l.currentScope=null,l;u=u.$parent}while(u);return l.currentScope=null,l},$broadcast:function(t,e){var r=this,i=r,o=r,a={name:t,targetScope:r,preventDefault:function(){a.defaultPrevented=!0},defaultPrevented:!1};if(!r.$$listenerCount[t])return a;for(var u,s,l,c=z([a],arguments,1);i=o;){for(a.currentScope=i,u=i.$$listeners[t]||[],s=0,l=u.length;s<l;s++)if(u[s])try{u[s].apply(null,c)}catch(f){n(f)}else u.splice(s,1),s--,l--;if(!(o=i.$$listenerCount[t]&&i.$$childHead||i!==r&&i.$$nextSibling))for(;i!==r&&!(o=i.$$nextSibling);)i=i.$parent}return a.currentScope=null,a}};var _=new d,M=_.$$asyncQueue=[],k=_.$$postDigestQueue=[],A=_.$$applyAsyncQueue=[],E=0;return _}]}function _e(){var t=/^\s*(https?|ftp|mailto|tel|file):/,n=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(n){return y(n)?(t=n,this):t},this.imgSrcSanitizationWhitelist=function(t){return y(t)?(n=t,this):n},this.$get=function(){return function(e,r){var i,o=r?n:t;return i=je(e).href,""===i||i.match(o)?e:"unsafe:"+i}}}function Me(t){if("self"===t)return t;if(x(t)){if(t.indexOf("***")>-1)throw wo("iwcard","Illegal sequence *** in string matcher.  String: {0}",t);return t=Kr(t).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*"),new RegExp("^"+t+"$")}if(_(t))return new RegExp("^"+t.source+"$");throw wo("imatcher",'Matchers may only be "self", string patterns or RegExp objects')}function ke(t){var n=[];return y(t)&&r(t,function(t){n.push(Me(t))}),n}function Ae(){this.SCE_CONTEXTS=Co;var t=["self"],n=[];this.resourceUrlWhitelist=function(n){return arguments.length&&(t=ke(n)),t},this.resourceUrlBlacklist=function(t){return arguments.length&&(n=ke(t)),n},this.$get=["$injector",function(e){function r(t,n){return"self"===t?Ne(n):!!t.exec(n.href)}function i(e){var i,o,a=je(e.toString()),u=!1;for(i=0,o=t.length;i<o;i++)if(r(t[i],a)){u=!0;break}if(u)for(i=0,o=n.length;i<o;i++)if(r(n[i],a)){u=!1;break}return u}function o(t){var n=function(t){this.$$unwrapTrustedValue=function(){return t}};return t&&(n.prototype=new t),n.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},n.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},n}function a(t,n){var e=f.hasOwnProperty(t)?f[t]:null;if(!e)throw wo("icontext","Attempted to trust a value in invalid context. Context: {0}; Value: {1}",t,n);if(null===n||m(n)||""===n)return n;if("string"!=typeof n)throw wo("itype","Attempted to trust a non-string value in a content requiring a string: Context: {0}",t);return new e(n)}function u(t){return t instanceof c?t.$$unwrapTrustedValue():t}function s(t,n){if(null===n||m(n)||""===n)return n;var e=f.hasOwnProperty(t)?f[t]:null;if(e&&n instanceof e)return n.$$unwrapTrustedValue();if(t===Co.RESOURCE_URL){if(i(n))return n;throw wo("insecurl","Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}",n.toString())}if(t===Co.HTML)return l(n);throw wo("unsafe","Attempting to use an unsafe value in a safe context.")}var l=function(t){throw wo("unsafe","Attempting to use an unsafe value in a safe context.")};e.has("$sanitize")&&(l=e.get("$sanitize"));var c=o(),f={};return f[Co.HTML]=o(c),f[Co.CSS]=o(c),f[Co.URL]=o(c),f[Co.JS]=o(c),f[Co.RESOURCE_URL]=o(f[Co.URL]),{trustAs:a,getTrusted:s,valueOf:u}}]}function Ee(){var t=!0;this.enabled=function(n){return arguments.length&&(t=!!n),t},this.$get=["$parse","$sceDelegate",function(n,e){if(t&&Dr<8)throw wo("iequirks","Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.");var i=gt(Co);i.isEnabled=function(){return t},i.trustAs=e.trustAs,i.getTrusted=e.getTrusted,i.valueOf=e.valueOf,t||(i.trustAs=i.getTrusted=function(t,n){return n},i.valueOf=d),i.parseAs=function(t,e){var r=n(e);return r.literal&&r.constant?r:n(e,function(n){return i.getTrusted(t,n)})};var o=i.parseAs,a=i.getTrusted,u=i.trustAs;return r(Co,function(t,n){var e=Lr(n);i[xt("parse_as_"+e)]=function(n){return o(t,n)},i[xt("get_trusted_"+e)]=function(n){return a(t,n)},i[xt("trust_as_"+e)]=function(n){return u(t,n)}}),i}]}function Pe(){this.$get=["$window","$document",function(t,n){var e,r,i={},o=t.chrome&&t.chrome.app&&t.chrome.app.runtime,a=!o&&t.history&&t.history.pushState,u=f((/android (\d+)/.exec(Lr((t.navigator||{}).userAgent))||[])[1]),s=/Boxee/i.test((t.navigator||{}).userAgent),l=n[0]||{},c=/^(Moz|webkit|ms)(?=[A-Z])/,h=l.body&&l.body.style,p=!1,d=!1;if(h){for(var v in h)if(r=c.exec(v)){e=r[0],e=e[0].toUpperCase()+e.substr(1);break}e||(e="WebkitOpacity"in h&&"webkit"),p=!!("transition"in h||e+"Transition"in h),d=!!("animation"in h||e+"Animation"in h),!u||p&&d||(p=x(h.webkitTransition),d=x(h.webkitAnimation))}return{history:!(!a||u<4||s),hasEvent:function(t){if("input"===t&&Dr<=11)return!1;if(m(i[t])){var n=l.createElement("div");i[t]="on"+t in n}return i[t]},csp:Qr(),vendorPrefix:e,transitions:p,animations:d,android:u}}]}function Oe(){var t;this.httpOptions=function(n){return n?(t=n,this):t},this.$get=["$templateCache","$http","$q","$sce",function(n,e,r,i){function o(a,u){function s(t){if(!u)throw So("tpload","Failed to load template: {0} (HTTP status: {1} {2})",a,t.status,t.statusText);return r.reject(t)}o.totalPendingRequests++,x(a)&&!m(n.get(a))||(a=i.getTrustedResourceUrl(a));var c=e.defaults&&e.defaults.transformResponse;return Zr(c)?c=c.filter(function(t){return t!==kn}):c===kn&&(c=null),e.get(a,l({cache:n,transformResponse:c},t))["finally"](function(){o.totalPendingRequests--}).then(function(t){return n.put(a,t.data),t.data},s)}return o.totalPendingRequests=0,o}]}function Te(){this.$get=["$rootScope","$browser","$location",function(t,n,e){var i={};return i.findBindings=function(t,n,e){var i=t.getElementsByClassName("ng-binding"),o=[];return r(i,function(t){var i=Yr.element(t).data("$binding");i&&r(i,function(r){if(e){var i=new RegExp("(^|\\s)"+Kr(n)+"(\\s|\\||$)");i.test(r)&&o.push(t)}else r.indexOf(n)!=-1&&o.push(t)})}),o},i.findModels=function(t,n,e){for(var r=["ng-","data-ng-","ng\\:"],i=0;i<r.length;++i){var o=e?"=":"*=",a="["+r[i]+"model"+o+'"'+n+'"]',u=t.querySelectorAll(a);if(u.length)return u}},i.getLocation=function(){return e.url()},i.setLocation=function(n){n!==e.url()&&(e.url(n),t.$digest())},i.whenStable=function(t){n.notifyWhenNoOutstandingRequests(t)},i}]}function Le(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(t,n,e,r,i){function o(o,u,s){S(o)||(s=u,u=o,o=p);var l,c=V(arguments,3),f=y(s)&&!s,h=(f?r:e).defer(),d=h.promise;return l=n.defer(function(){try{h.resolve(o.apply(null,c))}catch(n){h.reject(n),i(n)}finally{delete a[d.$$timeoutId]}f||t.$apply()},u),d.$$timeoutId=l,a[l]=h,d}var a={};return o.cancel=function(t){return!!(t&&t.$$timeoutId in a)&&(a[t.$$timeoutId].reject("canceled"),delete a[t.$$timeoutId],n.defer.cancel(t.$$timeoutId))},o}]}function je(t){var n=t;return Dr&&(_o.setAttribute("href",n),n=_o.href),_o.setAttribute("href",n),{href:_o.href,protocol:_o.protocol?_o.protocol.replace(/:$/,""):"",host:_o.host,search:_o.search?_o.search.replace(/^\?/,""):"",hash:_o.hash?_o.hash.replace(/^#/,""):"",hostname:_o.hostname,port:_o.port,pathname:"/"===_o.pathname.charAt(0)?_o.pathname:"/"+_o.pathname}}function Ne(t){var n=x(t)?je(t):t;return n.protocol===Mo.protocol&&n.host===Mo.host}function Re(){this.$get=v(t)}function De(t){function n(t){try{return decodeURIComponent(t)}catch(n){return t}}var e=t[0]||{},r={},i="";return function(){var t,o,a,u,s,l=e.cookie||"";if(l!==i)for(i=l,t=i.split("; "),r={},a=0;a<t.length;a++)o=t[a],u=o.indexOf("="),u>0&&(s=n(o.substring(0,u)),m(r[s])&&(r[s]=n(o.substring(u+1))));return r}}function Fe(){this.$get=De}function Ie(t){function n(i,o){if($(i)){var a={};return r(i,function(t,e){a[e]=n(e,t)}),a}return t.factory(i+e,o)}var e="Filter";this.register=n,this.$get=["$injector",function(t){return function(n){return t.get(n+e)}}],n("currency",Ue),n("date",or),n("filter",qe),n("json",ar),n("limitTo",ur),n("lowercase",Lo),n("number",We),n("orderBy",lr),n("uppercase",jo)}function qe(){return function(t,r,i,o){if(!e(t)){if(null==t)return t;throw n("filter")("notarray","Expected array but received: {0}",t)}o=o||"$";var a,u,s=Be(r);switch(s){case"function":a=r;break;case"boolean":case"null":case"number":case"string":u=!0;case"object":a=ze(r,i,o,u);break;default:return t}return Array.prototype.filter.call(t,a)}}function ze(t,n,e,r){var i,o=$(t)&&e in t;return n===!0?n=q:S(n)||(n=function(t,n){return!m(t)&&(null===t||null===n?t===n:!($(n)||$(t)&&!g(t))&&(t=Lr(""+t),n=Lr(""+n),t.indexOf(n)!==-1))}),i=function(i){return o&&!$(i)?Ve(i,t[e],n,e,!1):Ve(i,t,n,e,r)}}function Ve(t,n,e,r,i,o){var a=Be(t),u=Be(n);if("string"===u&&"!"===n.charAt(0))return!Ve(t,n.substring(1),e,r,i);if(Zr(t))return t.some(function(t){return Ve(t,n,e,r,i)});switch(a){case"object":var s;if(i){for(s in t)if("$"!==s.charAt(0)&&Ve(t[s],n,e,r,!0))return!0;return!o&&Ve(t,n,e,r,!1)}if("object"===u){for(s in n){var l=n[s];if(!S(l)&&!m(l)){var c=s===r,f=c?t:t[s];if(!Ve(f,l,e,r,c,c))return!1}}return!0}return e(t,n);case"function":return!1;default:return e(t,n)}}function Be(t){return null===t?"null":typeof t}function Ue(t){var n=t.NUMBER_FORMATS;return function(t,e,r){return m(e)&&(e=n.CURRENCY_SYM),m(r)&&(r=n.PATTERNS[1].maxFrac),null==t?t:Ge(t,n.PATTERNS[1],n.GROUP_SEP,n.DECIMAL_SEP,r).replace(/\u00A4/g,e)}}function We(t){var n=t.NUMBER_FORMATS;return function(t,e){return null==t?t:Ge(t,n.PATTERNS[0],n.GROUP_SEP,n.DECIMAL_SEP,e)}}function He(t){var n,e,r,i,o,a=0;for((e=t.indexOf(Ao))>-1&&(t=t.replace(Ao,"")),(r=t.search(/e/i))>0?(e<0&&(e=r),e+=+t.slice(r+1),t=t.substring(0,r)):e<0&&(e=t.length),r=0;t.charAt(r)==Eo;r++);if(r==(o=t.length))n=[0],e=1;else{for(o--;t.charAt(o)==Eo;)o--;for(e-=r,n=[],i=0;r<=o;r++,i++)n[i]=+t.charAt(r)}return e>ko&&(n=n.splice(0,ko-1),a=e-1,e=1),{d:n,e:a,i:e}}function Ye(t,n,e,r){var i=t.d,o=i.length-t.i;n=m(n)?Math.min(Math.max(e,o),r):+n;var a=n+t.i,u=i[a];if(a>0){i.splice(Math.max(t.i,a));for(var s=a;s<i.length;s++)i[s]=0}else{o=Math.max(0,o),t.i=1,i.length=Math.max(1,a=n+1),i[0]=0;for(var l=1;l<a;l++)i[l]=0}if(u>=5)if(a-1<0){for(var c=0;c>a;c--)i.unshift(0),t.i++;i.unshift(1),t.i++}else i[a-1]++;for(;o<Math.max(0,n);o++)i.push(0);var f=i.reduceRight(function(t,n,e,r){return n+=t,r[e]=n%10,Math.floor(n/10)},0);f&&(i.unshift(f),t.i++)}function Ge(t,n,e,r,i){if(!x(t)&&!w(t)||isNaN(t))return"";var o,a=!isFinite(t),u=!1,s=Math.abs(t)+"",l="";if(a)l="∞";else{o=He(s),Ye(o,i,n.minFrac,n.maxFrac);var c=o.d,f=o.i,h=o.e,p=[];for(u=c.reduce(function(t,n){return t&&!n},!0);f<0;)c.unshift(0),f++;f>0?p=c.splice(f,c.length):(p=c,c=[0]);var d=[];for(c.length>=n.lgSize&&d.unshift(c.splice(-n.lgSize,c.length).join(""));c.length>n.gSize;)d.unshift(c.splice(-n.gSize,c.length).join(""));c.length&&d.unshift(c.join("")),l=d.join(e),p.length&&(l+=r+p.join("")),h&&(l+="e+"+h)}return t<0&&!u?n.negPre+l+n.negSuf:n.posPre+l+n.posSuf}function Ze(t,n,e,r){var i="";for((t<0||r&&t<=0)&&(r?t=-t+1:(t=-t,i="-")),t=""+t;t.length<n;)t=Eo+t;return e&&(t=t.substr(t.length-n)),i+t}function Xe(t,n,e,r,i){return e=e||0,function(o){var a=o["get"+t]();return(e>0||a>-e)&&(a+=e),0===a&&e==-12&&(a=12),Ze(a,n,r,i)}}function Je(t,n,e){return function(r,i){var o=r["get"+t](),a=(e?"STANDALONE":"")+(n?"SHORT":""),u=jr(a+t);return i[u][o]}}function Ke(t,n,e){var r=-1*e,i=r>=0?"+":"";return i+=Ze(Math[r>0?"floor":"ceil"](r/60),2)+Ze(Math.abs(r%60),2)}function Qe(t){var n=new Date(t,0,1).getDay();return new Date(t,0,(n<=4?5:12)-n)}function tr(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate()+(4-t.getDay()))}function nr(t){return function(n){var e=Qe(n.getFullYear()),r=tr(n),i=+r-+e,o=1+Math.round(i/6048e5);return Ze(o,t)}}function er(t,n){return t.getHours()<12?n.AMPMS[0]:n.AMPMS[1]}function rr(t,n){return t.getFullYear()<=0?n.ERAS[0]:n.ERAS[1]}function ir(t,n){return t.getFullYear()<=0?n.ERANAMES[0]:n.ERANAMES[1]}function or(t){function n(t){var n;if(n=t.match(e)){var r=new Date(0),i=0,o=0,a=n[8]?r.setUTCFullYear:r.setFullYear,u=n[8]?r.setUTCHours:r.setHours;n[9]&&(i=f(n[9]+n[10]),o=f(n[9]+n[11])),a.call(r,f(n[1]),f(n[2])-1,f(n[3]));var s=f(n[4]||0)-i,l=f(n[5]||0)-o,c=f(n[6]||0),h=Math.round(1e3*parseFloat("0."+(n[7]||0)));return u.call(r,s,l,c,h),r}return t}var e=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(e,i,o){var a,u,s="",l=[];if(i=i||"mediumDate",i=t.DATETIME_FORMATS[i]||i,x(e)&&(e=To.test(e)?f(e):n(e)),w(e)&&(e=new Date(e)),!C(e)||!isFinite(e.getTime()))return e;for(;i;)u=Oo.exec(i),u?(l=z(l,u,1),i=l.pop()):(l.push(i),i=null);var c=e.getTimezoneOffset();return o&&(c=Y(o,c),e=Z(e,o,!0)),r(l,function(n){a=Po[n],s+=a?a(e,t.DATETIME_FORMATS,c):"''"===n?"'":n.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),s}}function ar(){return function(t,n){return m(n)&&(n=2),W(t,n)}}function ur(){return function(t,n,r){return n=Math.abs(Number(n))===1/0?Number(n):f(n),isNaN(n)?t:(w(t)&&(t=t.toString()),e(t)?(r=!r||isNaN(r)?0:f(r),r=r<0?Math.max(0,t.length+r):r,n>=0?sr(t,r,r+n):0===r?sr(t,n,t.length):sr(t,Math.max(0,r+n),r)):t)}}function sr(t,n,e){return x(t)?t.slice(n,e):zr.call(t,n,e)}function lr(t){function r(n){return n.map(function(n){var e=1,r=d;if(S(n))r=n;else if(x(n)&&("+"!=n.charAt(0)&&"-"!=n.charAt(0)||(e="-"==n.charAt(0)?-1:1,n=n.substring(1)),""!==n&&(r=t(n),r.constant))){var i=r();r=function(t){return t[i]}}return{get:r,descending:e}})}function i(t){switch(typeof t){case"number":case"boolean":case"string":return!0;default:return!1}}function o(t){return S(t.valueOf)&&(t=t.valueOf(),i(t))?t:g(t)&&(t=t.toString(),i(t))?t:t}function a(t,n){var e=typeof t;return null===t?(e="string",t="null"):"object"===e&&(t=o(t)),{value:t,type:e,index:n}}function u(t,n){var e=0,r=t.type,i=n.type;if(r===i){var o=t.value,a=n.value;"string"===r?(o=o.toLowerCase(),a=a.toLowerCase()):"object"===r&&($(o)&&(o=t.index),$(a)&&(a=n.index)),o!==a&&(e=o<a?-1:1)}else e=r<i?-1:1;return e}return function(t,i,o,s){function l(t,n){return{value:t,tieBreaker:{value:n,type:"number",index:n},predicateValues:f.map(function(e){return a(e.get(t),n)})}}function c(t,n){for(var e=0,r=f.length;e<r;e++){var i=p(t.predicateValues[e],n.predicateValues[e]);if(i)return i*f[e].descending*h}return p(t.tieBreaker,n.tieBreaker)*h}if(null==t)return t;if(!e(t))throw n("orderBy")("notarray","Expected array but received: {0}",t);Zr(i)||(i=[i]),0===i.length&&(i=["+"]);var f=r(i),h=o?-1:1,p=S(s)?s:u,d=Array.prototype.map.call(t,l);return d.sort(c),t=d.map(function(t){return t.value})}}function cr(t){return S(t)&&(t={link:t}),t.restrict=t.restrict||"AC",v(t)}function fr(t,n){t.$name=n}function hr(t,n,e,i,o){var a=this,u=[];a.$error={},a.$$success={},a.$pending=void 0,a.$name=o(n.name||n.ngForm||"")(e),a.$dirty=!1,a.$pristine=!0,a.$valid=!0,a.$invalid=!1,a.$submitted=!1,a.$$parentForm=Do,a.$rollbackViewValue=function(){r(u,function(t){t.$rollbackViewValue()})},a.$commitViewValue=function(){r(u,function(t){t.$commitViewValue()})},a.$addControl=function(t){ft(t.$name,"input"),u.push(t),t.$name&&(a[t.$name]=t),t.$$parentForm=a},a.$$renameControl=function(t,n){var e=t.$name;a[e]===t&&delete a[e],a[n]=t,t.$name=n},a.$removeControl=function(t){t.$name&&a[t.$name]===t&&delete a[t.$name],r(a.$pending,function(n,e){a.$setValidity(e,null,t)}),r(a.$error,function(n,e){a.$setValidity(e,null,t)}),r(a.$$success,function(n,e){a.$setValidity(e,null,t)}),F(u,t),t.$$parentForm=Do},kr({ctrl:this,$element:t,set:function(t,n,e){var r=t[n];if(r){var i=r.indexOf(e);i===-1&&r.push(e)}else t[n]=[e]},unset:function(t,n,e){var r=t[n];r&&(F(r,e),0===r.length&&delete t[n])},$animate:i}),a.$setDirty=function(){i.removeClass(t,xa),i.addClass(t,wa),a.$dirty=!0,a.$pristine=!1,a.$$parentForm.$setDirty()},a.$setPristine=function(){i.setClass(t,xa,wa+" "+Fo),a.$dirty=!1,a.$pristine=!0,a.$submitted=!1,r(u,function(t){t.$setPristine()})},a.$setUntouched=function(){r(u,function(t){t.$setUntouched()})},a.$setSubmitted=function(){i.addClass(t,Fo),a.$submitted=!0,a.$$parentForm.$setSubmitted()}}function pr(t){t.$formatters.push(function(n){return t.$isEmpty(n)?n:n.toString()})}function dr(t,n,e,r,i,o){vr(t,n,e,r,i,o),pr(r)}function vr(t,n,e,r,i,o){var a=Lr(n[0].type);if(!i.android){var u=!1;n.on("compositionstart",function(){u=!0}),n.on("compositionend",function(){u=!1,l()})}var s,l=function(t){if(s&&(o.defer.cancel(s),s=null),!u){var i=n.val(),l=t&&t.type;"password"===a||e.ngTrim&&"false"===e.ngTrim||(i=Jr(i)),(r.$viewValue!==i||""===i&&r.$$hasNativeValidators)&&r.$setViewValue(i,l)}};if(i.hasEvent("input"))n.on("input",l);else{var c=function(t,n,e){s||(s=o.defer(function(){s=null,n&&n.value===e||l(t)}))};n.on("keydown",function(t){var n=t.keyCode;91===n||15<n&&n<19||37<=n&&n<=40||c(t,this,this.value)}),i.hasEvent("paste")&&n.on("paste cut",c)}n.on("change",l),Ko[a]&&r.$$hasNativeValidators&&a===e.type&&n.on(Jo,function(t){if(!s){var n=this[Or],e=n.badInput,r=n.typeMismatch;s=o.defer(function(){s=null,n.badInput===e&&n.typeMismatch===r||l(t)})}}),r.$render=function(){var t=r.$isEmpty(r.$viewValue)?"":r.$viewValue;n.val()!==t&&n.val(t)}}function gr(t,n){if(C(t))return t;if(x(t)){Go.lastIndex=0;var e=Go.exec(t);if(e){var r=+e[1],i=+e[2],o=0,a=0,u=0,s=0,l=Qe(r),c=7*(i-1);return n&&(o=n.getHours(),a=n.getMinutes(),u=n.getSeconds(),s=n.getMilliseconds()),new Date(r,0,l.getDate()+c,o,a,u,s)}}return NaN}function mr(t,n){return function(e,i){var o,a;if(C(e))return e;if(x(e)){if('"'==e.charAt(0)&&'"'==e.charAt(e.length-1)&&(e=e.substring(1,e.length-1)),Vo.test(e))return new Date(e);if(t.lastIndex=0,o=t.exec(e))return o.shift(),a=i?{yyyy:i.getFullYear(),MM:i.getMonth()+1,dd:i.getDate(),HH:i.getHours(),mm:i.getMinutes(),ss:i.getSeconds(),sss:i.getMilliseconds()/1e3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(o,function(t,e){e<n.length&&(a[n[e]]=+t)}),new Date(a.yyyy,a.MM-1,a.dd,a.HH,a.mm,a.ss||0,1e3*a.sss||0)}return NaN}}function yr(t,n,e,r){return function(i,o,a,u,s,l,c){function f(t){return t&&!(t.getTime&&t.getTime()!==t.getTime())}function h(t){return y(t)&&!C(t)?e(t)||void 0:t}$r(i,o,a,u),vr(i,o,a,u,s,l);var p,d=u&&u.$options&&u.$options.timezone;if(u.$$parserName=t,u.$parsers.push(function(t){if(u.$isEmpty(t))return null;if(n.test(t)){var r=e(t,p);return d&&(r=Z(r,d)),r}}),u.$formatters.push(function(t){if(t&&!C(t))throw Aa("datefmt","Expected `{0}` to be a date",t);return f(t)?(p=t,p&&d&&(p=Z(p,d,!0)),c("date")(t,r,d)):(p=null,"")}),y(a.min)||a.ngMin){var v;u.$validators.min=function(t){return!f(t)||m(v)||e(t)>=v},a.$observe("min",function(t){
+v=h(t),u.$validate()})}if(y(a.max)||a.ngMax){var g;u.$validators.max=function(t){return!f(t)||m(g)||e(t)<=g},a.$observe("max",function(t){g=h(t),u.$validate()})}}}function $r(t,n,e,r){var i=n[0],o=r.$$hasNativeValidators=$(i.validity);o&&r.$parsers.push(function(t){var e=n.prop(Or)||{};return e.badInput||e.typeMismatch?void 0:t})}function br(t,n,e,r,i,o){if($r(t,n,e,r),vr(t,n,e,r,i,o),r.$$parserName="number",r.$parsers.push(function(t){return r.$isEmpty(t)?null:Wo.test(t)?parseFloat(t):void 0}),r.$formatters.push(function(t){if(!r.$isEmpty(t)){if(!w(t))throw Aa("numfmt","Expected `{0}` to be a number",t);t=t.toString()}return t}),y(e.min)||e.ngMin){var a;r.$validators.min=function(t){return r.$isEmpty(t)||m(a)||t>=a},e.$observe("min",function(t){y(t)&&!w(t)&&(t=parseFloat(t)),a=w(t)&&!isNaN(t)?t:void 0,r.$validate()})}if(y(e.max)||e.ngMax){var u;r.$validators.max=function(t){return r.$isEmpty(t)||m(u)||t<=u},e.$observe("max",function(t){y(t)&&!w(t)&&(t=parseFloat(t)),u=w(t)&&!isNaN(t)?t:void 0,r.$validate()})}}function xr(t,n,e,r,i,o){vr(t,n,e,r,i,o),pr(r),r.$$parserName="url",r.$validators.url=function(t,n){var e=t||n;return r.$isEmpty(e)||Bo.test(e)}}function wr(t,n,e,r,i,o){vr(t,n,e,r,i,o),pr(r),r.$$parserName="email",r.$validators.email=function(t,n){var e=t||n;return r.$isEmpty(e)||Uo.test(e)}}function Cr(t,n,e,r){m(e.name)&&n.attr("name",a());var i=function(t){n[0].checked&&r.$setViewValue(e.value,t&&t.type)};n.on("click",i),r.$render=function(){var t=e.value;n[0].checked=t==r.$viewValue},e.$observe("value",r.$render)}function Sr(t,n,e,r,i){var o;if(y(r)){if(o=t(r),!o.constant)throw Aa("constexpr","Expected constant expression for `{0}`, but saw `{1}`.",e,r);return o(n)}return i}function _r(t,n,e,r,i,o,a,u){var s=Sr(u,t,"ngTrueValue",e.ngTrueValue,!0),l=Sr(u,t,"ngFalseValue",e.ngFalseValue,!1),c=function(t){r.$setViewValue(n[0].checked,t&&t.type)};n.on("click",c),r.$render=function(){n[0].checked=r.$viewValue},r.$isEmpty=function(t){return t===!1},r.$formatters.push(function(t){return q(t,s)}),r.$parsers.push(function(t){return t?s:l})}function Mr(t,n){return t="ngClass"+t,["$animate",function(e){function i(t,n){var e=[];t:for(var r=0;r<t.length;r++){for(var i=t[r],o=0;o<n.length;o++)if(i==n[o])continue t;e.push(i)}return e}function o(t){var n=[];return Zr(t)?(r(t,function(t){n=n.concat(o(t))}),n):x(t)?t.split(" "):$(t)?(r(t,function(t,e){t&&(n=n.concat(e.split(" ")))}),n):t}return{restrict:"AC",link:function(a,u,s){function l(t){var n=f(t,1);s.$addClass(n)}function c(t){var n=f(t,-1);s.$removeClass(n)}function f(t,n){var e=u.data("$classCounts")||dt(),i=[];return r(t,function(t){(n>0||e[t])&&(e[t]=(e[t]||0)+n,e[t]===+(n>0)&&i.push(t))}),u.data("$classCounts",e),i.join(" ")}function h(t,n){var r=i(n,t),o=i(t,n);r=f(r,1),o=f(o,-1),r&&r.length&&e.addClass(u,r),o&&o.length&&e.removeClass(u,o)}function p(t){if(n===!0||(1&a.$index)===n){var e=o(t||[]);if(d){if(!q(t,d)){var r=o(d);h(r,e)}}else l(e)}d=Zr(t)?t.map(function(t){return gt(t)}):gt(t)}var d;a.$watch(s[t],p,!0),s.$observe("class",function(n){p(a.$eval(s[t]))}),"ngClass"!==t&&a.$watch("$index",function(e,r){var i=1&e;if(i!==(1&r)){var u=o(a.$eval(s[t]));i===n?l(u):c(u)}})}}}]}function kr(t){function n(t,n,u){m(n)?e("$pending",t,u):r("$pending",t,u),O(n)?n?(c(a.$error,t,u),l(a.$$success,t,u)):(l(a.$error,t,u),c(a.$$success,t,u)):(c(a.$error,t,u),c(a.$$success,t,u)),a.$pending?(i(_a,!0),a.$valid=a.$invalid=void 0,o("",null)):(i(_a,!1),a.$valid=Ar(a.$error),a.$invalid=!a.$valid,o("",a.$valid));var s;s=a.$pending&&a.$pending[t]?void 0:!a.$error[t]&&(!!a.$$success[t]||null),o(t,s),a.$$parentForm.$setValidity(t,s,a)}function e(t,n,e){a[t]||(a[t]={}),l(a[t],n,e)}function r(t,n,e){a[t]&&c(a[t],n,e),Ar(a[t])&&(a[t]=void 0)}function i(t,n){n&&!s[t]?(f.addClass(u,t),s[t]=!0):!n&&s[t]&&(f.removeClass(u,t),s[t]=!1)}function o(t,n){t=t?"-"+ut(t,"-"):"",i($a+t,n===!0),i(ba+t,n===!1)}var a=t.ctrl,u=t.$element,s={},l=t.set,c=t.unset,f=t.$animate;s[ba]=!(s[$a]=u.hasClass($a)),a.$setValidity=n}function Ar(t){if(t)for(var n in t)if(t.hasOwnProperty(n))return!1;return!0}function Er(t){t[0].hasAttribute("selected")&&(t[0].selected=!0)}var Pr=/^\/(.+)\/([a-z]*)$/,Or="validity",Tr=Object.prototype.hasOwnProperty,Lr=function(t){return x(t)?t.toLowerCase():t},jr=function(t){return x(t)?t.toUpperCase():t},Nr=function(t){return x(t)?t.replace(/[A-Z]/g,function(t){return String.fromCharCode(32|t.charCodeAt(0))}):t},Rr=function(t){return x(t)?t.replace(/[a-z]/g,function(t){return String.fromCharCode(t.charCodeAt(0)&-33)}):t};"i"!=="I".toLowerCase()&&(Lr=Nr,jr=Rr);var Dr,Fr,Ir,qr,zr=[].slice,Vr=[].splice,Br=[].push,Ur=Object.prototype.toString,Wr=Object.getPrototypeOf,Hr=n("ng"),Yr=t.angular||(t.angular={}),Gr=0;Dr=t.document.documentMode,p.$inject=[],d.$inject=[];var Zr=Array.isArray,Xr=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,Jr=function(t){return x(t)?t.trim():t},Kr=function(t){return t.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Qr=function(){function n(){try{return new Function(""),!1}catch(t){return!0}}if(!y(Qr.rules)){var e=t.document.querySelector("[ng-csp]")||t.document.querySelector("[data-ng-csp]");if(e){var r=e.getAttribute("ng-csp")||e.getAttribute("data-ng-csp");Qr.rules={noUnsafeEval:!r||r.indexOf("no-unsafe-eval")!==-1,noInlineStyle:!r||r.indexOf("no-inline-style")!==-1}}else Qr.rules={noUnsafeEval:n(),noInlineStyle:!1}}return Qr.rules},ti=function(){if(y(ti.name_))return ti.name_;var n,e,r,i,o=ei.length;for(e=0;e<o;++e)if(r=ei[e],n=t.document.querySelector("["+r.replace(":","\\:")+"jq]")){i=n.getAttribute(r+"jq");break}return ti.name_=i},ni=/:/g,ei=["ng-","data-ng-","ng:","x-ng-"],ri=/[A-Z]/g,ii=!1,oi=1,ai=2,ui=3,si=8,li=9,ci=11,fi={full:"1.5.8",major:1,minor:5,dot:8,codeName:"arbitrary-fallbacks"};Et.expando="ng339";var hi=Et.cache={},pi=1,di=function(t,n,e){t.addEventListener(n,e,!1)},vi=function(t,n,e){t.removeEventListener(n,e,!1)};Et._data=function(t){return this.cache[t[this.expando]]||{}};var gi=/([\:\-\_]+(.))/g,mi=/^moz([A-Z])/,yi={mouseleave:"mouseout",mouseenter:"mouseover"},$i=n("jqLite"),bi=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,xi=/<|&#?\w+;/,wi=/<([\w:-]+)/,Ci=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Si={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};Si.optgroup=Si.option,Si.tbody=Si.tfoot=Si.colgroup=Si.caption=Si.thead,Si.th=Si.td;var _i=t.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))},Mi=Et.prototype={ready:function(n){function e(){r||(r=!0,n())}var r=!1;"complete"===t.document.readyState?t.setTimeout(e):(this.on("DOMContentLoaded",e),Et(t).on("load",e))},toString:function(){var t=[];return r(this,function(n){t.push(""+n)}),"["+t.join(", ")+"]"},eq:function(t){return Fr(t>=0?this[t]:this[this.length+t])},length:0,push:Br,sort:[].sort,splice:[].splice},ki={};r("multiple,selected,checked,disabled,readOnly,required,open".split(","),function(t){ki[Lr(t)]=t});var Ai={};r("input,select,option,textarea,button,form,details".split(","),function(t){Ai[t]=!0});var Ei={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Nt,removeData:Lt,hasData:St,cleanData:_t},function(t,n){Et[n]=t}),r({data:Nt,inheritedData:zt,scope:function(t){return Fr.data(t,"$scope")||zt(t.parentNode||t,["$isolateScope","$scope"])},isolateScope:function(t){return Fr.data(t,"$isolateScope")||Fr.data(t,"$isolateScopeNoTemplate")},controller:qt,injector:function(t){return zt(t,"$injector")},removeAttr:function(t,n){t.removeAttribute(n)},hasClass:Rt,css:function(t,n,e){return n=xt(n),y(e)?void(t.style[n]=e):t.style[n]},attr:function(t,n,e){var r=t.nodeType;if(r!==ui&&r!==ai&&r!==si){var i=Lr(n);if(ki[i]){if(!y(e))return t[n]||(t.attributes.getNamedItem(n)||p).specified?i:void 0;e?(t[n]=!0,t.setAttribute(n,i)):(t[n]=!1,t.removeAttribute(i))}else if(y(e))t.setAttribute(n,e);else if(t.getAttribute){var o=t.getAttribute(n,2);return null===o?void 0:o}}},prop:function(t,n,e){return y(e)?void(t[n]=e):t[n]},text:function(){function t(t,n){if(m(n)){var e=t.nodeType;return e===oi||e===ui?t.textContent:""}t.textContent=n}return t.$dv="",t}(),val:function(t,n){if(m(n)){if(t.multiple&&"select"===D(t)){var e=[];return r(t.options,function(t){t.selected&&e.push(t.value||t.text)}),0===e.length?null:e}return t.value}t.value=n},html:function(t,n){return m(n)?t.innerHTML:(Ot(t,!0),void(t.innerHTML=n))},empty:Vt},function(t,n){Et.prototype[n]=function(n,e){var r,i,o=this.length;if(t!==Vt&&m(2==t.length&&t!==Rt&&t!==qt?n:e)){if($(n)){for(r=0;r<o;r++)if(t===Nt)t(this[r],n);else for(i in n)t(this[r],i,n[i]);return this}for(var a=t.$dv,u=m(a)?Math.min(o,1):o,s=0;s<u;s++){var l=t(this[s],n,e);a=a?a+l:l}return a}for(r=0;r<o;r++)t(this[r],n,e);return this}}),r({removeData:Lt,on:function(t,n,e,r){if(y(r))throw $i("onargs","jqLite#on() does not support the `selector` or `eventData` parameters");if(Ct(t)){var i=jt(t,!0),o=i.events,a=i.handle;a||(a=i.handle=Yt(t,o));for(var u=n.indexOf(" ")>=0?n.split(" "):[n],s=u.length,l=function(n,r,i){var u=o[n];u||(u=o[n]=[],u.specialHandlerWrapper=r,"$destroy"===n||i||di(t,n,a)),u.push(e)};s--;)n=u[s],yi[n]?(l(yi[n],Zt),l(n,void 0,!0)):l(n)}},off:Tt,one:function(t,n,e){t=Fr(t),t.on(n,function r(){t.off(n,e),t.off(n,r)}),t.on(n,e)},replaceWith:function(t,n){var e,i=t.parentNode;Ot(t),r(new Et(n),function(n){e?i.insertBefore(n,e.nextSibling):i.replaceChild(n,t),e=n})},children:function(t){var n=[];return r(t.childNodes,function(t){t.nodeType===oi&&n.push(t)}),n},contents:function(t){return t.contentDocument||t.childNodes||[]},append:function(t,n){var e=t.nodeType;if(e===oi||e===ci){n=new Et(n);for(var r=0,i=n.length;r<i;r++){var o=n[r];t.appendChild(o)}}},prepend:function(t,n){if(t.nodeType===oi){var e=t.firstChild;r(new Et(n),function(n){t.insertBefore(n,e)})}},wrap:function(t,n){At(t,Fr(n).eq(0).clone()[0])},remove:Bt,detach:function(t){Bt(t,!0)},after:function(t,n){var e=t,r=t.parentNode;n=new Et(n);for(var i=0,o=n.length;i<o;i++){var a=n[i];r.insertBefore(a,e.nextSibling),e=a}},addClass:Ft,removeClass:Dt,toggleClass:function(t,n,e){n&&r(n.split(" "),function(n){var r=e;m(r)&&(r=!Rt(t,n)),(r?Ft:Dt)(t,n)})},parent:function(t){var n=t.parentNode;return n&&n.nodeType!==ci?n:null},next:function(t){return t.nextElementSibling},find:function(t,n){return t.getElementsByTagName?t.getElementsByTagName(n):[]},clone:Pt,triggerHandler:function(t,n,e){var i,o,a,u=n.type||n,s=jt(t),c=s&&s.events,f=c&&c[u];f&&(i={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:p,type:u,target:t},n.type&&(i=l(i,n)),o=gt(f),a=e?[i].concat(e):[i],r(o,function(n){i.isImmediatePropagationStopped()||n.apply(t,a)}))}},function(t,n){Et.prototype[n]=function(n,e,r){for(var i,o=0,a=this.length;o<a;o++)m(i)?(i=t(this[o],n,e,r),y(i)&&(i=Fr(i))):It(i,t(this[o],n,e,r));return y(i)?i:this},Et.prototype.bind=Et.prototype.on,Et.prototype.unbind=Et.prototype.off}),Kt.prototype={put:function(t,n){this[Jt(t,this.nextUid)]=n},get:function(t){return this[Jt(t,this.nextUid)]},remove:function(t){var n=this[t=Jt(t,this.nextUid)];return delete this[t],n}};var Pi=[function(){this.$get=[function(){return Kt}]}],Oi=/^([^\(]+?)=>/,Ti=/^[^\(]*\(\s*([^\)]*)\)/m,Li=/,/,ji=/^\s*(_?)(\S+?)\1\s*$/,Ni=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,Ri=n("$injector");rn.$$annotate=en;var Di=n("$animate"),Fi=1,Ii="ng-animate",qi=function(){this.$get=p},zi=function(){var t=new Kt,n=[];this.$get=["$$AnimateRunner","$rootScope",function(e,i){function o(t,n,e){var i=!1;return n&&(n=x(n)?n.split(" "):Zr(n)?n:[],r(n,function(n){n&&(i=!0,t[n]=e)})),i}function a(){r(n,function(n){var e=t.get(n);if(e){var i=sn(n.attr("class")),o="",a="";r(e,function(t,n){var e=!!i[n];t!==e&&(t?o+=(o.length?" ":"")+n:a+=(a.length?" ":"")+n)}),r(n,function(t){o&&Ft(t,o),a&&Dt(t,a)}),t.remove(n)}}),n.length=0}function u(e,r,u){var s=t.get(e)||{},l=o(s,r,!0),c=o(s,u,!1);(l||c)&&(t.put(e,s),n.push(e),1===n.length&&i.$$postDigest(a))}return{enabled:p,on:p,off:p,pin:p,push:function(t,n,r,i){i&&i(),r=r||{},r.from&&t.css(r.from),r.to&&t.css(r.to),(r.addClass||r.removeClass)&&u(t,r.addClass,r.removeClass);var o=new e;return o.complete(),o}}}]},Vi=["$provide",function(t){var n=this;this.$$registeredAnimations=Object.create(null),this.register=function(e,r){if(e&&"."!==e.charAt(0))throw Di("notcsel","Expecting class selector starting with '.' got '{0}'.",e);var i=e+"-animation";n.$$registeredAnimations[e.substr(1)]=i,t.factory(i,r)},this.classNameFilter=function(t){if(1===arguments.length&&(this.$$classNameFilter=t instanceof RegExp?t:null,this.$$classNameFilter)){var n=new RegExp("(\\s+|\\/)"+Ii+"(\\s+|\\/)");if(n.test(this.$$classNameFilter.toString()))throw Di("nongcls",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.',Ii)}return this.$$classNameFilter},this.$get=["$$animateQueue",function(t){function n(t,n,e){if(e){var r=un(e);!r||r.parentNode||r.previousElementSibling||(e=null)}e?e.after(t):n.prepend(t)}return{on:t.on,off:t.off,pin:t.pin,enabled:t.enabled,cancel:function(t){t.end&&t.end()},enter:function(e,r,i,o){return r=r&&Fr(r),i=i&&Fr(i),r=r||i.parent(),n(e,r,i),t.push(e,"enter",ln(o))},move:function(e,r,i,o){return r=r&&Fr(r),i=i&&Fr(i),r=r||i.parent(),n(e,r,i),t.push(e,"move",ln(o))},leave:function(n,e){return t.push(n,"leave",ln(e),function(){n.remove()})},addClass:function(n,e,r){return r=ln(r),r.addClass=an(r.addclass,e),t.push(n,"addClass",r)},removeClass:function(n,e,r){return r=ln(r),r.removeClass=an(r.removeClass,e),t.push(n,"removeClass",r)},setClass:function(n,e,r,i){return i=ln(i),i.addClass=an(i.addClass,e),i.removeClass=an(i.removeClass,r),t.push(n,"setClass",i)},animate:function(n,e,r,i,o){return o=ln(o),o.from=o.from?l(o.from,e):e,o.to=o.to?l(o.to,r):r,i=i||"ng-inline-animate",o.tempClasses=an(o.tempClasses,i),t.push(n,"animate",o)}}}]}],Bi=function(){this.$get=["$$rAF",function(t){function n(n){e.push(n),e.length>1||t(function(){for(var t=0;t<e.length;t++)e[t]();e=[]})}var e=[];return function(){var t=!1;return n(function(){t=!0}),function(e){t?e():n(e)}}}]},Ui=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(t,n,e,i,o){function a(t){this.setHost(t);var n=e(),r=function(t){o(t,0,!1)};this._doneCallbacks=[],this._tick=function(t){var e=i[0];e&&e.hidden?r(t):n(t)},this._state=0}var u=0,s=1,l=2;return a.chain=function(t,n){function e(){return r===t.length?void n(!0):void t[r](function(t){return t===!1?void n(!1):(r++,void e())})}var r=0;e()},a.all=function(t,n){function e(e){o=o&&e,++i===t.length&&n(o)}var i=0,o=!0;r(t,function(t){t.done(e)})},a.prototype={setHost:function(t){this.host=t||{}},done:function(t){this._state===l?t():this._doneCallbacks.push(t)},progress:p,getPromise:function(){if(!this.promise){var n=this;this.promise=t(function(t,e){n.done(function(n){n===!1?e():t()})})}return this.promise},then:function(t,n){return this.getPromise().then(t,n)},"catch":function(t){return this.getPromise()["catch"](t)},"finally":function(t){return this.getPromise()["finally"](t)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end(),this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel(),this._resolve(!1)},complete:function(t){var n=this;n._state===u&&(n._state=s,n._tick(function(){n._resolve(t)}))},_resolve:function(t){this._state!==l&&(r(this._doneCallbacks,function(n){n(t)}),this._doneCallbacks.length=0,this._state=l)}},a}]},Wi=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(t,n,e){return function(n,r){function i(){return t(function(){o(),u||s.complete(),u=!0}),s}function o(){a.addClass&&(n.addClass(a.addClass),a.addClass=null),a.removeClass&&(n.removeClass(a.removeClass),a.removeClass=null),a.to&&(n.css(a.to),a.to=null)}var a=r||{};a.$$prepared||(a=I(a)),a.cleanupStyles&&(a.from=a.to=null),a.from&&(n.css(a.from),a.from=null);var u,s=new e;return{start:i,end:i}}}]},Hi=n("$compile"),Yi=new dn;vn.$inject=["$provide","$$sanitizeUriProvider"],gn.prototype.isFirstChange=function(){return this.previousValue===Yi};var Gi=/^((?:x|data)[\:\-_])/i,Zi=n("$controller"),Xi=/^(\S+)(\s+as\s+([\w$]+))?$/,Ji=function(){this.$get=["$document",function(t){return function(n){return n?!n.nodeType&&n instanceof Fr&&(n=n[0]):n=t[0].body,n.offsetWidth+1}}]},Ki="application/json",Qi={"Content-Type":Ki+";charset=utf-8"},to=/^\[|^\{(?!\{)/,no={"[":/]$/,"{":/}$/},eo=/^\)\]\}',?\n/,ro=n("$http"),io=function(t){return function(){throw ro("legacy","The method `{0}` on the promise returned from `$http` has been disabled.",t)}},oo=Yr.$interpolateMinErr=n("$interpolate");oo.throwNoconcat=function(t){throw oo("noconcat","Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce",t)},oo.interr=function(t,n){return oo("interr","Can't interpolate: {0}\n{1}",t,n.toString())};var ao=function(){this.$get=["$window",function(t){function n(t){var n=function(t){n.data=t,n.called=!0};return n.id=t,n}var e=t.angular.callbacks,r={};return{createCallback:function(t){var i="_"+(e.$$counter++).toString(36),o="angular.callbacks."+i,a=n(i);return r[o]=e[i]=a,o},wasCalled:function(t){return r[t].called},getResponse:function(t){return r[t].data},removeCallback:function(t){var n=r[t];delete e[n.id],delete r[t]}}}]},uo=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,so={http:80,https:443,ftp:21},lo=n("$location"),co={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:Jn("$$absUrl"),url:function(t){if(m(t))return this.$$url;var n=uo.exec(t);return(n[1]||""===t)&&this.path(decodeURIComponent(n[1])),(n[2]||n[1]||""===t)&&this.search(n[3]||""),this.hash(n[5]||""),this},protocol:Jn("$$protocol"),host:Jn("$$host"),port:Jn("$$port"),path:Kn("$$path",function(t){return t=null!==t?t.toString():"","/"==t.charAt(0)?t:"/"+t}),search:function(t,n){switch(arguments.length){case 0:return this.$$search;case 1:if(x(t)||w(t))t=t.toString(),this.$$search=K(t);else{if(!$(t))throw lo("isrcharg","The first argument of the `$location#search()` call must be a string or an object.");t=I(t,{}),r(t,function(n,e){null==n&&delete t[e]}),this.$$search=t}break;default:m(n)||null===n?delete this.$$search[t]:this.$$search[t]=n}return this.$$compose(),this},hash:Kn("$$hash",function(t){return null!==t?t.toString():""}),replace:function(){return this.$$replace=!0,this}};r([Xn,Zn,Gn],function(t){t.prototype=Object.create(co),t.prototype.state=function(n){if(!arguments.length)return this.$$state;if(t!==Gn||!this.$$html5)throw lo("nostate","History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API");return this.$$state=m(n)?null:n,this}});var fo=n("$parse"),ho=Function.prototype.call,po=Function.prototype.apply,vo=Function.prototype.bind,go=dt();r("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(t){go[t]=!0});var mo={n:"\n",f:"\f",r:"\r",t:"\t",v:"\x0B","'":"'",'"':'"'},yo=function(t){this.options=t};yo.prototype={constructor:yo,lex:function(t){for(this.text=t,this.index=0,this.tokens=[];this.index<this.text.length;){var n=this.text.charAt(this.index);if('"'===n||"'"===n)this.readString(n);else if(this.isNumber(n)||"."===n&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(n,"(){}[].,;:?"))this.tokens.push({index:this.index,text:n}),this.index++;else if(this.isWhitespace(n))this.index++;else{var e=n+this.peek(),r=e+this.peek(2),i=go[n],o=go[e],a=go[r];if(i||o||a){var u=a?r:o?e:n;this.tokens.push({index:this.index,text:u,operator:!0}),this.index+=u.length}else this.throwError("Unexpected next character ",this.index,this.index+1)}}return this.tokens},is:function(t,n){return n.indexOf(t)!==-1},peek:function(t){var n=t||1;return this.index+n<this.text.length&&this.text.charAt(this.index+n)},isNumber:function(t){return"0"<=t&&t<="9"&&"string"==typeof t},isWhitespace:function(t){return" "===t||"\r"===t||"\t"===t||"\n"===t||"\x0B"===t||" "===t},isIdentifierStart:function(t){return this.options.isIdentifierStart?this.options.isIdentifierStart(t,this.codePointAt(t)):this.isValidIdentifierStart(t)},isValidIdentifierStart:function(t){return"a"<=t&&t<="z"||"A"<=t&&t<="Z"||"_"===t||"$"===t},isIdentifierContinue:function(t){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(t,this.codePointAt(t)):this.isValidIdentifierContinue(t)},isValidIdentifierContinue:function(t,n){return this.isValidIdentifierStart(t,n)||this.isNumber(t)},codePointAt:function(t){return 1===t.length?t.charCodeAt(0):(t.charCodeAt(0)<<10)+t.charCodeAt(1)-56613888},peekMultichar:function(){var t=this.text.charAt(this.index),n=this.peek();if(!n)return t;var e=t.charCodeAt(0),r=n.charCodeAt(0);return e>=55296&&e<=56319&&r>=56320&&r<=57343?t+n:t},isExpOperator:function(t){return"-"===t||"+"===t||this.isNumber(t)},throwError:function(t,n,e){e=e||this.index;var r=y(n)?"s "+n+"-"+this.index+" ["+this.text.substring(n,e)+"]":" "+e;throw fo("lexerr","Lexer Error: {0} at column{1} in expression [{2}].",t,r,this.text)},readNumber:function(){for(var t="",n=this.index;this.index<this.text.length;){var e=Lr(this.text.charAt(this.index));if("."==e||this.isNumber(e))t+=e;else{var r=this.peek();if("e"==e&&this.isExpOperator(r))t+=e;else if(this.isExpOperator(e)&&r&&this.isNumber(r)&&"e"==t.charAt(t.length-1))t+=e;else{if(!this.isExpOperator(e)||r&&this.isNumber(r)||"e"!=t.charAt(t.length-1))break;this.throwError("Invalid exponent")}}this.index++}this.tokens.push({index:n,text:t,constant:!0,value:Number(t)})},readIdent:function(){var t=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var n=this.peekMultichar();if(!this.isIdentifierContinue(n))break;this.index+=n.length}this.tokens.push({index:t,text:this.text.slice(t,this.index),identifier:!0})},readString:function(t){var n=this.index;this.index++;for(var e="",r=t,i=!1;this.index<this.text.length;){var o=this.text.charAt(this.index);if(r+=o,i){if("u"===o){var a=this.text.substring(this.index+1,this.index+5);a.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+a+"]"),this.index+=4,e+=String.fromCharCode(parseInt(a,16))}else{var u=mo[o];e+=u||o}i=!1}else if("\\"===o)i=!0;else{if(o===t)return this.index++,void this.tokens.push({index:n,text:r,constant:!0,value:e});e+=o}this.index++}this.throwError("Unterminated quote",n)}};var $o=function(t,n){this.lexer=t,this.options=n};$o.Program="Program",$o.ExpressionStatement="ExpressionStatement",$o.AssignmentExpression="AssignmentExpression",$o.ConditionalExpression="ConditionalExpression",$o.LogicalExpression="LogicalExpression",$o.BinaryExpression="BinaryExpression",$o.UnaryExpression="UnaryExpression",$o.CallExpression="CallExpression",$o.MemberExpression="MemberExpression",$o.Identifier="Identifier",$o.Literal="Literal",$o.ArrayExpression="ArrayExpression",$o.Property="Property",$o.ObjectExpression="ObjectExpression",$o.ThisExpression="ThisExpression",$o.LocalsExpression="LocalsExpression",$o.NGValueParameter="NGValueParameter",$o.prototype={ast:function(t){this.text=t,this.tokens=this.lexer.lex(t);var n=this.program();return 0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]),n},program:function(){for(var t=[];;)if(this.tokens.length>0&&!this.peek("}",")",";","]")&&t.push(this.expressionStatement()),!this.expect(";"))return{type:$o.Program,body:t}},expressionStatement:function(){return{type:$o.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var t,n=this.expression();t=this.expect("|");)n=this.filter(n);return n},expression:function(){return this.assignment()},assignment:function(){var t=this.ternary();return this.expect("=")&&(t={type:$o.AssignmentExpression,left:t,right:this.assignment(),operator:"="}),t},ternary:function(){var t,n,e=this.logicalOR();return this.expect("?")&&(t=this.expression(),this.consume(":"))?(n=this.expression(),{type:$o.ConditionalExpression,test:e,alternate:t,consequent:n}):e},logicalOR:function(){for(var t=this.logicalAND();this.expect("||");)t={type:$o.LogicalExpression,operator:"||",left:t,right:this.logicalAND()};return t},logicalAND:function(){for(var t=this.equality();this.expect("&&");)t={type:$o.LogicalExpression,operator:"&&",left:t,right:this.equality()};return t},equality:function(){for(var t,n=this.relational();t=this.expect("==","!=","===","!==");)n={type:$o.BinaryExpression,operator:t.text,left:n,right:this.relational()};return n},relational:function(){for(var t,n=this.additive();t=this.expect("<",">","<=",">=");)n={type:$o.BinaryExpression,operator:t.text,left:n,right:this.additive()};return n},additive:function(){for(var t,n=this.multiplicative();t=this.expect("+","-");)n={type:$o.BinaryExpression,operator:t.text,left:n,right:this.multiplicative()};return n},multiplicative:function(){for(var t,n=this.unary();t=this.expect("*","/","%");)n={type:$o.BinaryExpression,operator:t.text,left:n,right:this.unary()};return n},unary:function(){var t;return(t=this.expect("+","-","!"))?{type:$o.UnaryExpression,operator:t.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var t;this.expect("(")?(t=this.filterChain(),this.consume(")")):this.expect("[")?t=this.arrayDeclaration():this.expect("{")?t=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?t=I(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?t={type:$o.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?t=this.identifier():this.peek().constant?t=this.constant():this.throwError("not a primary expression",this.peek());for(var n;n=this.expect("(","[",".");)"("===n.text?(t={type:$o.CallExpression,callee:t,arguments:this.parseArguments()},this.consume(")")):"["===n.text?(t={type:$o.MemberExpression,object:t,property:this.expression(),computed:!0},this.consume("]")):"."===n.text?t={type:$o.MemberExpression,object:t,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return t},filter:function(t){for(var n=[t],e={type:$o.CallExpression,callee:this.identifier(),arguments:n,filter:!0};this.expect(":");)n.push(this.expression());return e},parseArguments:function(){var t=[];if(")"!==this.peekToken().text)do t.push(this.filterChain());while(this.expect(","));return t},identifier:function(){var t=this.consume();return t.identifier||this.throwError("is not a valid identifier",t),{type:$o.Identifier,name:t.text}},constant:function(){return{type:$o.Literal,value:this.consume().value}},arrayDeclaration:function(){var t=[];if("]"!==this.peekToken().text)do{if(this.peek("]"))break;t.push(this.expression())}while(this.expect(","));return this.consume("]"),{type:$o.ArrayExpression,elements:t}},object:function(){var t,n=[];if("}"!==this.peekToken().text)do{if(this.peek("}"))break;t={type:$o.Property,kind:"init"},this.peek().constant?(t.key=this.constant(),t.computed=!1,this.consume(":"),t.value=this.expression()):this.peek().identifier?(t.key=this.identifier(),t.computed=!1,this.peek(":")?(this.consume(":"),t.value=this.expression()):t.value=t.key):this.peek("[")?(this.consume("["),t.key=this.expression(),this.consume("]"),t.computed=!0,this.consume(":"),t.value=this.expression()):this.throwError("invalid key",this.peek()),n.push(t)}while(this.expect(","));return this.consume("}"),{type:$o.ObjectExpression,properties:n}},throwError:function(t,n){throw fo("syntax","Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].",n.text,t,n.index+1,this.text,this.text.substring(n.index))},consume:function(t){if(0===this.tokens.length)throw fo("ueoe","Unexpected end of expression: {0}",this.text);var n=this.expect(t);return n||this.throwError("is unexpected, expecting ["+t+"]",this.peek()),n},peekToken:function(){if(0===this.tokens.length)throw fo("ueoe","Unexpected end of expression: {0}",this.text);return this.tokens[0]},peek:function(t,n,e,r){return this.peekAhead(0,t,n,e,r)},peekAhead:function(t,n,e,r,i){if(this.tokens.length>t){var o=this.tokens[t],a=o.text;if(a===n||a===e||a===r||a===i||!n&&!e&&!r&&!i)return o}return!1},expect:function(t,n,e,r){var i=this.peek(t,n,e,r);return!!i&&(this.tokens.shift(),i)},selfReferential:{"this":{type:$o.ThisExpression},$locals:{type:$o.LocalsExpression}}},ve.prototype={compile:function(t,n){var e=this,i=this.astBuilder.ast(t);this.state={nextId:0,filters:{},expensiveChecks:n,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},le(i,e.$filter);var o,a="";if(this.stage="assign",o=he(i)){this.state.computing="assign";var u=this.nextId();this.recurse(o,u),this.return_(u),a="fn.assign="+this.generateFunction("assign","s,v,l")}var s=ce(i.body);e.stage="inputs",r(s,function(t,n){var r="fn"+n;e.state[r]={vars:[],body:[],own:{}},e.state.computing=r;var i=e.nextId();e.recurse(t,i),e.return_(i),e.state.inputs.push(r),t.watchId=n}),this.state.computing="fn",this.stage="main",this.recurse(i);var l='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+a+this.watchFns()+"return fn;",c=new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",l)(this.$filter,ne,re,ie,ee,oe,ae,ue,t);return this.state=this.stage=void 0,c.literal=pe(i),c.constant=de(i),c},USE:"use",STRICT:"strict",watchFns:function(){var t=[],n=this.state.inputs,e=this;return r(n,function(n){t.push("var "+n+"="+e.generateFunction(n,"s"))}),n.length&&t.push("fn.inputs=["+n.join(",")+"];"),t.join("")},generateFunction:function(t,n){return"function("+n+"){"+this.varsPrefix(t)+this.body(t)+"};"},filterPrefix:function(){var t=[],n=this;return r(this.state.filters,function(e,r){t.push(e+"=$filter("+n.escape(r)+")")}),t.length?"var "+t.join(",")+";":""},varsPrefix:function(t){return this.state[t].vars.length?"var "+this.state[t].vars.join(",")+";":""},body:function(t){return this.state[t].body.join("")},recurse:function(t,n,e,i,o,a){var u,s,l,c,f,h=this;if(i=i||p,!a&&y(t.watchId))return n=n||this.nextId(),void this.if_("i",this.lazyAssign(n,this.computedMember("i",t.watchId)),this.lazyRecurse(t,n,e,i,o,!0));switch(t.type){case $o.Program:r(t.body,function(n,e){h.recurse(n.expression,void 0,void 0,function(t){s=t}),e!==t.body.length-1?h.current().body.push(s,";"):h.return_(s)});break;case $o.Literal:c=this.escape(t.value),this.assign(n,c),i(c);break;case $o.UnaryExpression:this.recurse(t.argument,void 0,void 0,function(t){s=t}),c=t.operator+"("+this.ifDefined(s,0)+")",this.assign(n,c),i(c);break;case $o.BinaryExpression:this.recurse(t.left,void 0,void 0,function(t){u=t}),this.recurse(t.right,void 0,void 0,function(t){s=t}),c="+"===t.operator?this.plus(u,s):"-"===t.operator?this.ifDefined(u,0)+t.operator+this.ifDefined(s,0):"("+u+")"+t.operator+"("+s+")",this.assign(n,c),i(c);break;case $o.LogicalExpression:n=n||this.nextId(),h.recurse(t.left,n),h.if_("&&"===t.operator?n:h.not(n),h.lazyRecurse(t.right,n)),i(n);break;case $o.ConditionalExpression:n=n||this.nextId(),h.recurse(t.test,n),h.if_(n,h.lazyRecurse(t.alternate,n),h.lazyRecurse(t.consequent,n)),i(n);break;case $o.Identifier:n=n||this.nextId(),e&&(e.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",t.name)+"?l:s"),e.computed=!1,e.name=t.name),ne(t.name),h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",t.name)),function(){
+h.if_("inputs"===h.stage||"s",function(){o&&1!==o&&h.if_(h.not(h.nonComputedMember("s",t.name)),h.lazyAssign(h.nonComputedMember("s",t.name),"{}")),h.assign(n,h.nonComputedMember("s",t.name))})},n&&h.lazyAssign(n,h.nonComputedMember("l",t.name))),(h.state.expensiveChecks||me(t.name))&&h.addEnsureSafeObject(n),i(n);break;case $o.MemberExpression:u=e&&(e.context=this.nextId())||this.nextId(),n=n||this.nextId(),h.recurse(t.object,u,void 0,function(){h.if_(h.notNull(u),function(){o&&1!==o&&h.addEnsureSafeAssignContext(u),t.computed?(s=h.nextId(),h.recurse(t.property,s),h.getStringValue(s),h.addEnsureSafeMemberName(s),o&&1!==o&&h.if_(h.not(h.computedMember(u,s)),h.lazyAssign(h.computedMember(u,s),"{}")),c=h.ensureSafeObject(h.computedMember(u,s)),h.assign(n,c),e&&(e.computed=!0,e.name=s)):(ne(t.property.name),o&&1!==o&&h.if_(h.not(h.nonComputedMember(u,t.property.name)),h.lazyAssign(h.nonComputedMember(u,t.property.name),"{}")),c=h.nonComputedMember(u,t.property.name),(h.state.expensiveChecks||me(t.property.name))&&(c=h.ensureSafeObject(c)),h.assign(n,c),e&&(e.computed=!1,e.name=t.property.name))},function(){h.assign(n,"undefined")}),i(n)},!!o);break;case $o.CallExpression:n=n||this.nextId(),t.filter?(s=h.filter(t.callee.name),l=[],r(t.arguments,function(t){var n=h.nextId();h.recurse(t,n),l.push(n)}),c=s+"("+l.join(",")+")",h.assign(n,c),i(n)):(s=h.nextId(),u={},l=[],h.recurse(t.callee,s,u,function(){h.if_(h.notNull(s),function(){h.addEnsureSafeFunction(s),r(t.arguments,function(t){h.recurse(t,h.nextId(),void 0,function(t){l.push(h.ensureSafeObject(t))})}),u.name?(h.state.expensiveChecks||h.addEnsureSafeObject(u.context),c=h.member(u.context,u.name,u.computed)+"("+l.join(",")+")"):c=s+"("+l.join(",")+")",c=h.ensureSafeObject(c),h.assign(n,c)},function(){h.assign(n,"undefined")}),i(n)}));break;case $o.AssignmentExpression:if(s=this.nextId(),u={},!fe(t.left))throw fo("lval","Trying to assign a value to a non l-value");this.recurse(t.left,void 0,u,function(){h.if_(h.notNull(u.context),function(){h.recurse(t.right,s),h.addEnsureSafeObject(h.member(u.context,u.name,u.computed)),h.addEnsureSafeAssignContext(u.context),c=h.member(u.context,u.name,u.computed)+t.operator+s,h.assign(n,c),i(n||c)})},1);break;case $o.ArrayExpression:l=[],r(t.elements,function(t){h.recurse(t,h.nextId(),void 0,function(t){l.push(t)})}),c="["+l.join(",")+"]",this.assign(n,c),i(c);break;case $o.ObjectExpression:l=[],f=!1,r(t.properties,function(t){t.computed&&(f=!0)}),f?(n=n||this.nextId(),this.assign(n,"{}"),r(t.properties,function(t){t.computed?(u=h.nextId(),h.recurse(t.key,u)):u=t.key.type===$o.Identifier?t.key.name:""+t.key.value,s=h.nextId(),h.recurse(t.value,s),h.assign(h.member(n,u,t.computed),s)})):(r(t.properties,function(n){h.recurse(n.value,t.constant?void 0:h.nextId(),void 0,function(t){l.push(h.escape(n.key.type===$o.Identifier?n.key.name:""+n.key.value)+":"+t)})}),c="{"+l.join(",")+"}",this.assign(n,c)),i(n||c);break;case $o.ThisExpression:this.assign(n,"s"),i("s");break;case $o.LocalsExpression:this.assign(n,"l"),i("l");break;case $o.NGValueParameter:this.assign(n,"v"),i("v")}},getHasOwnProperty:function(t,n){var e=t+"."+n,r=this.current().own;return r.hasOwnProperty(e)||(r[e]=this.nextId(!1,t+"&&("+this.escape(n)+" in "+t+")")),r[e]},assign:function(t,n){if(t)return this.current().body.push(t,"=",n,";"),t},filter:function(t){return this.state.filters.hasOwnProperty(t)||(this.state.filters[t]=this.nextId(!0)),this.state.filters[t]},ifDefined:function(t,n){return"ifDefined("+t+","+this.escape(n)+")"},plus:function(t,n){return"plus("+t+","+n+")"},return_:function(t){this.current().body.push("return ",t,";")},if_:function(t,n,e){if(t===!0)n();else{var r=this.current().body;r.push("if(",t,"){"),n(),r.push("}"),e&&(r.push("else{"),e(),r.push("}"))}},not:function(t){return"!("+t+")"},notNull:function(t){return t+"!=null"},nonComputedMember:function(t,n){var e=/[$_a-zA-Z][$_a-zA-Z0-9]*/,r=/[^$_a-zA-Z0-9]/g;return e.test(n)?t+"."+n:t+'["'+n.replace(r,this.stringEscapeFn)+'"]'},computedMember:function(t,n){return t+"["+n+"]"},member:function(t,n,e){return e?this.computedMember(t,n):this.nonComputedMember(t,n)},addEnsureSafeObject:function(t){this.current().body.push(this.ensureSafeObject(t),";")},addEnsureSafeMemberName:function(t){this.current().body.push(this.ensureSafeMemberName(t),";")},addEnsureSafeFunction:function(t){this.current().body.push(this.ensureSafeFunction(t),";")},addEnsureSafeAssignContext:function(t){this.current().body.push(this.ensureSafeAssignContext(t),";")},ensureSafeObject:function(t){return"ensureSafeObject("+t+",text)"},ensureSafeMemberName:function(t){return"ensureSafeMemberName("+t+",text)"},ensureSafeFunction:function(t){return"ensureSafeFunction("+t+",text)"},getStringValue:function(t){this.assign(t,"getStringValue("+t+")")},ensureSafeAssignContext:function(t){return"ensureSafeAssignContext("+t+",text)"},lazyRecurse:function(t,n,e,r,i,o){var a=this;return function(){a.recurse(t,n,e,r,i,o)}},lazyAssign:function(t,n){var e=this;return function(){e.assign(t,n)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)},escape:function(t){if(x(t))return"'"+t.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(w(t))return t.toString();if(t===!0)return"true";if(t===!1)return"false";if(null===t)return"null";if("undefined"==typeof t)return"undefined";throw fo("esc","IMPOSSIBLE")},nextId:function(t,n){var e="v"+this.state.nextId++;return t||this.current().vars.push(e+(n?"="+n:"")),e},current:function(){return this.state[this.state.computing]}},ge.prototype={compile:function(t,n){var e=this,i=this.astBuilder.ast(t);this.expression=t,this.expensiveChecks=n,le(i,e.$filter);var o,a;(o=he(i))&&(a=this.recurse(o));var u,s=ce(i.body);s&&(u=[],r(s,function(t,n){var r=e.recurse(t);t.input=r,u.push(r),t.watchId=n}));var l=[];r(i.body,function(t){l.push(e.recurse(t.expression))});var c=0===i.body.length?p:1===i.body.length?l[0]:function(t,n){var e;return r(l,function(r){e=r(t,n)}),e};return a&&(c.assign=function(t,n,e){return a(t,e,n)}),u&&(c.inputs=u),c.literal=pe(i),c.constant=de(i),c},recurse:function(t,n,e){var i,o,a,u=this;if(t.input)return this.inputs(t.input,t.watchId);switch(t.type){case $o.Literal:return this.value(t.value,n);case $o.UnaryExpression:return o=this.recurse(t.argument),this["unary"+t.operator](o,n);case $o.BinaryExpression:return i=this.recurse(t.left),o=this.recurse(t.right),this["binary"+t.operator](i,o,n);case $o.LogicalExpression:return i=this.recurse(t.left),o=this.recurse(t.right),this["binary"+t.operator](i,o,n);case $o.ConditionalExpression:return this["ternary?:"](this.recurse(t.test),this.recurse(t.alternate),this.recurse(t.consequent),n);case $o.Identifier:return ne(t.name,u.expression),u.identifier(t.name,u.expensiveChecks||me(t.name),n,e,u.expression);case $o.MemberExpression:return i=this.recurse(t.object,!1,!!e),t.computed||(ne(t.property.name,u.expression),o=t.property.name),t.computed&&(o=this.recurse(t.property)),t.computed?this.computedMember(i,o,n,e,u.expression):this.nonComputedMember(i,o,u.expensiveChecks,n,e,u.expression);case $o.CallExpression:return a=[],r(t.arguments,function(t){a.push(u.recurse(t))}),t.filter&&(o=this.$filter(t.callee.name)),t.filter||(o=this.recurse(t.callee,!0)),t.filter?function(t,e,r,i){for(var u=[],s=0;s<a.length;++s)u.push(a[s](t,e,r,i));var l=o.apply(void 0,u,i);return n?{context:void 0,name:void 0,value:l}:l}:function(t,e,r,i){var s,l=o(t,e,r,i);if(null!=l.value){re(l.context,u.expression),ie(l.value,u.expression);for(var c=[],f=0;f<a.length;++f)c.push(re(a[f](t,e,r,i),u.expression));s=re(l.value.apply(l.context,c),u.expression)}return n?{value:s}:s};case $o.AssignmentExpression:return i=this.recurse(t.left,!0,1),o=this.recurse(t.right),function(t,e,r,a){var s=i(t,e,r,a),l=o(t,e,r,a);return re(s.value,u.expression),oe(s.context),s.context[s.name]=l,n?{value:l}:l};case $o.ArrayExpression:return a=[],r(t.elements,function(t){a.push(u.recurse(t))}),function(t,e,r,i){for(var o=[],u=0;u<a.length;++u)o.push(a[u](t,e,r,i));return n?{value:o}:o};case $o.ObjectExpression:return a=[],r(t.properties,function(t){t.computed?a.push({key:u.recurse(t.key),computed:!0,value:u.recurse(t.value)}):a.push({key:t.key.type===$o.Identifier?t.key.name:""+t.key.value,computed:!1,value:u.recurse(t.value)})}),function(t,e,r,i){for(var o={},u=0;u<a.length;++u)a[u].computed?o[a[u].key(t,e,r,i)]=a[u].value(t,e,r,i):o[a[u].key]=a[u].value(t,e,r,i);return n?{value:o}:o};case $o.ThisExpression:return function(t){return n?{value:t}:t};case $o.LocalsExpression:return function(t,e){return n?{value:e}:e};case $o.NGValueParameter:return function(t,e,r){return n?{value:r}:r}}},"unary+":function(t,n){return function(e,r,i,o){var a=t(e,r,i,o);return a=y(a)?+a:0,n?{value:a}:a}},"unary-":function(t,n){return function(e,r,i,o){var a=t(e,r,i,o);return a=y(a)?-a:0,n?{value:a}:a}},"unary!":function(t,n){return function(e,r,i,o){var a=!t(e,r,i,o);return n?{value:a}:a}},"binary+":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a),s=n(r,i,o,a),l=ue(u,s);return e?{value:l}:l}},"binary-":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a),s=n(r,i,o,a),l=(y(u)?u:0)-(y(s)?s:0);return e?{value:l}:l}},"binary*":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)*n(r,i,o,a);return e?{value:u}:u}},"binary/":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)/n(r,i,o,a);return e?{value:u}:u}},"binary%":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)%n(r,i,o,a);return e?{value:u}:u}},"binary===":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)===n(r,i,o,a);return e?{value:u}:u}},"binary!==":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)!==n(r,i,o,a);return e?{value:u}:u}},"binary==":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)==n(r,i,o,a);return e?{value:u}:u}},"binary!=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)!=n(r,i,o,a);return e?{value:u}:u}},"binary<":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)<n(r,i,o,a);return e?{value:u}:u}},"binary>":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)>n(r,i,o,a);return e?{value:u}:u}},"binary<=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)<=n(r,i,o,a);return e?{value:u}:u}},"binary>=":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)>=n(r,i,o,a);return e?{value:u}:u}},"binary&&":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)&&n(r,i,o,a);return e?{value:u}:u}},"binary||":function(t,n,e){return function(r,i,o,a){var u=t(r,i,o,a)||n(r,i,o,a);return e?{value:u}:u}},"ternary?:":function(t,n,e,r){return function(i,o,a,u){var s=t(i,o,a,u)?n(i,o,a,u):e(i,o,a,u);return r?{value:s}:s}},value:function(t,n){return function(){return n?{context:void 0,name:void 0,value:t}:t}},identifier:function(t,n,e,r,i){return function(o,a,u,s){var l=a&&t in a?a:o;r&&1!==r&&l&&!l[t]&&(l[t]={});var c=l?l[t]:void 0;return n&&re(c,i),e?{context:l,name:t,value:c}:c}},computedMember:function(t,n,e,r,i){return function(o,a,u,s){var l,c,f=t(o,a,u,s);return null!=f&&(l=n(o,a,u,s),l=ee(l),ne(l,i),r&&1!==r&&(oe(f),f&&!f[l]&&(f[l]={})),c=f[l],re(c,i)),e?{context:f,name:l,value:c}:c}},nonComputedMember:function(t,n,e,r,i,o){return function(a,u,s,l){var c=t(a,u,s,l);i&&1!==i&&(oe(c),c&&!c[n]&&(c[n]={}));var f=null!=c?c[n]:void 0;return(e||me(n))&&re(f,o),r?{context:c,name:n,value:f}:f}},inputs:function(t,n){return function(e,r,i,o){return o?o[n]:t(e,r,i)}}};var bo=function(t,n,e){this.lexer=t,this.$filter=n,this.options=e,this.ast=new $o(t,e),this.astCompiler=e.csp?new ge(this.ast,n):new ve(this.ast,n)};bo.prototype={constructor:bo,parse:function(t){return this.astCompiler.compile(t,this.options.expensiveChecks)}};var xo=Object.prototype.valueOf,wo=n("$sce"),Co={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},So=n("$compile"),_o=t.document.createElement("a"),Mo=je(t.location.href);De.$inject=["$document"],Ie.$inject=["$provide"];var ko=22,Ao=".",Eo="0";Ue.$inject=["$locale"],We.$inject=["$locale"];var Po={yyyy:Xe("FullYear",4,0,!1,!0),yy:Xe("FullYear",2,0,!0,!0),y:Xe("FullYear",1,0,!1,!0),MMMM:Je("Month"),MMM:Je("Month",!0),MM:Xe("Month",2,1),M:Xe("Month",1,1),LLLL:Je("Month",!1,!0),dd:Xe("Date",2),d:Xe("Date",1),HH:Xe("Hours",2),H:Xe("Hours",1),hh:Xe("Hours",2,-12),h:Xe("Hours",1,-12),mm:Xe("Minutes",2),m:Xe("Minutes",1),ss:Xe("Seconds",2),s:Xe("Seconds",1),sss:Xe("Milliseconds",3),EEEE:Je("Day"),EEE:Je("Day",!0),a:er,Z:Ke,ww:nr(2),w:nr(1),G:rr,GG:rr,GGG:rr,GGGG:ir},Oo=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,To=/^\-?\d+$/;or.$inject=["$locale"];var Lo=v(Lr),jo=v(jr);lr.$inject=["$parse"];var No=v({restrict:"E",compile:function(t,n){if(!n.href&&!n.xlinkHref)return function(t,n){if("a"===n[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===Ur.call(n.prop("href"))?"xlink:href":"href";n.on("click",function(t){n.attr(e)||t.preventDefault()})}}}}),Ro={};r(ki,function(t,n){function e(t,e,i){t.$watch(i[r],function(t){i.$set(n,!!t)})}if("multiple"!=t){var r=mn("ng-"+n),i=e;"checked"===t&&(i=function(t,n,i){i.ngModel!==i[r]&&e(t,n,i)}),Ro[r]=function(){return{restrict:"A",priority:100,link:i}}}}),r(Ei,function(t,n){Ro[n]=function(){return{priority:100,link:function(t,e,r){if("ngPattern"===n&&"/"==r.ngPattern.charAt(0)){var i=r.ngPattern.match(Pr);if(i)return void r.$set("ngPattern",new RegExp(i[1],i[2]))}t.$watch(r[n],function(t){r.$set(n,t)})}}}}),r(["src","srcset","href"],function(t){var n=mn("ng-"+t);Ro[n]=function(){return{priority:99,link:function(e,r,i){var o=t,a=t;"href"===t&&"[object SVGAnimatedString]"===Ur.call(r.prop("href"))&&(a="xlinkHref",i.$attr[a]="xlink:href",o=null),i.$observe(n,function(n){return n?(i.$set(a,n),void(Dr&&o&&r.prop(o,i[a]))):void("href"===t&&i.$set(a,null))})}}}});var Do={$addControl:p,$$renameControl:fr,$removeControl:p,$setValidity:p,$setDirty:p,$setPristine:p,$setSubmitted:p},Fo="ng-submitted";hr.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Io=function(t){return["$timeout","$parse",function(n,e){function r(t){return""===t?e('this[""]').assign:e(t).assign||p}var i={name:"form",restrict:t?"EAC":"E",require:["form","^^?form"],controller:hr,compile:function(e,i){e.addClass(xa).addClass($a);var o=i.name?"name":!(!t||!i.ngForm)&&"ngForm";return{pre:function(t,e,i,a){var u=a[0];if(!("action"in i)){var s=function(n){t.$apply(function(){u.$commitViewValue(),u.$setSubmitted()}),n.preventDefault()};di(e[0],"submit",s),e.on("$destroy",function(){n(function(){vi(e[0],"submit",s)},0,!1)})}var c=a[1]||u.$$parentForm;c.$addControl(u);var f=o?r(u.$name):p;o&&(f(t,u),i.$observe(o,function(n){u.$name!==n&&(f(t,void 0),u.$$parentForm.$$renameControl(u,n),(f=r(u.$name))(t,u))})),e.on("$destroy",function(){u.$$parentForm.$removeControl(u),f(t,void 0),l(u,Do)})}}}};return i}]},qo=Io(),zo=Io(!0),Vo=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Bo=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:\/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Uo=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Wo=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Ho=/^(\d{4,})-(\d{2})-(\d{2})$/,Yo=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Go=/^(\d{4,})-W(\d\d)$/,Zo=/^(\d{4,})-(\d\d)$/,Xo=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Jo="keydown wheel mousedown",Ko=dt();r("date,datetime-local,month,time,week".split(","),function(t){Ko[t]=!0});var Qo={text:dr,date:yr("date",Ho,mr(Ho,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":yr("datetimelocal",Yo,mr(Yo,["yyyy","MM","dd","HH","mm","ss","sss"]),"yyyy-MM-ddTHH:mm:ss.sss"),time:yr("time",Xo,mr(Xo,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:yr("week",Go,gr,"yyyy-Www"),month:yr("month",Zo,mr(Zo,["yyyy","MM"]),"yyyy-MM"),number:br,url:xr,email:wr,radio:Cr,checkbox:_r,hidden:p,button:p,submit:p,reset:p,file:p},ta=["$browser","$sniffer","$filter","$parse",function(t,n,e,r){return{restrict:"E",require:["?ngModel"],link:{pre:function(i,o,a,u){u[0]&&(Qo[Lr(a.type)]||Qo.text)(i,o,a,u[0],n,t,e,r)}}}}],na=/^(true|false|\d+)$/,ea=function(){return{restrict:"A",priority:100,compile:function(t,n){return na.test(n.ngValue)?function(t,n,e){e.$set("value",t.$eval(e.ngValue))}:function(t,n,e){t.$watch(e.ngValue,function(t){e.$set("value",t)})}}}},ra=["$compile",function(t){return{restrict:"AC",compile:function(n){return t.$$addBindingClass(n),function(n,e,r){t.$$addBindingInfo(e,r.ngBind),e=e[0],n.$watch(r.ngBind,function(t){e.textContent=m(t)?"":t})}}}}],ia=["$interpolate","$compile",function(t,n){return{compile:function(e){return n.$$addBindingClass(e),function(e,r,i){var o=t(r.attr(i.$attr.ngBindTemplate));n.$$addBindingInfo(r,o.expressions),r=r[0],i.$observe("ngBindTemplate",function(t){r.textContent=m(t)?"":t})}}}}],oa=["$sce","$parse","$compile",function(t,n,e){return{restrict:"A",compile:function(r,i){var o=n(i.ngBindHtml),a=n(i.ngBindHtml,function(n){return t.valueOf(n)});return e.$$addBindingClass(r),function(n,r,i){e.$$addBindingInfo(r,i.ngBindHtml),n.$watch(a,function(){var e=o(n);r.html(t.getTrustedHtml(e)||"")})}}}}],aa=v({restrict:"A",require:"ngModel",link:function(t,n,e,r){r.$viewChangeListeners.push(function(){t.$eval(e.ngChange)})}}),ua=Mr("",!0),sa=Mr("Odd",0),la=Mr("Even",1),ca=cr({compile:function(t,n){n.$set("ngCloak",void 0),t.removeClass("ng-cloak")}}),fa=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ha={},pa={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(t){var n=mn("ng-"+t);ha[n]=["$parse","$rootScope",function(e,r){return{restrict:"A",compile:function(i,o){var a=e(o[n],null,!0);return function(n,e){e.on(t,function(e){var i=function(){a(n,{$event:e})};pa[t]&&r.$$phase?n.$evalAsync(i):n.$apply(i)})}}}}]});var da=["$animate","$compile",function(t,n){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(e,r,i,o,a){var u,s,l;e.$watch(i.ngIf,function(e){e?s||a(function(e,o){s=o,e[e.length++]=n.$$createComment("end ngIf",i.ngIf),u={clone:e},t.enter(e,r.parent(),r)}):(l&&(l.remove(),l=null),s&&(s.$destroy(),s=null),u&&(l=pt(u.clone),t.leave(l).then(function(){l=null}),u=null))})}}}],va=["$templateRequest","$anchorScroll","$animate",function(t,n,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Yr.noop,compile:function(r,i){var o=i.ngInclude||i.src,a=i.onload||"",u=i.autoscroll;return function(r,i,s,l,c){var f,h,p,d=0,v=function(){h&&(h.remove(),h=null),f&&(f.$destroy(),f=null),p&&(e.leave(p).then(function(){h=null}),h=p,p=null)};r.$watch(o,function(o){var s=function(){!y(u)||u&&!r.$eval(u)||n()},h=++d;o?(t(o,!0).then(function(t){if(!r.$$destroyed&&h===d){var n=r.$new();l.template=t;var u=c(n,function(t){v(),e.enter(t,null,i).then(s)});f=n,p=u,f.$emit("$includeContentLoaded",o),r.$eval(a)}},function(){r.$$destroyed||h===d&&(v(),r.$emit("$includeContentError",o))}),r.$emit("$includeContentRequested",o)):(v(),l.template=null)})}}}}],ga=["$compile",function(n){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(e,r,i,o){return Ur.call(r[0]).match(/SVG/)?(r.empty(),void n(Mt(o.template,t.document).childNodes)(e,function(t){r.append(t)},{futureParentElement:r})):(r.html(o.template),void n(r.contents())(e))}}}],ma=cr({priority:450,compile:function(){return{pre:function(t,n,e){t.$eval(e.ngInit)}}}}),ya=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(t,n,e,i){var o=n.attr(e.$attr.ngList)||", ",a="false"!==e.ngTrim,u=a?Jr(o):o,s=function(t){if(!m(t)){var n=[];return t&&r(t.split(u),function(t){t&&n.push(a?Jr(t):t)}),n}};i.$parsers.push(s),i.$formatters.push(function(t){if(Zr(t))return t.join(o)}),i.$isEmpty=function(t){return!t||!t.length}}}},$a="ng-valid",ba="ng-invalid",xa="ng-pristine",wa="ng-dirty",Ca="ng-untouched",Sa="ng-touched",_a="ng-pending",Ma="ng-empty",ka="ng-not-empty",Aa=n("ngModel"),Ea=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(t,n,e,i,o,a,u,s,l,c){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=void 0,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=void 0,this.$name=c(e.name||"",!1)(t),this.$$parentForm=Do;var f,h=o(e.ngModel),d=h.assign,v=h,g=d,$=null,b=this;this.$$setOptions=function(t){if(b.$options=t,t&&t.getterSetter){var n=o(e.ngModel+"()"),r=o(e.ngModel+"($$$p)");v=function(t){var e=h(t);return S(e)&&(e=n(t)),e},g=function(t,n){S(h(t))?r(t,{$$$p:n}):d(t,n)}}else if(!h.assign)throw Aa("nonassign","Expression '{0}' is non-assignable. Element: {1}",e.ngModel,X(i))},this.$render=p,this.$isEmpty=function(t){return m(t)||""===t||null===t||t!==t},this.$$updateEmptyClasses=function(t){b.$isEmpty(t)?(a.removeClass(i,ka),a.addClass(i,Ma)):(a.removeClass(i,Ma),a.addClass(i,ka))};var x=0;kr({ctrl:this,$element:i,set:function(t,n){t[n]=!0},unset:function(t,n){delete t[n]},$animate:a}),this.$setPristine=function(){b.$dirty=!1,b.$pristine=!0,a.removeClass(i,wa),a.addClass(i,xa)},this.$setDirty=function(){b.$dirty=!0,b.$pristine=!1,a.removeClass(i,xa),a.addClass(i,wa),b.$$parentForm.$setDirty()},this.$setUntouched=function(){b.$touched=!1,b.$untouched=!0,a.setClass(i,Ca,Sa)},this.$setTouched=function(){b.$touched=!0,b.$untouched=!1,a.setClass(i,Sa,Ca)},this.$rollbackViewValue=function(){u.cancel($),b.$viewValue=b.$$lastCommittedViewValue,b.$render()},this.$validate=function(){if(!w(b.$modelValue)||!isNaN(b.$modelValue)){var t=b.$$lastCommittedViewValue,n=b.$$rawModelValue,e=b.$valid,r=b.$modelValue,i=b.$options&&b.$options.allowInvalid;b.$$runValidators(n,t,function(t){i||e===t||(b.$modelValue=t?n:void 0,b.$modelValue!==r&&b.$$writeModelToScope())})}},this.$$runValidators=function(t,n,e){function i(){var t=b.$$parserName||"parse";return m(f)?(u(t,null),!0):(f||(r(b.$validators,function(t,n){u(n,null)}),r(b.$asyncValidators,function(t,n){u(n,null)})),u(t,f),f)}function o(){var e=!0;return r(b.$validators,function(r,i){var o=r(t,n);e=e&&o,u(i,o)}),!!e||(r(b.$asyncValidators,function(t,n){u(n,null)}),!1)}function a(){var e=[],i=!0;r(b.$asyncValidators,function(r,o){var a=r(t,n);if(!T(a))throw Aa("nopromise","Expected asynchronous validator to return a promise but got '{0}' instead.",a);u(o,void 0),e.push(a.then(function(){u(o,!0)},function(){i=!1,u(o,!1)}))}),e.length?l.all(e).then(function(){s(i)},p):s(!0)}function u(t,n){c===x&&b.$setValidity(t,n)}function s(t){c===x&&e(t)}x++;var c=x;return i()&&o()?void a():void s(!1)},this.$commitViewValue=function(){var t=b.$viewValue;u.cancel($),(b.$$lastCommittedViewValue!==t||""===t&&b.$$hasNativeValidators)&&(b.$$updateEmptyClasses(t),b.$$lastCommittedViewValue=t,b.$pristine&&this.$setDirty(),this.$$parseAndValidate())},this.$$parseAndValidate=function(){function n(){b.$modelValue!==o&&b.$$writeModelToScope()}var e=b.$$lastCommittedViewValue,r=e;if(f=!m(r)||void 0)for(var i=0;i<b.$parsers.length;i++)if(r=b.$parsers[i](r),m(r)){f=!1;break}w(b.$modelValue)&&isNaN(b.$modelValue)&&(b.$modelValue=v(t));var o=b.$modelValue,a=b.$options&&b.$options.allowInvalid;b.$$rawModelValue=r,a&&(b.$modelValue=r,n()),b.$$runValidators(r,b.$$lastCommittedViewValue,function(t){a||(b.$modelValue=t?r:void 0,n())})},this.$$writeModelToScope=function(){g(t,b.$modelValue),r(b.$viewChangeListeners,function(t){try{t()}catch(e){n(e)}})},this.$setViewValue=function(t,n){b.$viewValue=t,b.$options&&!b.$options.updateOnDefault||b.$$debounceViewValueCommit(n)},this.$$debounceViewValueCommit=function(n){var e,r=0,i=b.$options;i&&y(i.debounce)&&(e=i.debounce,w(e)?r=e:w(e[n])?r=e[n]:w(e["default"])&&(r=e["default"])),u.cancel($),r?$=u(function(){b.$commitViewValue()},r):s.$$phase?b.$commitViewValue():t.$apply(function(){b.$commitViewValue()})},t.$watch(function(){var n=v(t);if(n!==b.$modelValue&&(b.$modelValue===b.$modelValue||n===n)){b.$modelValue=b.$$rawModelValue=n,f=void 0;for(var e=b.$formatters,r=e.length,i=n;r--;)i=e[r](i);b.$viewValue!==i&&(b.$$updateEmptyClasses(i),b.$viewValue=b.$$lastCommittedViewValue=i,b.$render(),b.$$runValidators(n,i,p))}return n})}],Pa=["$rootScope",function(t){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Ea,priority:1,compile:function(n){return n.addClass(xa).addClass(Ca).addClass($a),{pre:function(t,n,e,r){var i=r[0],o=r[1]||i.$$parentForm;i.$$setOptions(r[2]&&r[2].$options),o.$addControl(i),e.$observe("name",function(t){i.$name!==t&&i.$$parentForm.$$renameControl(i,t)}),t.$on("$destroy",function(){i.$$parentForm.$removeControl(i)})},post:function(n,e,r,i){var o=i[0];o.$options&&o.$options.updateOn&&e.on(o.$options.updateOn,function(t){o.$$debounceViewValueCommit(t&&t.type)}),e.on("blur",function(){o.$touched||(t.$$phase?n.$evalAsync(o.$setTouched):n.$apply(o.$setTouched))})}}}}}],Oa=/(\s+|^)default(\s+|$)/,Ta=function(){return{restrict:"A",controller:["$scope","$attrs",function(t,n){var e=this;this.$options=I(t.$eval(n.ngModelOptions)),y(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=Jr(this.$options.updateOn.replace(Oa,function(){return e.$options.updateOnDefault=!0," "}))):this.$options.updateOnDefault=!0}]}},La=cr({terminal:!0,priority:1e3}),ja=n("ngOptions"),Na=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,Ra=["$compile","$document","$parse",function(n,i,o){function a(t,n,r){function i(t,n,e,r,i){this.selectValue=t,this.viewValue=n,this.label=e,this.group=r,this.disabled=i}function a(t){var n;if(!l&&e(t))n=t;else{n=[];for(var r in t)t.hasOwnProperty(r)&&"$"!==r.charAt(0)&&n.push(r)}return n}var u=t.match(Na);if(!u)throw ja("iexp","Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}",t,X(n));var s=u[5]||u[7],l=u[6],c=/ as /.test(u[0])&&u[1],f=u[9],h=o(u[2]?u[1]:s),p=c&&o(c),d=p||h,v=f&&o(f),g=f?function(t,n){return v(r,n)}:function(t){return Jt(t)},m=function(t,n){return g(t,C(t,n))},y=o(u[2]||u[1]),$=o(u[3]||""),b=o(u[4]||""),x=o(u[8]),w={},C=l?function(t,n){return w[l]=n,w[s]=t,w}:function(t){return w[s]=t,w};return{trackBy:f,getTrackByValue:m,getWatchables:o(x,function(t){var n=[];t=t||[];for(var e=a(t),i=e.length,o=0;o<i;o++){var s=t===e?o:e[o],l=t[s],c=C(l,s),f=g(l,c);if(n.push(f),u[2]||u[1]){var h=y(r,c);n.push(h)}if(u[4]){var p=b(r,c);n.push(p)}}return n}),getOptions:function(){for(var t=[],n={},e=x(r)||[],o=a(e),u=o.length,s=0;s<u;s++){var l=e===o?s:o[s],c=e[l],h=C(c,l),p=d(r,h),v=g(p,h),w=y(r,h),S=$(r,h),_=b(r,h),M=new i(v,p,w,S,_);t.push(M),n[v]=M}return{items:t,selectValueMap:n,getOptionFromViewValue:function(t){return n[m(t)]},getViewValueFromOption:function(t){return f?Yr.copy(t.viewValue):t.viewValue}}}}}function u(t,e,o,u){function c(t,n){var e=s.cloneNode(!1);n.appendChild(e),f(t,e)}function f(t,n){t.element=n,n.disabled=t.disabled,t.label!==n.label&&(n.label=t.label,n.textContent=t.label),t.value!==n.value&&(n.value=t.selectValue)}function h(){var t=C&&d.readValue();if(C)for(var n=C.items.length-1;n>=0;n--){var r=C.items[n];Bt(y(r.group)?r.element.parentNode:r.element)}C=S.getOptions();var i={};if(x&&e.prepend(p),C.items.forEach(function(t){var n;y(t.group)?(n=i[t.group],n||(n=l.cloneNode(!1),_.appendChild(n),n.label=null===t.group?"null":t.group,i[t.group]=n),c(t,n)):c(t,_)}),e[0].appendChild(_),v.$render(),!v.$isEmpty(t)){var o=d.readValue(),a=S.trackBy||g;(a?q(t,o):t===o)||(v.$setViewValue(o),v.$render())}}for(var p,d=u[0],v=u[1],g=o.multiple,m=0,$=e.children(),b=$.length;m<b;m++)if(""===$[m].value){p=$.eq(m);break}var x=!!p,w=Fr(s.cloneNode(!1));w.val("?");var C,S=a(o.ngOptions,e,t),_=i[0].createDocumentFragment(),M=function(){x||e.prepend(p),e.val(""),p.prop("selected",!0),p.attr("selected",!0)},k=function(){x||p.remove()},A=function(){e.prepend(w),e.val("?"),w.prop("selected",!0),w.attr("selected",!0)},E=function(){w.remove()};g?(v.$isEmpty=function(t){return!t||0===t.length},d.writeValue=function(t){C.items.forEach(function(t){t.element.selected=!1}),t&&t.forEach(function(t){var n=C.getOptionFromViewValue(t);n&&(n.element.selected=!0)})},d.readValue=function(){var t=e.val()||[],n=[];return r(t,function(t){var e=C.selectValueMap[t];e&&!e.disabled&&n.push(C.getViewValueFromOption(e))}),n},S.trackBy&&t.$watchCollection(function(){if(Zr(v.$viewValue))return v.$viewValue.map(function(t){return S.getTrackByValue(t)})},function(){v.$render()})):(d.writeValue=function(t){var n=C.getOptionFromViewValue(t);n?(e[0].value!==n.selectValue&&(E(),k(),e[0].value=n.selectValue,n.element.selected=!0),n.element.setAttribute("selected","selected")):null===t||x?(E(),M()):(k(),A())},d.readValue=function(){var t=C.selectValueMap[e.val()];return t&&!t.disabled?(k(),E(),C.getViewValueFromOption(t)):null},S.trackBy&&t.$watch(function(){return S.getTrackByValue(v.$viewValue)},function(){v.$render()})),x?(p.remove(),n(p)(t),p.removeClass("ng-scope")):p=Fr(s.cloneNode(!1)),e.empty(),h(),t.$watchCollection(S.getWatchables,h)}var s=t.document.createElement("option"),l=t.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(t,n,e,r){r[0].registerOption=p},post:u}}}],Da=["$locale","$interpolate","$log",function(t,n,e){var i=/{}/g,o=/^when(Minus)?(.+)$/;return{link:function(a,u,s){function l(t){u.text(t||"")}var c,f=s.count,h=s.$attr.when&&u.attr(s.$attr.when),d=s.offset||0,v=a.$eval(h)||{},g={},y=n.startSymbol(),$=n.endSymbol(),b=y+f+"-"+d+$,x=Yr.noop;r(s,function(t,n){var e=o.exec(n);if(e){var r=(e[1]?"-":"")+Lr(e[2]);v[r]=u.attr(s.$attr[n])}}),r(v,function(t,e){g[e]=n(t.replace(i,b))}),a.$watch(f,function(n){var r=parseFloat(n),i=isNaN(r);if(i||r in v||(r=t.pluralCat(r-d)),r!==c&&!(i&&w(c)&&isNaN(c))){x();var o=g[r];m(o)?(null!=n&&e.debug("ngPluralize: no rule defined for '"+r+"' in "+h),x=p,l()):x=a.$watch(o,l),c=r}})}}}],Fa=["$parse","$animate","$compile",function(t,i,o){var a="$$NG_REMOVED",u=n("ngRepeat"),s=function(t,n,e,r,i,o,a){t[e]=r,i&&(t[i]=o),t.$index=n,t.$first=0===n,t.$last=n===a-1,t.$middle=!(t.$first||t.$last),t.$odd=!(t.$even=0===(1&n))},l=function(t){return t.clone[0]},c=function(t){return t.clone[t.clone.length-1]};return{restrict:"A",multiElement:!0,transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,compile:function(n,f){var h=f.ngRepeat,p=o.$$createComment("end ngRepeat",h),d=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!d)throw u("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",h);var v=d[1],g=d[2],m=d[3],y=d[4];if(d=v.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/),!d)throw u("iidexp","'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",v);var $=d[3]||d[1],b=d[2];if(m&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(m)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(m)))throw u("badident","alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",m);var x,w,C,S,_={$id:Jt};return y?x=t(y):(C=function(t,n){return Jt(n)},S=function(t){return t}),function(t,n,o,f,d){x&&(w=function(n,e,r){return b&&(_[b]=n),_[$]=e,_.$index=r,x(t,_)});var v=dt();t.$watchCollection(g,function(o){var f,g,y,x,_,M,k,A,E,P,O,T,L=n[0],j=dt();if(m&&(t[m]=o),e(o))E=o,
+A=w||C;else{A=w||S,E=[];for(var N in o)Tr.call(o,N)&&"$"!==N.charAt(0)&&E.push(N)}for(x=E.length,O=new Array(x),f=0;f<x;f++)if(_=o===E?f:E[f],M=o[_],k=A(_,M,f),v[k])P=v[k],delete v[k],j[k]=P,O[f]=P;else{if(j[k])throw r(O,function(t){t&&t.scope&&(v[t.id]=t)}),u("dupes","Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",h,k,M);O[f]={id:k,scope:void 0,clone:void 0},j[k]=!0}for(var R in v){if(P=v[R],T=pt(P.clone),i.leave(T),T[0].parentNode)for(f=0,g=T.length;f<g;f++)T[f][a]=!0;P.scope.$destroy()}for(f=0;f<x;f++)if(_=o===E?f:E[f],M=o[_],P=O[f],P.scope){y=L;do y=y.nextSibling;while(y&&y[a]);l(P)!=y&&i.move(pt(P.clone),null,L),L=c(P),s(P.scope,f,$,M,b,_,x)}else d(function(t,n){P.scope=n;var e=p.cloneNode(!1);t[t.length++]=e,i.enter(t,null,L),L=e,P.clone=t,j[P.id]=P,s(P.scope,f,$,M,b,_,x)});v=j})}}}}],Ia="ng-hide",qa="ng-hide-animate",za=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(n,e,r){n.$watch(r.ngShow,function(n){t[n?"removeClass":"addClass"](e,Ia,{tempClasses:qa})})}}}],Va=["$animate",function(t){return{restrict:"A",multiElement:!0,link:function(n,e,r){n.$watch(r.ngHide,function(n){t[n?"addClass":"removeClass"](e,Ia,{tempClasses:qa})})}}}],Ba=cr(function(t,n,e){t.$watch(e.ngStyle,function(t,e){e&&t!==e&&r(e,function(t,e){n.css(e,"")}),t&&n.css(t)},!0)}),Ua=["$animate","$compile",function(t,n){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(e,i,o,a){var u=o.ngSwitch||o.on,s=[],l=[],c=[],f=[],h=function(t,n){return function(){t.splice(n,1)}};e.$watch(u,function(e){var i,o;for(i=0,o=c.length;i<o;++i)t.cancel(c[i]);for(c.length=0,i=0,o=f.length;i<o;++i){var u=pt(l[i].clone);f[i].$destroy();var p=c[i]=t.leave(u);p.then(h(c,i))}l.length=0,f.length=0,(s=a.cases["!"+e]||a.cases["?"])&&r(s,function(e){e.transclude(function(r,i){f.push(i);var o=e.element;r[r.length++]=n.$$createComment("end ngSwitchWhen");var a={clone:r};l.push(a),t.enter(r,o.parent(),o)})})})}}}],Wa=cr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,n,e,r,i){r.cases["!"+e.ngSwitchWhen]=r.cases["!"+e.ngSwitchWhen]||[],r.cases["!"+e.ngSwitchWhen].push({transclude:i,element:n})}}),Ha=cr({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(t,n,e,r,i){r.cases["?"]=r.cases["?"]||[],r.cases["?"].push({transclude:i,element:n})}}),Ya=n("ngTransclude"),Ga=["$compile",function(t){return{restrict:"EAC",terminal:!0,compile:function(n){var e=t(n.contents());return n.empty(),function(t,n,r,i,o){function a(t,e){t.length?n.append(t):(u(),e.$destroy())}function u(){e(t,function(t){n.append(t)})}if(!o)throw Ya("orphan","Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}",X(n));r.ngTransclude===r.$attr.ngTransclude&&(r.ngTransclude="");var s=r.ngTransclude||r.ngTranscludeSlot;o(a,null,s),s&&!o.isSlotFilled(s)&&u()}}}}],Za=["$templateCache",function(t){return{restrict:"E",terminal:!0,compile:function(n,e){if("text/ng-template"==e.type){var r=e.id,i=n[0].text;t.put(r,i)}}}}],Xa={$setViewValue:p,$render:p},Ja=["$element","$scope",function(n,e){var r=this,i=new Kt;r.ngModelCtrl=Xa,r.unknownOption=Fr(t.document.createElement("option")),r.renderUnknownOption=function(t){var e="? "+Jt(t)+" ?";r.unknownOption.val(e),n.prepend(r.unknownOption),n.val(e)},e.$on("$destroy",function(){r.renderUnknownOption=p}),r.removeUnknownOption=function(){r.unknownOption.parent()&&r.unknownOption.remove()},r.readValue=function(){return r.removeUnknownOption(),n.val()},r.writeValue=function(t){r.hasOption(t)?(r.removeUnknownOption(),n.val(t),""===t&&r.emptyOption.prop("selected",!0)):null==t&&r.emptyOption?(r.removeUnknownOption(),n.val("")):r.renderUnknownOption(t)},r.addOption=function(t,n){if(n[0].nodeType!==si){ft(t,'"option value"'),""===t&&(r.emptyOption=n);var e=i.get(t)||0;i.put(t,e+1),r.ngModelCtrl.$render(),Er(n)}},r.removeOption=function(t){var n=i.get(t);n&&(1===n?(i.remove(t),""===t&&(r.emptyOption=void 0)):i.put(t,n-1))},r.hasOption=function(t){return!!i.get(t)},r.registerOption=function(t,n,e,i,o){if(i){var a;e.$observe("value",function(t){y(a)&&r.removeOption(a),a=t,r.addOption(t,n)})}else o?t.$watch(o,function(t,i){e.$set("value",t),i!==t&&r.removeOption(i),r.addOption(t,n)}):r.addOption(e.value,n);n.on("$destroy",function(){r.removeOption(e.value),r.ngModelCtrl.$render()})}}],Ka=function(){function t(t,n,e,i){var o=i[1];if(o){var a=i[0];if(a.ngModelCtrl=o,n.on("change",function(){t.$apply(function(){o.$setViewValue(a.readValue())})}),e.multiple){a.readValue=function(){var t=[];return r(n.find("option"),function(n){n.selected&&t.push(n.value)}),t},a.writeValue=function(t){var e=new Kt(t);r(n.find("option"),function(t){t.selected=y(e.get(t.value))})};var u,s=NaN;t.$watch(function(){s!==o.$viewValue||q(u,o.$viewValue)||(u=gt(o.$viewValue),o.$render()),s=o.$viewValue}),o.$isEmpty=function(t){return!t||0===t.length}}}}function n(t,n,e,r){var i=r[1];if(i){var o=r[0];i.$render=function(){o.writeValue(i.$viewValue)}}}return{restrict:"E",require:["select","?ngModel"],controller:Ja,priority:1,link:{pre:t,post:n}}},Qa=["$interpolate",function(t){return{restrict:"E",priority:100,compile:function(n,e){if(y(e.value))var r=t(e.value,!0);else{var i=t(n.text(),!0);i||e.$set("value",n.text())}return function(t,n,e){var o="$selectController",a=n.parent(),u=a.data(o)||a.parent().data(o);u&&u.registerOption(t,n,e,r,i)}}}}],tu=v({restrict:"E",terminal:!1}),nu=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){r&&(e.required=!0,r.$validators.required=function(t,n){return!e.required||!r.$isEmpty(n)},e.$observe("required",function(){r.$validate()}))}}},eu=function(){return{restrict:"A",require:"?ngModel",link:function(t,e,r,i){if(i){var o,a=r.ngPattern||r.pattern;r.$observe("pattern",function(t){if(x(t)&&t.length>0&&(t=new RegExp("^"+t+"$")),t&&!t.test)throw n("ngPattern")("noregexp","Expected {0} to be a RegExp but was {1}. Element: {2}",a,t,X(e));o=t||void 0,i.$validate()}),i.$validators.pattern=function(t,n){return i.$isEmpty(n)||m(o)||o.test(n)}}}}},ru=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){if(r){var i=-1;e.$observe("maxlength",function(t){var n=f(t);i=isNaN(n)?-1:n,r.$validate()}),r.$validators.maxlength=function(t,n){return i<0||r.$isEmpty(n)||n.length<=i}}}}},iu=function(){return{restrict:"A",require:"?ngModel",link:function(t,n,e,r){if(r){var i=0;e.$observe("minlength",function(t){i=f(t)||0,r.$validate()}),r.$validators.minlength=function(t,n){return r.$isEmpty(n)||n.length>=i}}}}};return t.angular.bootstrap?void(t.console&&console.log("WARNING: Tried to load angular more than once.")):(st(),$t(Yr),Yr.module("ngLocale",[],["$provide",function(t){function n(t){t+="";var n=t.indexOf(".");return n==-1?0:t.length-n-1}function e(t,e){var r=e;void 0===r&&(r=Math.min(n(t),3));var i=Math.pow(10,r),o=(t*i|0)%i;return{v:r,f:o}}var r={ZERO:"zero",ONE:"one",TWO:"two",FEW:"few",MANY:"many",OTHER:"other"};t.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],SHORTDAY:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SHORTMONTH:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],STANDALONEMONTH:["January","February","March","April","May","June","July","August","September","October","November","December"],WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-¤",negSuf:"",posPre:"¤",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(t,n){var i=0|t,o=e(t,n);return 1==i&&0==o.v?r.ONE:r.OTHER}})}]),void Fr(t.document).ready(function(){rt(t.document,it)}))}(window),!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>'),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(t,n,e){"use strict";function r(t,n){return I(new(I(function(){},{prototype:t})),n)}function i(t){return F(arguments,function(n){n!==t&&F(n,function(n,e){t.hasOwnProperty(e)||(t[e]=n)})}),t}function o(t,n){var e=[];for(var r in t.path){if(t.path[r]!==n.path[r])break;e.push(t.path[r])}return e}function a(t){if(Object.keys)return Object.keys(t);var n=[];return F(t,function(t,e){n.push(e)}),n}function u(t,n){if(Array.prototype.indexOf)return t.indexOf(n,Number(arguments[2])||0);var e=t.length>>>0,r=Number(arguments[2])||0;for(r=r<0?Math.ceil(r):Math.floor(r),r<0&&(r+=e);r<e;r++)if(r in t&&t[r]===n)return r;return-1}function s(t,n,e,r){var i,s=o(e,r),l={},c=[];for(var f in s)if(s[f].params&&(i=a(s[f].params),i.length))for(var h in i)u(c,i[h])>=0||(c.push(i[h]),l[i[h]]=t[i[h]]);return I({},l,n)}function l(t,n,e){if(!e){e=[];for(var r in t)e.push(r)}for(var i=0;i<e.length;i++){var o=e[i];if(t[o]!=n[o])return!1}return!0}function c(t,n){var e={};return F(t,function(t){e[t]=n[t]}),e}function f(t){var n={},e=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return F(e,function(e){e in t&&(n[e]=t[e])}),n}function h(t){var n={},e=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var r in t)u(e,r)==-1&&(n[r]=t[r]);return n}function p(t,n){var e=D(t),r=e?[]:{};return F(t,function(t,i){n(t,i)&&(r[e?r.length:i]=t)}),r}function d(t,n){var e=D(t)?[]:{};return F(t,function(t,r){e[r]=n(t,r)}),e}function v(t,n){var r=1,o=2,s={},l=[],c=s,f=I(t.when(s),{$$promises:s,$$values:s});this.study=function(s){function p(t,e){if(y[e]!==o){if(m.push(e),y[e]===r)throw m.splice(0,u(m,e)),new Error("Cyclic dependency: "+m.join(" -> "));if(y[e]=r,N(t))g.push(e,[function(){return n.get(t)}],l);else{var i=n.annotate(t);F(i,function(t){t!==e&&s.hasOwnProperty(t)&&p(s[t],t)}),g.push(e,t,i)}m.pop(),y[e]=o}}function d(t){return R(t)&&t.then&&t.$$promises}if(!R(s))throw new Error("'invocables' must be an object");var v=a(s||{}),g=[],m=[],y={};return F(s,p),s=m=y=null,function(r,o,a){function u(){--b||(x||i($,o.$$values),m.$$values=$,m.$$promises=m.$$promises||!0,delete m.$$inheritedValues,p.resolve($))}function s(t){m.$$failure=t,p.reject(t)}function l(e,i,o){function l(t){f.reject(t),s(t)}function c(){if(!L(m.$$failure))try{f.resolve(n.invoke(i,a,$)),f.promise.then(function(t){$[e]=t,u()},l)}catch(t){l(t)}}var f=t.defer(),h=0;F(o,function(t){y.hasOwnProperty(t)&&!r.hasOwnProperty(t)&&(h++,y[t].then(function(n){$[t]=n,--h||c()},l))}),h||c(),y[e]=f.promise}if(d(r)&&a===e&&(a=o,o=r,r=null),r){if(!R(r))throw new Error("'locals' must be an object")}else r=c;if(o){if(!d(o))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else o=f;var p=t.defer(),m=p.promise,y=m.$$promises={},$=I({},r),b=1+g.length/3,x=!1;if(L(o.$$failure))return s(o.$$failure),m;o.$$inheritedValues&&i($,h(o.$$inheritedValues,v)),I(y,o.$$promises),o.$$values?(x=i($,h(o.$$values,v)),m.$$inheritedValues=h(o.$$values,v),u()):(o.$$inheritedValues&&(m.$$inheritedValues=h(o.$$inheritedValues,v)),o.then(u,s));for(var w=0,C=g.length;w<C;w+=3)r.hasOwnProperty(g[w])?u():l(g[w],g[w+1],g[w+2]);return m}},this.resolve=function(t,n,e,r){return this.study(t)(n,e,r)}}function g(t,n,e){this.fromConfig=function(t,n,e){return L(t.template)?this.fromString(t.template,n):L(t.templateUrl)?this.fromUrl(t.templateUrl,n):L(t.templateProvider)?this.fromProvider(t.templateProvider,n,e):null},this.fromString=function(t,n){return j(t)?t(n):t},this.fromUrl=function(e,r){return j(e)&&(e=e(r)),null==e?null:t.get(e,{cache:n,headers:{Accept:"text/html"}}).then(function(t){return t.data})},this.fromProvider=function(t,n,r){return e.invoke(t,null,r||{params:n})}}function m(t,n,i){function o(n,e,r,i){if(g.push(n),d[n])return d[n];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(n))throw new Error("Invalid parameter name '"+n+"' in pattern '"+t+"'");if(v[n])throw new Error("Duplicate parameter name '"+n+"' in pattern '"+t+"'");return v[n]=new z.Param(n,e,r,i),v[n]}function a(t,n,e,r){var i=["",""],o=t.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!n)return o;switch(e){case!1:i=["(",")"+(r?"?":"")];break;case!0:i=["?(",")?"];break;default:i=["("+e+"|",")?"]}return o+i[0]+n+i[1]}function u(i,o){var a,u,s,l,c;return a=i[2]||i[3],c=n.params[a],s=t.substring(h,i.index),u=o?i[4]:i[4]||("*"==i[1]?".*":null),l=z.type(u||"string")||r(z.type("string"),{pattern:new RegExp(u,n.caseInsensitive?"i":e)}),{id:a,regexp:u,segment:s,type:l,cfg:c}}n=I({params:{}},R(n)?n:{});var s,l=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,c=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f="^",h=0,p=this.segments=[],d=i?i.params:{},v=this.params=i?i.params.$$new():new z.ParamSet,g=[];this.source=t;for(var m,y,$;(s=l.exec(t))&&(m=u(s,!1),!(m.segment.indexOf("?")>=0));)y=o(m.id,m.type,m.cfg,"path"),f+=a(m.segment,y.type.pattern.source,y.squash,y.isOptional),p.push(m.segment),h=l.lastIndex;$=t.substring(h);var b=$.indexOf("?");if(b>=0){var x=this.sourceSearch=$.substring(b);if($=$.substring(0,b),this.sourcePath=t.substring(0,h+b),x.length>0)for(h=0;s=c.exec(x);)m=u(s,!0),y=o(m.id,m.type,m.cfg,"search"),h=l.lastIndex}else this.sourcePath=t,this.sourceSearch="";f+=a($)+(n.strict===!1?"/?":"")+"$",p.push($),this.regexp=new RegExp(f,n.caseInsensitive?"i":e),this.prefix=p[0],this.$$paramNames=g}function y(t){I(this,t)}function $(){function t(t){return null!=t?t.toString().replace(/\//g,"%2F"):t}function i(t){return null!=t?t.toString().replace(/%2F/g,"/"):t}function o(){return{strict:v,caseInsensitive:h}}function s(t){return j(t)||D(t)&&j(t[t.length-1])}function l(){for(;w.length;){var t=w.shift();if(t.pattern)throw new Error("You cannot override a type's .pattern at runtime.");n.extend(b[t.name],f.invoke(t.def))}}function c(t){I(this,t||{})}z=this;var f,h=!1,v=!0,g=!1,b={},x=!0,w=[],C={string:{encode:t,decode:i,is:function(t){return null==t||!L(t)||"string"==typeof t},pattern:/[^\/]*/},"int":{encode:t,decode:function(t){return parseInt(t,10)},is:function(t){return L(t)&&this.decode(t.toString())===t},pattern:/\d+/},bool:{encode:function(t){return t?1:0},decode:function(t){return 0!==parseInt(t,10)},is:function(t){return t===!0||t===!1},pattern:/0|1/},date:{encode:function(t){return this.is(t)?[t.getFullYear(),("0"+(t.getMonth()+1)).slice(-2),("0"+t.getDate()).slice(-2)].join("-"):e},decode:function(t){if(this.is(t))return t;var n=this.capture.exec(t);return n?new Date(n[1],n[2]-1,n[3]):e},is:function(t){return t instanceof Date&&!isNaN(t.valueOf())},equals:function(t,n){return this.is(t)&&this.is(n)&&t.toISOString()===n.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:n.toJson,decode:n.fromJson,is:n.isObject,equals:n.equals,pattern:/[^\/]*/},any:{encode:n.identity,decode:n.identity,equals:n.equals,pattern:/.*/}};$.$$getDefaultValue=function(t){if(!s(t.value))return t.value;if(!f)throw new Error("Injectable functions cannot be called at configuration time");return f.invoke(t.value)},this.caseInsensitive=function(t){return L(t)&&(h=t),h},this.strictMode=function(t){return L(t)&&(v=t),v},this.defaultSquashPolicy=function(t){if(!L(t))return g;if(t!==!0&&t!==!1&&!N(t))throw new Error("Invalid squash policy: "+t+". Valid policies: false, true, arbitrary-string");return g=t,t},this.compile=function(t,n){return new m(t,I(o(),n))},this.isMatcher=function(t){if(!R(t))return!1;var n=!0;return F(m.prototype,function(e,r){j(e)&&(n=n&&L(t[r])&&j(t[r]))}),n},this.type=function(t,n,e){if(!L(n))return b[t];if(b.hasOwnProperty(t))throw new Error("A type named '"+t+"' has already been defined.");return b[t]=new y(I({name:t},n)),e&&(w.push({name:t,def:e}),x||l()),this},F(C,function(t,n){b[n]=new y(I({name:n},t))}),b=r(b,{}),this.$get=["$injector",function(t){return f=t,x=!1,l(),F(C,function(t,n){b[n]||(b[n]=new y(t))}),this}],this.Param=function(t,n,r,i){function o(t){var n=R(t)?a(t):[],e=u(n,"value")===-1&&u(n,"type")===-1&&u(n,"squash")===-1&&u(n,"array")===-1;return e&&(t={value:t}),t.$$fn=s(t.value)?t.value:function(){return t.value},t}function l(n,e,r){if(n.type&&e)throw new Error("Param '"+t+"' has two type configurations.");return e?e:n.type?n.type instanceof y?n.type:new y(n.type):"config"===r?b.any:b.string}function c(){var n={array:"search"===i&&"auto"},e=t.match(/\[\]$/)?{array:!0}:{};return I(n,e,r).array}function h(t,n){var e=t.squash;if(!n||e===!1)return!1;if(!L(e)||null==e)return g;if(e===!0||N(e))return e;throw new Error("Invalid squash policy: '"+e+"'. Valid policies: false, true, or arbitrary string")}function v(t,n,r,i){var o,a,s=[{from:"",to:r||n?e:""},{from:null,to:r||n?e:""}];return o=D(t.replace)?t.replace:[],N(i)&&o.push({from:i,to:e}),a=d(o,function(t){return t.from}),p(s,function(t){return u(a,t.from)===-1}).concat(o)}function m(){if(!f)throw new Error("Injectable functions cannot be called at configuration time");var t=f.invoke(r.$$fn);if(null!==t&&t!==e&&!w.type.is(t))throw new Error("Default value ("+t+") for parameter '"+w.id+"' is not an instance of Type ("+w.type.name+")");return t}function $(t){function n(t){return function(n){return n.from===t}}function e(t){var e=d(p(w.replace,n(t)),function(t){return t.to});return e.length?e[0]:t}return t=e(t),L(t)?w.type.$normalize(t):m()}function x(){return"{Param:"+t+" "+n+" squash: '"+_+"' optional: "+S+"}"}var w=this;r=o(r),n=l(r,n,i);var C=c();n=C?n.$asArray(C,"search"===i):n,"string"!==n.name||C||"path"!==i||r.value!==e||(r.value="");var S=r.value!==e,_=h(r,S),M=v(r,C,S,_);I(this,{id:t,type:n,location:i,array:C,squash:_,replace:M,isOptional:S,value:$,dynamic:e,config:r,toString:x})},c.prototype={$$new:function(){return r(this,I(new c,{$$parent:this}))},$$keys:function(){for(var t=[],n=[],e=this,r=a(c.prototype);e;)n.push(e),e=e.$$parent;return n.reverse(),F(n,function(n){F(a(n),function(n){u(t,n)===-1&&u(r,n)===-1&&t.push(n)})}),t},$$values:function(t){var n={},e=this;return F(e.$$keys(),function(r){n[r]=e[r].value(t&&t[r])}),n},$$equals:function(t,n){var e=!0,r=this;return F(r.$$keys(),function(i){var o=t&&t[i],a=n&&n[i];r[i].type.equals(o,a)||(e=!1)}),e},$$validates:function(t){var r,i,o,a,u,s=this.$$keys();for(r=0;r<s.length&&(i=this[s[r]],o=t[s[r]],o!==e&&null!==o||!i.isOptional);r++){if(a=i.type.$normalize(o),!i.type.is(a))return!1;if(u=i.type.encode(a),n.isString(u)&&!i.type.pattern.exec(u))return!1}return!0},$$parent:e},this.ParamSet=c}function b(t,r){function i(t){var n=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(t.source);return null!=n?n[1].replace(/\\(.)/g,"$1"):""}function o(t,n){return t.replace(/\$(\$|\d{1,2})/,function(t,e){return n["$"===e?0:Number(e)]})}function a(t,n,e){if(!e)return!1;var r=t.invoke(n,n,{$match:e});return!L(r)||r}function u(r,i,o,a){function u(t,n,e){return"/"===v?t:n?v.slice(0,-1)+t:e?v.slice(1)+t:t}function h(t){function n(t){var n=t(o,r);return!!n&&(N(n)&&r.replace().url(n),!0)}if(!t||!t.defaultPrevented){d&&r.url()===d;d=e;var i,a=l.length;for(i=0;i<a;i++)if(n(l[i]))return;c&&n(c)}}function p(){return s=s||i.$on("$locationChangeSuccess",h)}var d,v=a.baseHref(),g=r.url();return f||p(),{sync:function(){h()},listen:function(){return p()},update:function(t){return t?void(g=r.url()):void(r.url()!==g&&(r.url(g),r.replace()))},push:function(t,n,i){var o=t.format(n||{});null!==o&&n&&n["#"]&&(o+="#"+n["#"]),r.url(o),d=i&&i.$$avoidResync?r.url():e,i&&i.replace&&r.replace()},href:function(e,i,o){if(!e.validates(i))return null;var a=t.html5Mode();n.isObject(a)&&(a=a.enabled);var s=e.format(i);if(o=o||{},a||null===s||(s="#"+t.hashPrefix()+s),null!==s&&i&&i["#"]&&(s+="#"+i["#"]),s=u(s,a,o.absolute),!o.absolute||!s)return s;var l=!a&&s?"/":"",c=r.port();return c=80===c||443===c?"":":"+c,[r.protocol(),"://",r.host(),c,l,s].join("")}}}var s,l=[],c=null,f=!1;this.rule=function(t){if(!j(t))throw new Error("'rule' must be a function");return l.push(t),this},this.otherwise=function(t){if(N(t)){var n=t;t=function(){return n}}else if(!j(t))throw new Error("'rule' must be a function");return c=t,this},this.when=function(t,n){var e,u=N(n);if(N(t)&&(t=r.compile(t)),!u&&!j(n)&&!D(n))throw new Error("invalid 'handler' in when()");var s={matcher:function(t,n){return u&&(e=r.compile(n),n=["$match",function(t){return e.format(t)}]),I(function(e,r){return a(e,n,t.exec(r.path(),r.search()))},{prefix:N(t.prefix)?t.prefix:""})},regex:function(t,n){if(t.global||t.sticky)throw new Error("when() RegExp must not be global or sticky");return u&&(e=n,n=["$match",function(t){return o(e,t)}]),I(function(e,r){return a(e,n,t.exec(r.path()))},{prefix:i(t)})}},l={matcher:r.isMatcher(t),regex:t instanceof RegExp};for(var c in l)if(l[c])return this.rule(s[c](t,n));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(t){t===e&&(t=!0),f=t},this.$get=u,u.$inject=["$location","$rootScope","$injector","$browser"]}function x(t,i){function o(t){return 0===t.indexOf(".")||0===t.indexOf("^")}function h(t,n){if(!t)return e;var r=N(t),i=r?t:t.name,a=o(i);if(a){if(!n)throw new Error("No reference point given for path '"+i+"'");n=h(n);for(var u=i.split("."),s=0,l=u.length,c=n;s<l;s++)if(""!==u[s]||0!==s){if("^"!==u[s])break;if(!c.parent)throw new Error("Path '"+i+"' not valid for state '"+n.name+"'");c=c.parent}else c=n;u=u.slice(s).join("."),i=c.name+(c.name&&u?".":"")+u}var f=_[i];return!f||!r&&(r||f!==t&&f.self!==t)?e:f}function p(t,n){M[t]||(M[t]=[]),M[t].push(n)}function v(t){for(var n=M[t]||[];n.length;)g(n.shift())}function g(n){n=r(n,{self:n,resolve:n.resolve||{},toString:function(){return this.name}});var e=n.name;if(!N(e)||e.indexOf("@")>=0)throw new Error("State must have a valid name");if(_.hasOwnProperty(e))throw new Error("State '"+e+"'' is already defined");var i=e.indexOf(".")!==-1?e.substring(0,e.lastIndexOf(".")):N(n.parent)?n.parent:R(n.parent)&&N(n.parent.name)?n.parent.name:"";if(i&&!_[i])return p(i,n.self);for(var o in A)j(A[o])&&(n[o]=A[o](n,A.$delegates[o]));return _[e]=n,!n[k]&&n.url&&t.when(n.url,["$match","$stateParams",function(t,e){S.$current.navigable==n&&l(t,e)||S.transitionTo(n,t,{inherit:!0,location:!1})}]),v(e),n}function m(t){return t.indexOf("*")>-1}function y(t){for(var n=t.split("."),e=S.$current.name.split("."),r=0,i=n.length;r<i;r++)"*"===n[r]&&(e[r]="*");return"**"===n[0]&&(e=e.slice(u(e,n[1])),e.unshift("**")),"**"===n[n.length-1]&&(e.splice(u(e,n[n.length-2])+1,Number.MAX_VALUE),e.push("**")),n.length==e.length&&e.join("")===n.join("")}function $(t,n){return N(t)&&!L(n)?A[t]:j(n)&&N(t)?(A[t]&&!A.$delegates[t]&&(A.$delegates[t]=A[t]),A[t]=n,this):this}function b(t,n){return R(t)?n=t:n.name=t,g(n),this}function x(t,i,o,u,f,p,v,g,$){function b(n,e,r,o){var a=t.$broadcast("$stateNotFound",n,e,r);if(a.defaultPrevented)return v.update(),E;if(!a.retry)return null;if(o.$retry)return v.update(),P;var u=S.transition=i.when(a.retry);return u.then(function(){return u!==S.transition?M:(n.options.$retry=!0,S.transitionTo(n.to,n.toParams,n.options))},function(){return E}),v.update(),u}function x(t,e,r,a,s,l){function h(){var e=[];return F(t.views,function(r,i){var a=r.resolve&&r.resolve!==t.resolve?r.resolve:{};a.$template=[function(){return o.load(i,{view:r,locals:s.globals,params:p,notify:l.notify})||""}],e.push(f.resolve(a,s.globals,s.resolve,t).then(function(e){if(j(r.controllerProvider)||D(r.controllerProvider)){var o=n.extend({},a,s.globals);e.$$controller=u.invoke(r.controllerProvider,null,o)}else e.$$controller=r.controller;e.$$state=t,e.$$controllerAs=r.controllerAs,s[i]=e}))}),i.all(e).then(function(){return s.globals})}var p=r?e:c(t.params.$$keys(),e),d={$stateParams:p};s.resolve=f.resolve(t.resolve,d,s.resolve,t);var v=[s.resolve.then(function(t){s.globals=t})];return a&&v.push(a),i.all(v).then(h).then(function(t){return s})}var M=i.reject(new Error("transition superseded")),A=i.reject(new Error("transition prevented")),E=i.reject(new Error("transition aborted")),P=i.reject(new Error("transition failed"));return C.locals={resolve:null,globals:{$stateParams:{}}},S={params:{},current:C.self,$current:C,transition:null},S.reload=function(t){return S.transitionTo(S.current,p,{reload:t||!0,inherit:!1,notify:!0})},S.go=function(t,n,e){return S.transitionTo(t,n,I({inherit:!0,relative:S.$current},e))},S.transitionTo=function(n,e,o){e=e||{},o=I({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},o||{});var a,l=S.$current,f=S.params,d=l.path,g=h(n,o.relative),m=e["#"];if(!L(g)){var y={to:n,toParams:e,options:o},$=b(y,l.self,f,o);if($)return $;if(n=y.to,e=y.toParams,o=y.options,g=h(n,o.relative),!L(g)){if(!o.relative)throw new Error("No such state '"+n+"'");throw new Error("Could not resolve '"+n+"' from state '"+o.relative+"'")}}if(g[k])throw new Error("Cannot transition to abstract state '"+n+"'");if(o.inherit&&(e=s(p,e||{},S.$current,g)),!g.params.$$validates(e))return P;e=g.params.$$values(e),n=g;var _=n.path,E=0,O=_[E],T=C.locals,j=[];if(o.reload){if(N(o.reload)||R(o.reload)){if(R(o.reload)&&!o.reload.name)throw new Error("Invalid reload state object");var D=o.reload===!0?d[0]:h(o.reload);if(o.reload&&!D)throw new Error("No such reload state '"+(N(o.reload)?o.reload:o.reload.name)+"'");for(;O&&O===d[E]&&O!==D;)T=j[E]=O.locals,E++,O=_[E]}}else for(;O&&O===d[E]&&O.ownParams.$$equals(e,f);)T=j[E]=O.locals,E++,O=_[E];if(w(n,e,l,f,T,o))return m&&(e["#"]=m),S.params=e,q(S.params,p),o.location&&n.navigable&&n.navigable.url&&(v.push(n.navigable.url,e,{$$avoidResync:!0,replace:"replace"===o.location}),v.update(!0)),S.transition=null,i.when(S.current);if(e=c(n.params.$$keys(),e||{}),o.notify&&t.$broadcast("$stateChangeStart",n.self,e,l.self,f).defaultPrevented)return t.$broadcast("$stateChangeCancel",n.self,e,l.self,f),v.update(),A;for(var F=i.when(T),z=E;z<_.length;z++,O=_[z])T=j[z]=r(T),F=x(O,e,O===n,F,T,o);var V=S.transition=F.then(function(){var r,i,a;if(S.transition!==V)return M;for(r=d.length-1;r>=E;r--)a=d[r],a.self.onExit&&u.invoke(a.self.onExit,a.self,a.locals.globals),a.locals=null;for(r=E;r<_.length;r++)i=_[r],i.locals=j[r],i.self.onEnter&&u.invoke(i.self.onEnter,i.self,i.locals.globals);return m&&(e["#"]=m),S.transition!==V?M:(S.$current=n,S.current=n.self,S.params=e,q(S.params,p),S.transition=null,o.location&&n.navigable&&v.push(n.navigable.url,n.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:"replace"===o.location}),o.notify&&t.$broadcast("$stateChangeSuccess",n.self,e,l.self,f),v.update(!0),S.current)},function(r){return S.transition!==V?M:(S.transition=null,a=t.$broadcast("$stateChangeError",n.self,e,l.self,f,r),a.defaultPrevented||v.update(),i.reject(r))});return V},S.is=function(t,n,r){r=I({relative:S.$current},r||{});var i=h(t,r.relative);return L(i)?S.$current===i&&(!n||l(i.params.$$values(n),p)):e},S.includes=function(t,n,r){if(r=I({relative:S.$current},r||{}),N(t)&&m(t)){if(!y(t))return!1;t=S.$current.name}var i=h(t,r.relative);return L(i)?!!L(S.$current.includes[i.name])&&(!n||l(i.params.$$values(n),p,a(n))):e},S.href=function(t,n,r){r=I({lossy:!0,inherit:!0,absolute:!1,relative:S.$current},r||{});var i=h(t,r.relative);if(!L(i))return null;r.inherit&&(n=s(p,n||{},S.$current,i));var o=i&&r.lossy?i.navigable:i;return o&&o.url!==e&&null!==o.url?v.href(o.url,c(i.params.$$keys().concat("#"),n||{}),{absolute:r.absolute}):null},S.get=function(t,n){if(0===arguments.length)return d(a(_),function(t){return _[t].self});var e=h(t,n||S.$current);return e&&e.self?e.self:null},S}function w(t,n,e,r,i,o){function a(t,n,e){function r(n){return"search"!=t.params[n].location}var i=t.params.$$keys().filter(r),o=f.apply({},[t.params].concat(i)),a=new z.ParamSet(o);return a.$$equals(n,e)}if(!o.reload&&t===e&&(i===e.locals||t.self.reloadOnSearch===!1&&a(e,r,n)))return!0}var C,S,_={},M={},k="abstract",A={parent:function(t){if(L(t.parent)&&t.parent)return h(t.parent);var n=/^(.+)\.[^.]+$/.exec(t.name);return n?h(n[1]):C},data:function(t){return t.parent&&t.parent.data&&(t.data=t.self.data=I({},t.parent.data,t.data)),t.data},url:function(t){var n=t.url,e={params:t.params||{}};if(N(n))return"^"==n.charAt(0)?i.compile(n.substring(1),e):(t.parent.navigable||C).url.concat(n,e);if(!n||i.isMatcher(n))return n;throw new Error("Invalid url '"+n+"' in state '"+t+"'")},navigable:function(t){return t.url?t:t.parent?t.parent.navigable:null},ownParams:function(t){var n=t.url&&t.url.params||new z.ParamSet;return F(t.params||{},function(t,e){n[e]||(n[e]=new z.Param(e,null,t,"config"))}),n},params:function(t){return t.parent&&t.parent.params?I(t.parent.params.$$new(),t.ownParams):new z.ParamSet},views:function(t){var n={};return F(L(t.views)?t.views:{"":t},function(e,r){r.indexOf("@")<0&&(r+="@"+t.parent.name),n[r]=e}),n},path:function(t){return t.parent?t.parent.path.concat(t):[]},includes:function(t){var n=t.parent?I({},t.parent.includes):{};return n[t.name]=!0,n},$delegates:{}};C=g({name:"",url:"^",views:null,"abstract":!0}),C.navigable=null,this.decorator=$,this.state=b,this.$get=x,x.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$urlRouter","$location","$urlMatcherFactory"]}function w(){function t(t,n){return{load:function(e,r){var i,o={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return r=I(o,r),r.view&&(i=n.fromConfig(r.view,r.params,r.locals)),i&&r.notify&&t.$broadcast("$viewContentLoading",r),i}}}this.$get=t,t.$inject=["$rootScope","$templateFactory"]}function C(){var t=!1;this.useAnchorScroll=function(){t=!0},this.$get=["$anchorScroll","$timeout",function(n,e){return t?n:function(t){return e(function(){t[0].scrollIntoView()},0,!1)}}]}function S(t,e,r,i){function o(){return e.has?function(t){return e.has(t)?e.get(t):null}:function(t){try{return e.get(t)}catch(n){return null}}}function a(t,n){var e=function(){return{enter:function(t,n,e){n.after(t),e()},leave:function(t,n){t.remove(),n()}}};if(l)return{enter:function(t,n,e){var r=l.enter(t,null,n,e);r&&r.then&&r.then(e)},leave:function(t,n){var e=l.leave(t,n);e&&e.then&&e.then(n)}};if(s){var r=s&&s(n,t);return{enter:function(t,n,e){r.enter(t,null,n),e()},leave:function(t,n){r.leave(t),n()}}}return e()}var u=o(),s=u("$animator"),l=u("$animate"),c={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(e,o,u){return function(e,o,s){function l(){f&&(f.remove(),f=null),p&&(p.$destroy(),p=null),h&&(m.leave(h,function(){f=null}),f=h,h=null)}function c(a){var c,f=M(e,s,o,i),y=f&&t.$current&&t.$current.locals[f];if(a||y!==d){c=e.$new(),d=t.$current.locals[f];var $=u(c,function(t){m.enter(t,o,function(){p&&p.$emit("$viewContentAnimationEnded"),(n.isDefined(g)&&!g||e.$eval(g))&&r(t)}),l()});h=$,p=c,p.$emit("$viewContentLoaded"),p.$eval(v)}}var f,h,p,d,v=s.onload||"",g=s.autoscroll,m=a(s,e);e.$on("$stateChangeSuccess",function(){c(!1)}),e.$on("$viewContentLoading",function(){c(!1)}),c(!0)}}};return c}function _(t,n,e,r){return{restrict:"ECA",priority:-400,compile:function(i){var o=i.html();return function(i,a,u){var s=e.$current,l=M(i,u,a,r),c=s&&s.locals[l];if(c){a.data("$uiView",{name:l,state:c.$$state}),a.html(c.$template?c.$template:o);var f=t(a.contents());if(c.$$controller){c.$scope=i,c.$element=a;
+var h=n(c.$$controller,c);c.$$controllerAs&&(i[c.$$controllerAs]=h),a.data("$ngControllerController",h),a.children().data("$ngControllerController",h)}f(i)}}}}}function M(t,n,e,r){var i=r(n.uiView||n.name||"")(t),o=e.inheritedData("$uiView");return i.indexOf("@")>=0?i:i+"@"+(o?o.state.name:"")}function k(t,n){var e,r=t.match(/^\s*({[^}]*})\s*$/);if(r&&(t=n+"("+r[1]+")"),e=t.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!e||4!==e.length)throw new Error("Invalid state ref '"+t+"'");return{state:e[1],paramExpr:e[3]||null}}function A(t){var n=t.parent().inheritedData("$uiView");if(n&&n.state&&n.state.name)return n.state}function E(t,e){var r=["location","inherit","reload","absolute"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(i,o,a,u){var s=k(a.uiSref,t.current.name),l=null,c=A(o)||t.$current,f="[object SVGAnimatedString]"===Object.prototype.toString.call(o.prop("href"))?"xlink:href":"href",h=null,p="A"===o.prop("tagName").toUpperCase(),d="FORM"===o[0].nodeName,v=d?"action":f,g=!0,m={relative:c,inherit:!0},y=i.$eval(a.uiSrefOpts)||{};n.forEach(r,function(t){t in y&&(m[t]=y[t])});var $=function(e){if(e&&(l=n.copy(e)),g){h=t.href(s.state,l,m);var r=u[1]||u[0];return r&&r.$$addStateInfo(s.state,l),null===h?(g=!1,!1):void a.$set(v,h)}};s.paramExpr&&(i.$watch(s.paramExpr,function(t,n){t!==l&&$(t)},!0),l=n.copy(i.$eval(s.paramExpr))),$(),d||o.bind("click",function(n){var r=n.which||n.button;if(!(r>1||n.ctrlKey||n.metaKey||n.shiftKey||o.attr("target"))){var i=e(function(){t.go(s.state,l,m)});n.preventDefault();var a=p&&!h?1:0;n.preventDefault=function(){a--<=0&&e.cancel(i)}}})}}}function P(t,n,e){return{restrict:"A",controller:["$scope","$element","$attrs",function(n,r,i){function o(){a()?r.addClass(s):r.removeClass(s)}function a(){for(var t=0;t<l.length;t++)if(u(l[t].state,l[t].params))return!0;return!1}function u(n,e){return"undefined"!=typeof i.uiSrefActiveEq?t.is(n.name,e):t.includes(n.name,e)}var s,l=[];s=e(i.uiSrefActiveEq||i.uiSrefActive||"",!1)(n),this.$$addStateInfo=function(n,e){var i=t.get(n,A(r));l.push({state:i||{name:n},params:e}),o()},n.$on("$stateChangeSuccess",o)}]}}function O(t){var n=function(n){return t.is(n)};return n.$stateful=!0,n}function T(t){var n=function(n){return t.includes(n)};return n.$stateful=!0,n}var L=n.isDefined,j=n.isFunction,N=n.isString,R=n.isObject,D=n.isArray,F=n.forEach,I=n.extend,q=n.copy;n.module("ui.router.util",["ng"]),n.module("ui.router.router",["ui.router.util"]),n.module("ui.router.state",["ui.router.router","ui.router.util"]),n.module("ui.router",["ui.router.state"]),n.module("ui.router.compat",["ui.router"]),v.$inject=["$q","$injector"],n.module("ui.router.util").service("$resolve",v),g.$inject=["$http","$templateCache","$injector"],n.module("ui.router.util").service("$templateFactory",g);var z;m.prototype.concat=function(t,n){var e={caseInsensitive:z.caseInsensitive(),strict:z.strictMode(),squash:z.defaultSquashPolicy()};return new m(this.sourcePath+t+this.sourceSearch,I(e,n),this)},m.prototype.toString=function(){return this.source},m.prototype.exec=function(t,n){function e(t){function n(t){return t.split("").reverse().join("")}function e(t){return t.replace(/\\-/g,"-")}var r=n(t).split(/-(?!\\)/),i=d(r,n);return d(i,e).reverse()}var r=this.regexp.exec(t);if(!r)return null;n=n||{};var i,o,a,u=this.parameters(),s=u.length,l=this.segments.length-1,c={};if(l!==r.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(i=0;i<l;i++){a=u[i];var f=this.params[a],h=r[i+1];for(o=0;o<f.replace;o++)f.replace[o].from===h&&(h=f.replace[o].to);h&&f.array===!0&&(h=e(h)),c[a]=f.value(h)}for(;i<s;i++)a=u[i],c[a]=this.params[a].value(n[a]);return c},m.prototype.parameters=function(t){return L(t)?this.params[t]||null:this.$$paramNames},m.prototype.validates=function(t){return this.params.$$validates(t)},m.prototype.format=function(t){function n(t){return encodeURIComponent(t).replace(/-/g,function(t){return"%5C%"+t.charCodeAt(0).toString(16).toUpperCase()})}t=t||{};var e=this.segments,r=this.parameters(),i=this.params;if(!this.validates(t))return null;var o,a=!1,u=e.length-1,s=r.length,l=e[0];for(o=0;o<s;o++){var c=o<u,f=r[o],h=i[f],p=h.value(t[f]),v=h.isOptional&&h.type.equals(h.value(),p),g=!!v&&h.squash,m=h.type.encode(p);if(c){var y=e[o+1];if(g===!1)null!=m&&(l+=D(m)?d(m,n).join("-"):encodeURIComponent(m)),l+=y;else if(g===!0){var $=l.match(/\/$/)?/\/?(.*)/:/(.*)/;l+=y.match($)[1]}else N(g)&&(l+=g+y)}else{if(null==m||v&&g!==!1)continue;D(m)||(m=[m]),m=d(m,encodeURIComponent).join("&"+f+"="),l+=(a?"&":"?")+(f+"="+m),a=!0}}return l},y.prototype.is=function(t,n){return!0},y.prototype.encode=function(t,n){return t},y.prototype.decode=function(t,n){return t},y.prototype.equals=function(t,n){return t==n},y.prototype.$subPattern=function(){var t=this.pattern.toString();return t.substr(1,t.length-2)},y.prototype.pattern=/.*/,y.prototype.toString=function(){return"{Type:"+this.name+"}"},y.prototype.$normalize=function(t){return this.is(t)?t:this.decode(t)},y.prototype.$asArray=function(t,n){function r(t,n){function r(t,n){return function(){return t[n].apply(t,arguments)}}function i(t){return D(t)?t:L(t)?[t]:[]}function o(t){switch(t.length){case 0:return e;case 1:return"auto"===n?t[0]:t;default:return t}}function a(t){return!t}function u(t,n){return function(e){e=i(e);var r=d(e,t);return n===!0?0===p(r,a).length:o(r)}}function s(t){return function(n,e){var r=i(n),o=i(e);if(r.length!==o.length)return!1;for(var a=0;a<r.length;a++)if(!t(r[a],o[a]))return!1;return!0}}this.encode=u(r(t,"encode")),this.decode=u(r(t,"decode")),this.is=u(r(t,"is"),!0),this.equals=s(r(t,"equals")),this.pattern=t.pattern,this.$normalize=u(r(t,"$normalize")),this.name=t.name,this.$arrayMode=n}if(!t)return this;if("auto"===t&&!n)throw new Error("'auto' array mode is for query parameters only");return new r(this,t)},n.module("ui.router.util").provider("$urlMatcherFactory",$),n.module("ui.router.util").run(["$urlMatcherFactory",function(t){}]),b.$inject=["$locationProvider","$urlMatcherFactoryProvider"],n.module("ui.router.router").provider("$urlRouter",b),x.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider"],n.module("ui.router.state").value("$stateParams",{}).provider("$state",x),w.$inject=[],n.module("ui.router.state").provider("$view",w),n.module("ui.router.state").provider("$uiViewScroll",C),S.$inject=["$state","$injector","$uiViewScroll","$interpolate"],_.$inject=["$compile","$controller","$state","$interpolate"],n.module("ui.router.state").directive("uiView",S),n.module("ui.router.state").directive("uiView",_),E.$inject=["$state","$timeout"],P.$inject=["$state","$stateParams","$interpolate"],n.module("ui.router.state").directive("uiSref",E).directive("uiSrefActive",P).directive("uiSrefActiveEq",P),O.$inject=["$state"],T.$inject=["$state"],n.module("ui.router.state").filter("isState",O).filter("includedByState",T)}(window,window.angular),function(t,n){"use strict";function e(t){return null!=t&&""!==t&&"hasOwnProperty"!==t&&a.test("."+t)}function r(t,r){if(!e(r))throw o("badmember",'Dotted member path "@{0}" is invalid.',r);for(var i=r.split("."),a=0,u=i.length;a<u&&n.isDefined(t);a++){var s=i[a];t=null!==t?t[s]:void 0}return t}function i(t,e){e=e||{},n.forEach(e,function(t,n){delete e[n]});for(var r in t)!t.hasOwnProperty(r)||"$"===r.charAt(0)&&"$"===r.charAt(1)||(e[r]=t[r]);return e}var o=n.$$minErr("$resource"),a=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;n.module("ngResource",["ng"]).provider("$resource",function(){var t=/^https?:\/\/[^\/]*/,e=this;this.defaults={stripTrailingSlashes:!0,cancellable:!1,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}},this.$get=["$http","$log","$q","$timeout",function(a,u,s,l){function c(t){return f(t,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function f(t,n){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,n?"%20":"+")}function h(t,n){this.template=t,this.defaults=g({},e.defaults,n),this.urlParams={}}function p(t,c,f,$){function b(t,n){var e={};return n=g({},c,n),v(n,function(n,i){y(n)&&(n=n(t)),e[i]=n&&n.charAt&&"@"==n.charAt(0)?r(t,n.substr(1)):n}),e}function x(t){return t.resource}function w(t){i(t||{},this)}var C=new h(t,$);return f=g({},e.defaults.actions,f),w.prototype.toJSON=function(){var t=g({},this);return delete t.$promise,delete t.$resolved,t},v(f,function(t,r){var c=/^(POST|PUT|PATCH)$/i.test(t.method),f=t.timeout,h=n.isDefined(t.cancellable)?t.cancellable:$&&n.isDefined($.cancellable)?$.cancellable:e.defaults.cancellable;f&&!n.isNumber(f)&&(u.debug("ngResource:\n  Only numeric values are allowed as `timeout`.\n  Promises are not supported in $resource, because the same value would be used for multiple requests. If you are looking for a way to cancel requests, you should use the `cancellable` option."),delete t.timeout,f=null),w[r]=function(e,u,p,$){var S,_,M,k={};switch(arguments.length){case 4:M=$,_=p;case 3:case 2:if(!y(u)){k=e,S=u,_=p;break}if(y(e)){_=e,M=u;break}_=u,M=p;case 1:y(e)?_=e:c?S=e:k=e;break;case 0:break;default:throw o("badargs","Expected up to 4 arguments [params, data, success, error], got {0} arguments",arguments.length)}var A,E,P=this instanceof w,O=P?S:t.isArray?[]:new w(S),T={},L=t.interceptor&&t.interceptor.response||x,j=t.interceptor&&t.interceptor.responseError||void 0;v(t,function(t,n){switch(n){default:T[n]=m(t);break;case"params":case"isArray":case"interceptor":case"cancellable":}}),!P&&h&&(A=s.defer(),T.timeout=A.promise,f&&(E=l(A.resolve,f))),c&&(T.data=S),C.setUrlParams(T,g({},b(S,t.params||{}),k),t.url);var N=a(T).then(function(e){var a=e.data;if(a){if(n.isArray(a)!==!!t.isArray)throw o("badcfg","Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})",r,t.isArray?"array":"object",n.isArray(a)?"array":"object",T.method,T.url);if(t.isArray)O.length=0,v(a,function(t){"object"==typeof t?O.push(new w(t)):O.push(t)});else{var u=O.$promise;i(a,O),O.$promise=u}}return e.resource=O,e},function(t){return(M||d)(t),s.reject(t)});return N["finally"](function(){O.$resolved=!0,!P&&h&&(O.$cancelRequest=n.noop,l.cancel(E),A=E=T.timeout=null)}),N=N.then(function(t){var n=L(t);return(_||d)(n,t.headers),n},j),P?N:(O.$promise=N,O.$resolved=!1,h&&(O.$cancelRequest=A.resolve),O)},w.prototype["$"+r]=function(t,n,e){y(t)&&(e=n,n=t,t={});var i=w[r].call(this,t,this,n,e);return i.$promise||i}}),w.bind=function(n){return p(t,g({},c,n),f)},w}var d=n.noop,v=n.forEach,g=n.extend,m=n.copy,y=n.isFunction;return h.prototype={setUrlParams:function(e,r,i){var a,u,s=this,l=i||s.template,h="",p=s.urlParams={};v(l.split(/\W/),function(t){if("hasOwnProperty"===t)throw o("badname","hasOwnProperty is not a valid parameter name.");!new RegExp("^\\d+$").test(t)&&t&&new RegExp("(^|[^\\\\]):"+t+"(\\W|$)").test(l)&&(p[t]={isQueryParamValue:new RegExp("\\?.*=:"+t+"(?:\\W|$)").test(l)})}),l=l.replace(/\\:/g,":"),l=l.replace(t,function(t){return h=t,""}),r=r||{},v(s.urlParams,function(t,e){a=r.hasOwnProperty(e)?r[e]:s.defaults[e],n.isDefined(a)&&null!==a?(u=t.isQueryParamValue?f(a,!0):c(a),l=l.replace(new RegExp(":"+e+"(\\W|$)","g"),function(t,n){return u+n})):l=l.replace(new RegExp("(/?):"+e+"(\\W|$)","g"),function(t,n,e){return"/"==e.charAt(0)?e:n+e})}),s.defaults.stripTrailingSlashes&&(l=l.replace(/\/+$/,"")||"/"),l=l.replace(/\/\.(?=\w+($|\?))/,"."),e.url=h+l.replace(/\/\\\./,"/."),v(r,function(t,n){s.urlParams[n]||(e.params=e.params||{},e.params[n]=t)})}},p}]})}(window,window.angular),function(t,n){"use strict";function e(t,e,r){function i(t,r,i){var a,u;i=i||{},u=i.expires,a=n.isDefined(i.path)?i.path:o,n.isUndefined(r)&&(u="Thu, 01 Jan 1970 00:00:00 GMT",r=""),n.isString(u)&&(u=new Date(u));var s=encodeURIComponent(t)+"="+encodeURIComponent(r);s+=a?";path="+a:"",s+=i.domain?";domain="+i.domain:"",s+=u?";expires="+u.toUTCString():"",s+=i.secure?";secure":"";var l=s.length+1;return l>4096&&e.warn("Cookie '"+t+"' possibly not set or overflowed because it was too large ("+l+" > 4096 bytes)!"),s}var o=r.baseHref(),a=t[0];return function(t,n,e){a.cookie=i(t,n,e)}}n.module("ngCookies",["ng"]).provider("$cookies",[function(){function t(t){return t?n.extend({},e,t):e}var e=this.defaults={};this.$get=["$$cookieReader","$$cookieWriter",function(e,r){return{get:function(t){return e()[t]},getObject:function(t){var e=this.get(t);return e?n.fromJson(e):e},getAll:function(){return e()},put:function(n,e,i){r(n,e,t(i))},putObject:function(t,e,r){this.put(t,n.toJson(e),r)},remove:function(n,e){r(n,void 0,t(e))}}}]}]),n.module("ngCookies").factory("$cookieStore",["$cookies",function(t){return{get:function(n){return t.getObject(n)},put:function(n,e){t.putObject(n,e)},remove:function(n){t.remove(n)}}}]),e.$inject=["$document","$log","$browser"],n.module("ngCookies").provider("$$cookieWriter",function(){this.$get=e})}(window,window.angular),function(t,n){"use strict";function e(t,n,e){if(!t)throw vt("areq","Argument '{0}' is {1}",n||"?",e||"required");return t}function r(t,n){return t||n?t?n?(Z(t)&&(t=t.join(" ")),Z(n)&&(n=n.join(" ")),t+" "+n):t:n:""}function i(t){var n={};return t&&(t.to||t.from)&&(n.to=t.to,n.from=t.from),n}function o(t,n,e){var r="";return t=Z(t)?t:t&&tt(t)&&t.length?t.split(/\s+/):[],G(t,function(t,i){t&&t.length>0&&(r+=i>0?" ":"",r+=e?n+t:t+n)}),r}function a(t,n){var e=t.indexOf(n);n>=0&&t.splice(e,1)}function u(t){if(t instanceof et)switch(t.length){case 0:return t;case 1:if(t[0].nodeType===D)return t;break;default:return et(s(t))}if(t.nodeType===D)return et(t)}function s(t){if(!t[0])return t;for(var n=0;n<t.length;n++){var e=t[n];if(e.nodeType==D)return e}}function l(t,n,e){G(n,function(n){t.addClass(n,e)})}function c(t,n,e){G(n,function(n){t.removeClass(n,e)})}function f(t){return function(n,e){e.addClass&&(l(t,n,e.addClass),e.addClass=null),e.removeClass&&(c(t,n,e.removeClass),e.removeClass=null)}}function h(t){if(t=t||{},!t.$$prepared){var n=t.domOperation||rt;t.domOperation=function(){t.$$domOperationFired=!0,n(),n=rt},t.$$prepared=!0}return t}function p(t,n){d(t,n),v(t,n)}function d(t,n){n.from&&(t.css(n.from),n.from=null)}function v(t,n){n.to&&(t.css(n.to),n.to=null)}function g(t,n,e){var r=n.options||{},i=e.options||{},o=(r.addClass||"")+" "+(i.addClass||""),a=(r.removeClass||"")+" "+(i.removeClass||""),u=m(t.attr("class"),o,a);i.preparationClasses&&(r.preparationClasses=S(i.preparationClasses,r.preparationClasses),delete i.preparationClasses);var s=r.domOperation!==rt?r.domOperation:null;return Y(r,i),s&&(r.domOperation=s),u.addClass?r.addClass=u.addClass:r.addClass=null,u.removeClass?r.removeClass=u.removeClass:r.removeClass=null,n.addClass=r.addClass,n.removeClass=r.removeClass,r}function m(t,n,e){function r(t){tt(t)&&(t=t.split(" "));var n={};return G(t,function(t){t.length&&(n[t]=!0)}),n}var i=1,o=-1,a={};t=r(t),n=r(n),G(n,function(t,n){a[n]=i}),e=r(e),G(e,function(t,n){a[n]=a[n]===i?null:o});var u={addClass:"",removeClass:""};return G(a,function(n,e){var r,a;n===i?(r="addClass",a=!t[e]||t[e+I]):n===o&&(r="removeClass",a=t[e]||t[e+F]),a&&(u[r].length&&(u[r]+=" "),u[r]+=e)}),u}function y(t){return t instanceof et?t[0]:t}function $(t,n,e){var r="";n&&(r=o(n,q,!0)),e.addClass&&(r=S(r,o(e.addClass,F))),e.removeClass&&(r=S(r,o(e.removeClass,I))),r.length&&(e.preparationClasses=r,t.addClass(r))}function b(t,n){n.preparationClasses&&(t.removeClass(n.preparationClasses),n.preparationClasses=null),n.activeClasses&&(t.removeClass(n.activeClasses),n.activeClasses=null)}function x(t,n){var e=n?"-"+n+"s":"";return C(t,[pt,e]),[pt,e]}function w(t,n){var e=n?"paused":"",r=N+lt;return C(t,[r,e]),[r,e]}function C(t,n){var e=n[0],r=n[1];t.style[e]=r}function S(t,n){return t?n?t+" "+n:t:n}function _(t){return[ht,t+"s"]}function M(t,n){var e=n?ft:pt;return[e,t+"s"]}function k(t,n,e){var r=Object.create(null),i=t.getComputedStyle(n)||{};return G(e,function(t,n){var e=i[t];if(e){var o=e.charAt(0);("-"===o||"+"===o||o>=0)&&(e=A(e)),0===e&&(e=null),r[n]=e}}),r}function A(t){var n=0,e=t.split(/\s*,\s*/);return G(e,function(t){"s"==t.charAt(t.length-1)&&(t=t.substring(0,t.length-1)),t=parseFloat(t)||0,n=n?Math.max(t,n):t}),n}function E(t){return 0===t||null!=t}function P(t,n){var e=L,r=t+"s";return n?e+=it:r+=" linear all",[e,r]}function O(){var t=Object.create(null);return{flush:function(){t=Object.create(null)},count:function(n){var e=t[n];return e?e.total:0},get:function(n){var e=t[n];return e&&e.value},put:function(n,e){t[n]?t[n].total++:t[n]={total:1,value:e}}}}function T(t,n,e){G(e,function(e){t[e]=X(t[e])?t[e]:n.style.getPropertyValue(e)})}var L,j,N,R,D=1,F="-add",I="-remove",q="ng-",z="-active",V="-prepare",B="ng-animate",U="$$ngAnimateChildren",W="";void 0===t.ontransitionend&&void 0!==t.onwebkittransitionend?(W="-webkit-",L="WebkitTransition",j="webkitTransitionEnd transitionend"):(L="transition",j="transitionend"),void 0===t.onanimationend&&void 0!==t.onwebkitanimationend?(W="-webkit-",N="WebkitAnimation",R="webkitAnimationEnd animationend"):(N="animation",R="animationend");var H,Y,G,Z,X,J,K,Q,tt,nt,et,rt,it="Duration",ot="Property",at="Delay",ut="TimingFunction",st="IterationCount",lt="PlayState",ct=9999,ft=N+at,ht=N+it,pt=L+at,dt=L+it,vt=n.$$minErr("ng"),gt=["$$rAF",function(t){function n(t){r=r.concat(t),e()}function e(){if(r.length){for(var n=r.shift(),o=0;o<n.length;o++)n[o]();i||t(function(){i||e()})}}var r,i;return r=n.queue=[],n.waitUntilQuiet=function(n){i&&i(),i=t(function(){i=null,n(),e()})},n}],mt=["$interpolate",function(t){return{link:function(n,e,r){function i(t){t="on"===t||"true"===t,e.data(U,t)}var o=r.ngAnimateChildren;tt(o)&&0===o.length?e.data(U,!0):(i(t(o)(n)),r.$observe("ngAnimateChildren",i))}}}],yt="$$animateCss",$t=1e3,bt=3,xt=1.5,wt={transitionDuration:dt,transitionDelay:pt,transitionProperty:L+ot,animationDuration:ht,animationDelay:ft,animationIterationCount:N+st},Ct={transitionDuration:dt,transitionDelay:pt,animationDuration:ht,animationDelay:ft},St=["$animateProvider",function(t){var n=O(),e=O();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(t,r,u,s,l,c,g,m){function $(t,n){var e="$$ngAnimateParentKey",r=t.parentNode,i=r[e]||(r[e]=++V);return i+"-"+t.getAttribute("class")+"-"+n}function b(e,r,i,o){var a=n.get(i);return a||(a=k(t,e,o),"infinite"===a.animationIterationCount&&(a.animationIterationCount=1)),n.put(i,a),a}function S(i,a,u,s){var l;if(n.count(u)>0&&(l=e.get(u),!l)){var c=o(a,"-stagger");r.addClass(i,c),l=k(t,i,s),l.animationDuration=Math.max(l.animationDuration,0),l.transitionDuration=Math.max(l.transitionDuration,0),r.removeClass(i,c),e.put(u,l)}return l||{}}function A(t){B.push(t),g.waitUntilQuiet(function(){n.flush(),e.flush();for(var t=l(),r=0;r<B.length;r++)B[r](t);B.length=0})}function O(t,n,e){var r=b(t,n,e,wt),i=r.animationDelay,o=r.transitionDelay;return r.maxDelay=i&&o?Math.max(i,o):i||o,r.maxDuration=Math.max(r.animationDuration*r.animationIterationCount,r.transitionDuration),r}var D=f(r),V=0,B=[];return function(t,e){function l(){g()}function f(){g(!0)}function g(n){if(!(X||K&&J)){X=!0,J=!1,U.$$skipPreparationClasses||r.removeClass(t,wt),r.removeClass(t,_t),w(Y,!1),x(Y,!1),G(lt,function(t){Y.style[t[0]]=""}),D(t,U),p(t,U),Object.keys(W).length&&G(W,function(t,n){t?Y.style.setProperty(n,t):Y.style.removeProperty(n)}),U.onDone&&U.onDone(),pt&&pt.length&&t.off(pt.join(" "),V);var e=t.data(yt);e&&(s.cancel(e[0].timer),t.removeData(yt)),Q&&Q.complete(!n)}}function b(t){It.blockTransition&&x(Y,t),It.blockKeyframeAnimation&&w(Y,!!t)}function k(){return Q=new u({end:l,cancel:f}),A(rt),g(),{$$willAnimate:!1,start:function(){return Q},end:l}}function V(t){t.stopPropagation();var n=t.originalEvent||t,e=n.$manualTimeStamp||Date.now(),r=parseFloat(n.elapsedTime.toFixed(bt));Math.max(e-st,0)>=et&&r>=it&&(K=!0,g())}function B(){function n(){if(!X){if(b(!1),G(lt,function(t){var n=t[0],e=t[1];Y.style[n]=e}),D(t,U),r.addClass(t,_t),It.recalculateTimingStyles){if(St=Y.className+" "+wt,At=$(Y,St),Dt=O(Y,St,At),Ft=Dt.maxDelay,nt=Math.max(Ft,0),it=Dt.maxDuration,0===it)return void g();It.hasTransitions=Dt.transitionDuration>0,It.hasAnimations=Dt.animationDuration>0}if(It.applyAnimationDelay&&(Ft="boolean"!=typeof U.delay&&E(U.delay)?parseFloat(U.delay):Ft,nt=Math.max(Ft,0),Dt.animationDelay=Ft,qt=M(Ft,!0),lt.push(qt),Y.style[qt[0]]=qt[1]),et=nt*$t,at=it*$t,U.easing){var n,i=U.easing;It.hasTransitions&&(n=L+ut,lt.push([n,i]),Y.style[n]=i),It.hasAnimations&&(n=N+ut,lt.push([n,i]),Y.style[n]=i)}Dt.transitionDuration&&pt.push(j),Dt.animationDuration&&pt.push(R),st=Date.now();var o=et+xt*at,a=st+o,u=t.data(yt)||[],l=!0;if(u.length){var c=u[0];l=a>c.expectedEndTime,l?s.cancel(c.timer):u.push(g)}if(l){var f=s(e,o,!1);u[0]={timer:f,expectedEndTime:a},u.push(g),t.data(yt,u)}pt.length&&t.on(pt.join(" "),V),U.to&&(U.cleanupStyles&&T(W,Y,Object.keys(U.to)),v(t,U))}}function e(){var n=t.data(yt);if(n){for(var e=1;e<n.length;e++)n[e]();t.removeData(yt)}}if(!X){if(!Y.parentNode)return void g();var i=function(t){if(K)J&&t&&(J=!1,g());else if(J=!t,Dt.animationDuration){var n=w(Y,J);J?lt.push(n):a(lt,n)}},o=Nt>0&&(Dt.transitionDuration&&0===Et.transitionDuration||Dt.animationDuration&&0===Et.animationDuration)&&Math.max(Et.animationDelay,Et.transitionDelay);o?s(n,Math.floor(o*Nt*$t),!1):n(),tt.resume=function(){i(!0)},tt.pause=function(){i(!1)}}}var U=e||{};U.$$prepared||(U=h(H(U)));var W={},Y=y(t);if(!Y||!Y.parentNode||!m.enabled())return k();var X,J,K,Q,tt,nt,et,it,at,st,lt=[],ft=t.attr("class"),ht=i(U),pt=[];if(0===U.duration||!c.animations&&!c.transitions)return k();var dt=U.event&&Z(U.event)?U.event.join(" "):U.event,vt=dt&&U.structural,gt="",mt="";vt?gt=o(dt,q,!0):dt&&(gt=dt),U.addClass&&(mt+=o(U.addClass,F)),U.removeClass&&(mt.length&&(mt+=" "),mt+=o(U.removeClass,I)),U.applyClassesEarly&&mt.length&&D(t,U);var wt=[gt,mt].join(" ").trim(),St=ft+" "+wt,_t=o(wt,z),Mt=ht.to&&Object.keys(ht.to).length>0,kt=(U.keyframeStyle||"").length>0;if(!kt&&!Mt&&!wt)return k();var At,Et;if(U.stagger>0){var Pt=parseFloat(U.stagger);Et={transitionDelay:Pt,animationDelay:Pt,transitionDuration:0,animationDuration:0}}else At=$(Y,St),Et=S(Y,wt,At,Ct);U.$$skipPreparationClasses||r.addClass(t,wt);var Ot;if(U.transitionStyle){var Tt=[L,U.transitionStyle];C(Y,Tt),lt.push(Tt)}if(U.duration>=0){Ot=Y.style[L].length>0;var Lt=P(U.duration,Ot);C(Y,Lt),lt.push(Lt)}if(U.keyframeStyle){var jt=[N,U.keyframeStyle];C(Y,jt),lt.push(jt)}var Nt=Et?U.staggerIndex>=0?U.staggerIndex:n.count(At):0,Rt=0===Nt;Rt&&!U.skipBlocking&&x(Y,ct);var Dt=O(Y,St,At),Ft=Dt.maxDelay;nt=Math.max(Ft,0),it=Dt.maxDuration;var It={};if(It.hasTransitions=Dt.transitionDuration>0,It.hasAnimations=Dt.animationDuration>0,It.hasTransitionAll=It.hasTransitions&&"all"==Dt.transitionProperty,It.applyTransitionDuration=Mt&&(It.hasTransitions&&!It.hasTransitionAll||It.hasAnimations&&!It.hasTransitions),It.applyAnimationDuration=U.duration&&It.hasAnimations,It.applyTransitionDelay=E(U.delay)&&(It.applyTransitionDuration||It.hasTransitions),It.applyAnimationDelay=E(U.delay)&&It.hasAnimations,It.recalculateTimingStyles=mt.length>0,(It.applyTransitionDuration||It.applyAnimationDuration)&&(it=U.duration?parseFloat(U.duration):it,It.applyTransitionDuration&&(It.hasTransitions=!0,Dt.transitionDuration=it,Ot=Y.style[L+ot].length>0,lt.push(P(it,Ot))),It.applyAnimationDuration&&(It.hasAnimations=!0,Dt.animationDuration=it,lt.push(_(it)))),0===it&&!It.recalculateTimingStyles)return k();if(null!=U.delay){var qt;"boolean"!=typeof U.delay&&(qt=parseFloat(U.delay),nt=Math.max(qt,0)),It.applyTransitionDelay&&lt.push(M(qt)),It.applyAnimationDelay&&lt.push(M(qt,!0))}return null==U.duration&&Dt.transitionDuration>0&&(It.recalculateTimingStyles=It.recalculateTimingStyles||Rt),et=nt*$t,at=it*$t,U.skipBlocking||(It.blockTransition=Dt.transitionDuration>0,It.blockKeyframeAnimation=Dt.animationDuration>0&&Et.animationDelay>0&&0===Et.animationDuration),U.from&&(U.cleanupStyles&&T(W,Y,Object.keys(U.from)),d(t,U)),It.blockTransition||It.blockKeyframeAnimation?b(it):U.skipBlocking||x(Y,!1),{$$willAnimate:!0,end:l,start:function(){if(!X)return tt={end:l,cancel:f,resume:null,pause:null},Q=new u(tt),A(B),Q}}}}]}],_t=["$$animationProvider",function(t){function n(t){return t.parentNode&&11===t.parentNode.nodeType}t.drivers.push("$$animateCssDriver");var e="ng-animate-shim",r="ng-anchor",i="ng-anchor-out",o="ng-anchor-in";this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(t,a,u,s,l,c,h){function p(t){return t.replace(/\bng-\S+\b/g,"")}function d(t,n){return tt(t)&&(t=t.split(" ")),tt(n)&&(n=n.split(" ")),t.filter(function(t){return n.indexOf(t)===-1}).join(" ")}function v(n,a,s){function l(t){var n={},e=y(t).getBoundingClientRect();return G(["width","height","top","left"],function(t){var r=e[t];switch(t){case"top":r+=$.scrollTop;break;case"left":r+=$.scrollLeft}n[t]=Math.floor(r)+"px"}),n}function c(){var n=t(g,{addClass:i,delay:!0,from:l(a)});return n.$$willAnimate?n:null}function f(t){return t.attr("class")||""}function h(){var n=p(f(s)),e=d(n,m),r=d(m,n),a=t(g,{to:l(s),addClass:o+" "+e,removeClass:i+" "+r,delay:!0});return a.$$willAnimate?a:null}function v(){g.remove(),a.removeClass(e),s.removeClass(e)}var g=et(y(a).cloneNode(!0)),m=p(f(g));a.addClass(e),s.addClass(e),g.addClass(r),x.append(g);var b,w=c();if(!w&&(b=h(),!b))return v();var C=w||b;return{start:function(){function t(){e&&e.end()}var n,e=C.start();return e.done(function(){return e=null,!b&&(b=h())?(e=b.start(),e.done(function(){e=null,v(),n.complete()}),e):(v(),void n.complete())}),n=new u({end:t,cancel:t})}}}function g(t,n,e,r){var i=m(t,rt),o=m(n,rt),a=[];if(G(r,function(t){var n=t.out,r=t["in"],i=v(e,n,r);i&&a.push(i)}),i||o||0!==a.length)return{start:function(){function t(){G(n,function(t){t.end()})}var n=[];i&&n.push(i.start()),o&&n.push(o.start()),G(a,function(t){n.push(t.start())});var e=new u({end:t,cancel:t});return u.all(n,function(t){e.complete(t)}),e}}}function m(n){var e=n.element,r=n.options||{};n.structural&&(r.event=n.event,r.structural=!0,r.applyClassesEarly=!0,"leave"===n.event&&(r.onDone=r.domOperation)),r.preparationClasses&&(r.event=S(r.event,r.preparationClasses));var i=t(e,r);return i.$$willAnimate?i:null}if(!l.animations&&!l.transitions)return rt;var $=h[0].body,b=y(s),x=et(n(b)||$.contains(b)?b:$);f(c);return function(t){return t.from&&t.to?g(t.from,t.to,t.classes,t.anchors):m(t)}}]}],Mt=["$animateProvider",function(t){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(n,e,r){function i(e){e=Z(e)?e:e.split(" ");for(var r=[],i={},o=0;o<e.length;o++){var a=e[o],u=t.$$registeredAnimations[a];u&&!i[a]&&(r.push(n.get(u)),i[a]=!0)}return r}var o=f(r);return function(t,n,r,a){function u(){a.domOperation(),o(t,a)}function s(){d=!0,u(),p(t,a)}function l(t,n,r,i,o){var a;switch(r){case"animate":a=[n,i.from,i.to,o];break;case"setClass":a=[n,m,y,o];break;case"addClass":a=[n,m,o];break;case"removeClass":a=[n,y,o];break;default:a=[n,o]}a.push(i);var u=t.apply(t,a);if(u)if(K(u.start)&&(u=u.start()),u instanceof e)u.done(o);else if(K(u))return u;return rt}function c(t,n,r,i,o){var a=[];return G(i,function(i){var u=i[o];u&&a.push(function(){var i,o,a=!1,s=function(t){a||(a=!0,(o||rt)(t),i.complete(!t))};return i=new e({end:function(){s()},cancel:function(){s(!0)}}),o=l(u,t,n,r,function(t){var n=t===!1;s(n)}),i})}),a}function f(t,n,r,i,o){var a=c(t,n,r,i,o);if(0===a.length){var u,s;"beforeSetClass"===o?(u=c(t,"removeClass",r,i,"beforeRemoveClass"),s=c(t,"addClass",r,i,"beforeAddClass")):"setClass"===o&&(u=c(t,"removeClass",r,i,"removeClass"),s=c(t,"addClass",r,i,"addClass")),u&&(a=a.concat(u)),s&&(a=a.concat(s))}if(0!==a.length)return function(t){var n=[];return a.length&&G(a,function(t){n.push(t())}),n.length?e.all(n,t):t(),function(t){G(n,function(n){t?n.cancel():n.end()})}}}var d=!1;3===arguments.length&&Q(r)&&(a=r,r=null),a=h(a),r||(r=t.attr("class")||"",a.addClass&&(r+=" "+a.addClass),a.removeClass&&(r+=" "+a.removeClass));var v,g,m=a.addClass,y=a.removeClass,$=i(r);if($.length){var b,x;"leave"==n?(x="leave",b="afterLeave"):(x="before"+n.charAt(0).toUpperCase()+n.substr(1),b=n),"enter"!==n&&"move"!==n&&(v=f(t,n,a,$,x)),g=f(t,n,a,$,b)}if(v||g){var w;return{$$willAnimate:!0,end:function(){return w?w.end():(s(),w=new e,w.complete(!0)),w},start:function(){function t(t){s(t),w.complete(t)}function n(n){d||((r||rt)(n),t(n))}if(w)return w;w=new e;var r,i=[];return v&&i.push(function(t){r=v(t)}),i.length?i.push(function(t){u(),t(!0)}):u(),g&&i.push(function(t){r=g(t)}),w.setHost({end:function(){n()},cancel:function(){n(!0)}}),e.chain(i,t),w}}}}}]}],kt=["$$animationProvider",function(t){t.drivers.push("$$animateJsDriver"),this.$get=["$$animateJs","$$AnimateRunner",function(t,n){function e(n){var e=n.element,r=n.event,i=n.options,o=n.classes;return t(e,r,o,i)}return function(t){if(t.from&&t.to){var r=e(t.from),i=e(t.to);if(!r&&!i)return;return{start:function(){function t(){return function(){G(o,function(t){t.end()})}}function e(t){a.complete(t)}var o=[];r&&o.push(r.start()),i&&o.push(i.start()),n.all(o,e);var a=new n({end:t(),cancel:t()});return a}}}return e(t)}}]}],At="data-ng-animate",Et="$ngAnimatePin",Pt=["$animateProvider",function(n){function r(t){if(!t)return null;var n=t.split(d),e=Object.create(null);return G(n,function(t){e[t]=!0}),e}function i(t,n){if(t&&n){var e=r(n);return t.split(d).some(function(t){return e[t]})}}function o(t,n,e,r){return v[t].some(function(t){return t(n,e,r)})}function a(t,n){var e=(t.addClass||"").length>0,r=(t.removeClass||"").length>0;return n?e&&r:e||r}var l=1,c=2,d=" ",v=this.rules={skip:[],cancel:[],join:[]};v.join.push(function(t,n,e){return!n.structural&&a(n)}),v.skip.push(function(t,n,e){return!n.structural&&!a(n)}),v.skip.push(function(t,n,e){return"leave"==e.event&&n.structural}),v.skip.push(function(t,n,e){return e.structural&&e.state===c&&!n.structural}),v.cancel.push(function(t,n,e){return e.structural&&n.structural}),v.cancel.push(function(t,n,e){return e.state===c&&n.structural}),v.cancel.push(function(t,n,e){if(e.structural)return!1;var r=n.addClass,o=n.removeClass,a=e.addClass,u=e.removeClass;return!(nt(r)&&nt(o)||nt(a)&&nt(u))&&(i(r,u)||i(o,a))}),this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(r,i,d,v,m,x,w,C,S,_){function M(){var t=!1;return function(n){t?n():i.$$postDigest(function(){t=!0,n()})}}function k(t,n){return g(t,n,{})}function A(t,n,e){var r=y(n),i=y(t),o=[],a=V[e];return a&&G(a,function(t){rt.call(t.node,r)?o.push(t.callback):"leave"===e&&rt.call(t.node,i)&&o.push(t.callback)}),o}function E(t,n,e){var r=s(n);return t.filter(function(t){var n=t.node===r&&(!e||t.callback===e);return!n})}function P(t,n){"close"!==t||n[0].parentNode||it.off(n)}function O(t,n,e){function s(n,e,i,o){_(function(){var n=A(m,t,e);n.length?r(function(){G(n,function(n){n(t,i,o)}),P(i,t)}):P(i,t)}),n.progress(e,i,o)}function f(n){b(t,C),K(t,C),p(t,C),C.domOperation(),S.complete(!n)}var d,m,C=H(e);t=u(t),t&&(d=y(t),m=t.parent()),C=h(C);var S=new w,_=M();if(Z(C.addClass)&&(C.addClass=C.addClass.join(" ")),C.addClass&&!tt(C.addClass)&&(C.addClass=null),Z(C.removeClass)&&(C.removeClass=C.removeClass.join(" ")),C.removeClass&&!tt(C.removeClass)&&(C.removeClass=null),C.from&&!Q(C.from)&&(C.from=null),C.to&&!Q(C.to)&&(C.to=null),!d)return f(),S;var E=[d.className,C.addClass,C.removeClass].join(" ");if(!W(E))return f(),S;var O=["enter","move","leave"].indexOf(n)>=0,j=v[0].hidden,D=!q||j||I.get(d),z=!D&&F.get(d)||{},V=!!z.state;if(D||V&&z.state==l||(D=!N(t,m,n)),D)return j&&s(S,n,"start"),f(),j&&s(S,n,"close"),S;O&&T(t);var B={structural:O,element:t,event:n,addClass:C.addClass,removeClass:C.removeClass,close:f,options:C,runner:S};if(V){var U=o("skip",t,B,z);if(U)return z.state===c?(f(),
+S):(g(t,z,B),z.runner);var Y=o("cancel",t,B,z);if(Y)if(z.state===c)z.runner.end();else{if(!z.structural)return g(t,z,B),z.runner;z.close()}else{var X=o("join",t,B,z);if(X){if(z.state!==c)return $(t,O?n:null,C),n=B.event=z.event,C=g(t,z,B),z.runner;k(t,B)}}}else k(t,B);var J=B.structural;if(J||(J="animate"===B.event&&Object.keys(B.options.to||{}).length>0||a(B)),!J)return f(),L(t),S;var nt=(z.counter||0)+1;return B.counter=nt,R(t,l,B),i.$$postDigest(function(){var e=F.get(d),r=!e;e=e||{};var i=t.parent()||[],o=i.length>0&&("animate"===e.event||e.structural||a(e));if(r||e.counter!==nt||!o)return r&&(K(t,C),p(t,C)),(r||O&&e.event!==n)&&(C.domOperation(),S.end()),void(o||L(t));n=!e.structural&&a(e,!0)?"setClass":e.event,R(t,c);var u=x(t,n,e.options);S.setHost(u),s(S,n,"start",{}),u.done(function(e){f(!e);var r=F.get(d);r&&r.counter===nt&&L(y(t)),s(S,n,"close",{})})}),S}function T(t){var n=y(t),e=n.querySelectorAll("["+At+"]");G(e,function(t){var n=parseInt(t.getAttribute(At)),e=F.get(t);if(e)switch(n){case c:e.runner.end();case l:F.remove(t)}})}function L(t){var n=y(t);n.removeAttribute(At),F.remove(n)}function j(t,n){return y(t)===y(n)}function N(t,n,e){var r,i=et(v[0].body),o=j(t,i)||"HTML"===t[0].nodeName,a=j(t,d),u=!1,s=I.get(y(t)),l=et.data(t[0],Et);for(l&&(n=l),n=y(n);n&&(a||(a=j(n,d)),n.nodeType===D);){var c=F.get(n)||{};if(!u){var f=I.get(n);if(f===!0&&s!==!1){s=!0;break}f===!1&&(s=!1),u=c.structural}if(nt(r)||r===!0){var h=et.data(n,U);X(h)&&(r=h)}if(u&&r===!1)break;if(o||(o=j(n,i)),o&&a)break;n=a||!(l=et.data(n,Et))?n.parentNode:y(l)}var p=(!u||r)&&s!==!0;return p&&a&&o}function R(t,n,e){e=e||{},e.state=n;var r=y(t);r.setAttribute(At,n);var i=F.get(r),o=i?Y(i,e):e;F.put(r,o)}var F=new m,I=new m,q=null,z=i.$watch(function(){return 0===C.totalPendingRequests},function(t){t&&(z(),i.$$postDigest(function(){i.$$postDigest(function(){null===q&&(q=!0)})}))}),V=Object.create(null),B=n.classNameFilter(),W=B?function(t){return B.test(t)}:function(){return!0},K=f(S),rt=t.Node.prototype.contains||function(t){return this===t||!!(16&this.compareDocumentPosition(t))},it={on:function(t,n,e){var r=s(n);V[t]=V[t]||[],V[t].push({node:r,callback:e}),et(n).on("$destroy",function(){var i=F.get(r);i||it.off(t,n,e)})},off:function(t,n,e){if(1!==arguments.length||tt(arguments[0])){var r=V[t];r&&(V[t]=1===arguments.length?null:E(r,n,e))}else{n=arguments[0];for(var i in V)V[i]=E(V[i],n)}},pin:function(t,n){e(J(t),"element","not an element"),e(J(n),"parentElement","not an element"),t.data(Et,n)},push:function(t,n,e,r){return e=e||{},e.domOperation=r,O(t,n,e)},enabled:function(t,n){var e=arguments.length;if(0===e)n=!!q;else{var r=J(t);if(r){var i=y(t);1===e?n=!I.get(i):I.put(i,!n)}else n=q=!!t}return n}};return it}]}],Ot=["$animateProvider",function(t){function n(t,n){t.data(u,n)}function e(t){t.removeData(u)}function i(t){return t.data(u)}var o="ng-animate-ref",a=this.drivers=[],u="$$animationRunner";this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(t,u,s,l,c,d){function v(t){function n(t){if(t.processed)return t;t.processed=!0;var e=t.domNode,r=e.parentNode;o.put(e,t);for(var a;r;){if(a=o.get(r)){a.processed||(a=n(a));break}r=r.parentNode}return(a||i).children.push(t),t}function e(t){var n,e=[],r=[];for(n=0;n<t.children.length;n++)r.push(t.children[n]);var i=r.length,o=0,a=[];for(n=0;n<r.length;n++){var u=r[n];i<=0&&(i=o,o=0,e.push(a),a=[]),a.push(u.fn),u.children.forEach(function(t){o++,r.push(t)}),i--}return a.length&&e.push(a),e}var r,i={children:[]},o=new c;for(r=0;r<t.length;r++){var a=t[r];o.put(a.domNode,t[r]={domNode:a.domNode,fn:a.fn,children:[]})}for(r=0;r<t.length;r++)n(t[r]);return e(i)}var g=[],m=f(t);return function(c,f,$){function b(t){var n="["+o+"]",e=t.hasAttribute(o)?[t]:t.querySelectorAll(n),r=[];return G(e,function(t){var n=t.getAttribute(o);n&&n.length&&r.push(t)}),r}function x(t){var n=[],e={};G(t,function(t,r){var i=t.element,a=y(i),u=t.event,s=["enter","move"].indexOf(u)>=0,l=t.structural?b(a):[];if(l.length){var c=s?"to":"from";G(l,function(t){var n=t.getAttribute(o);e[n]=e[n]||{},e[n][c]={animationID:r,element:et(t)}})}else n.push(t)});var r={},i={};return G(e,function(e,o){var a=e.from,u=e.to;if(!a||!u){var s=a?a.animationID:u.animationID,l=s.toString();return void(r[l]||(r[l]=!0,n.push(t[s])))}var c=t[a.animationID],f=t[u.animationID],h=a.animationID.toString();if(!i[h]){var p=i[h]={structural:!0,beforeStart:function(){c.beforeStart(),f.beforeStart()},close:function(){c.close(),f.close()},classes:w(c.classes,f.classes),from:c,to:f,anchors:[]};p.classes.length?n.push(p):(n.push(c),n.push(f))}i[h].anchors.push({out:a.element,"in":u.element})}),n}function w(t,n){t=t.split(" "),n=n.split(" ");for(var e=[],r=0;r<t.length;r++){var i=t[r];if("ng-"!==i.substring(0,3))for(var o=0;o<n.length;o++)if(i===n[o]){e.push(i);break}}return e.join(" ")}function C(t){for(var n=a.length-1;n>=0;n--){var e=a[n],r=s.get(e),i=r(t);if(i)return i}}function S(){c.addClass(B),O&&t.addClass(c,O),T&&(t.removeClass(c,T),T=null)}function _(t,n){function e(t){var e=i(t);e&&e.setHost(n)}t.from&&t.to?(e(t.from.element),e(t.to.element)):e(t.element)}function M(){var t=i(c);!t||"leave"===f&&$.$$domOperationFired||t.end()}function k(n){c.off("$destroy",M),e(c),m(c,$),p(c,$),$.domOperation(),O&&t.removeClass(c,O),c.removeClass(B),E.complete(!n)}$=h($);var A=["enter","move","leave"].indexOf(f)>=0,E=new l({end:function(){k()},cancel:function(){k(!0)}});if(!a.length)return k(),E;n(c,E);var P=r(c.attr("class"),r($.addClass,$.removeClass)),O=$.tempClasses;O&&(P+=" "+O,$.tempClasses=null);var T;return A&&(T="ng-"+f+V,t.addClass(c,T)),g.push({element:c,classes:P,event:f,structural:A,options:$,beforeStart:S,close:k}),c.on("$destroy",M),g.length>1?E:(u.$$postDigest(function(){var t=[];G(g,function(n){i(n.element)?t.push(n):n.close()}),g.length=0;var n=x(t),e=[];G(n,function(t){e.push({domNode:y(t.from?t.from.element:t.element),fn:function(){t.beforeStart();var n,e=t.close,r=t.anchors?t.from.element||t.to.element:t.element;if(i(r)){var o=C(t);o&&(n=o.start)}if(n){var a=n();a.done(function(t){e(!t)}),_(t,a)}else e()}})}),d(v(e))}),E)}}]}],Tt=["$animate","$rootScope",function(t,n){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(n,e,r,i,o){var a,u;n.$watchCollection(r.ngAnimateSwap||r["for"],function(r){a&&t.leave(a),u&&(u.$destroy(),u=null),(r||0===r)&&(u=n.$new(),o(u,function(n){a=n,t.enter(n,null,e)}))})}}}];n.module("ngAnimate",[],function(){rt=n.noop,H=n.copy,Y=n.extend,et=n.element,G=n.forEach,Z=n.isArray,tt=n.isString,Q=n.isObject,nt=n.isUndefined,X=n.isDefined,K=n.isFunction,J=n.isElement}).directive("ngAnimateSwap",Tt).directive("ngAnimateChildren",mt).factory("$$rAFScheduler",gt).provider("$$animateQueue",Pt).provider("$$animation",Ot).provider("$animateCss",St).provider("$$animateCssDriver",_t).provider("$$animateJs",Mt).provider("$$animateJsDriver",kt)}(window,window.angular),function(){function t(t,n){return t.set(n[0],n[1]),t}function n(t,n){return t.add(n),t}function e(t,n,e){var r=e.length;switch(r){case 0:return t.call(n);case 1:return t.call(n,e[0]);case 2:return t.call(n,e[0],e[1]);case 3:return t.call(n,e[0],e[1],e[2])}return t.apply(n,e)}function r(t,n,e,r){for(var i=-1,o=t.length;++i<o;){var a=t[i];n(r,a,e(a),t)}return r}function i(t,n){for(var e=-1,r=t.length,i=-1,o=n.length,a=Array(r+o);++e<r;)a[e]=t[e];for(;++i<o;)a[e++]=n[i];return a}function o(t,n){for(var e=-1,r=t.length;++e<r&&n(t[e],e,t)!==!1;);return t}function a(t,n){for(var e=t.length;e--&&n(t[e],e,t)!==!1;);return t}function u(t,n){for(var e=-1,r=t.length;++e<r;)if(!n(t[e],e,t))return!1;return!0}function s(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e];n(a,e,t)&&(o[i++]=a)}return o}function l(t,n){return!!t.length&&y(t,n,0)>-1}function c(t,n,e){for(var r=-1,i=t.length;++r<i;)if(e(n,t[r]))return!0;return!1}function f(t,n){for(var e=-1,r=t.length,i=Array(r);++e<r;)i[e]=n(t[e],e,t);return i}function h(t,n){for(var e=-1,r=n.length,i=t.length;++e<r;)t[i+e]=n[e];return t}function p(t,n,e,r){var i=-1,o=t.length;for(r&&o&&(e=t[++i]);++i<o;)e=n(e,t[i],i,t);return e}function d(t,n,e,r){var i=t.length;for(r&&i&&(e=t[--i]);i--;)e=n(e,t[i],i,t);return e}function v(t,n){for(var e=-1,r=t.length;++e<r;)if(n(t[e],e,t))return!0;return!1}function g(t,n,e,r){var i;return e(t,function(t,e,o){if(n(t,e,o))return i=r?e:t,!1}),i}function m(t,n,e){for(var r=t.length,i=e?r:-1;e?i--:++i<r;)if(n(t[i],i,t))return i;return-1}function y(t,n,e){if(n!==n)return N(t,e);for(var r=e-1,i=t.length;++r<i;)if(t[r]===n)return r;return-1}function $(t,n,e,r){for(var i=e-1,o=t.length;++i<o;)if(r(t[i],n))return i;return-1}function b(t,n){var e=t?t.length:0;return e?C(t,n)/e:$t}function x(t,n,e,r,i){return i(t,function(t,i,o){e=r?(r=!1,t):n(e,t,i,o)}),e}function w(t,n){var e=t.length;for(t.sort(n);e--;)t[e]=t[e].value;return t}function C(t,n){for(var e,r=-1,i=t.length;++r<i;){var o=n(t[r]);o!==W&&(e=e===W?o:e+o)}return e}function S(t,n){for(var e=-1,r=Array(t);++e<t;)r[e]=n(e);return r}function _(t,n){return f(n,function(n){return[n,t[n]]})}function M(t){return function(n){return t(n)}}function k(t,n){return f(n,function(n){return t[n]})}function A(t,n){for(var e=-1,r=t.length;++e<r&&y(n,t[e],0)>-1;);return e}function E(t,n){for(var e=t.length;e--&&y(n,t[e],0)>-1;);return e}function P(t){return t&&t.Object===Object?t:null}function O(t,n){for(var e=t.length,r=0;e--;)t[e]===n&&r++;return r}function T(t){return we[t]}function L(t){return Ce[t]}function j(t){return"\\"+Me[t]}function N(t,n,e){for(var r=t.length,i=n+(e?0:-1);e?i--:++i<r;){var o=t[i];if(o!==o)return i}return-1}function R(t){var n=!1;if(null!=t&&"function"!=typeof t.toString)try{n=!!(t+"")}catch(e){}return n}function D(t){for(var n,e=[];!(n=t.next()).done;)e.push(n.value);return e}function F(t){var n=-1,e=Array(t.size);return t.forEach(function(t,r){e[++n]=[r,t]}),e}function I(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e];a!==n&&a!==X||(t[e]=X,o[i++]=e)}return o}function q(t){var n=-1,e=Array(t.size);return t.forEach(function(t){e[++n]=t}),e}function z(t){if(!t||!ge.test(t))return t.length;for(var n=de.lastIndex=0;de.test(t);)n++;return n}function V(t){return t.match(de)}function B(t){return Se[t]}function U(P){function En(t){if(lu(t)&&!tf(t)&&!(t instanceof Tn)){if(t instanceof On)return t;if(dl.call(t,"__wrapped__"))return no(t)}return new On(t)}function Pn(){}function On(t,n){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!n,this.__index__=0,this.__values__=W}function Tn(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=bt,this.__views__=[]}function Ln(){var t=new Tn(this.__wrapped__);return t.__actions__=Xr(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Xr(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Xr(this.__views__),t}function jn(){if(this.__filtered__){var t=new Tn(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function Nn(){var t=this.__wrapped__.value(),n=this.__dir__,e=tf(t),r=n<0,i=e?t.length:0,o=Li(0,i,this.__views__),a=o.start,u=o.end,s=u-a,l=r?u:a-1,c=this.__iteratees__,f=c.length,h=0,p=Il(s,this.__takeCount__);if(!e||i<Y||i==s&&p==s)return Or(t,this.__actions__);var d=[];t:for(;s--&&h<p;){l+=n;for(var v=-1,g=t[l];++v<f;){var m=c[v],y=m.iteratee,$=m.type,b=y(g);if($==dt)g=b;else if(!b){if($==pt)continue t;break t}}d[h++]=g}return d}function Rn(){}function Dn(t,n){return In(t,n)&&delete t[n]}function Fn(t,n){if(Xl){var e=t[n];return e===Z?W:e}return dl.call(t,n)?t[n]:W}function In(t,n){return Xl?t[n]!==W:dl.call(t,n)}function qn(t,n,e){t[n]=Xl&&e===W?Z:e}function zn(t){var n=-1,e=t?t.length:0;for(this.clear();++n<e;){var r=t[n];this.set(r[0],r[1])}}function Vn(){this.__data__={hash:new Rn,map:Hl?new Hl:[],string:new Rn}}function Bn(t){var n=this.__data__;return Ui(t)?Dn("string"==typeof t?n.string:n.hash,t):Hl?n.map["delete"](t):ee(n.map,t)}function Un(t){var n=this.__data__;return Ui(t)?Fn("string"==typeof t?n.string:n.hash,t):Hl?n.map.get(t):re(n.map,t)}function Wn(t){var n=this.__data__;return Ui(t)?In("string"==typeof t?n.string:n.hash,t):Hl?n.map.has(t):ie(n.map,t)}function Hn(t,n){var e=this.__data__;return Ui(t)?qn("string"==typeof t?e.string:e.hash,t,n):Hl?e.map.set(t,n):ae(e.map,t,n),this}function Yn(t){var n=-1,e=t?t.length:0;for(this.__data__=new zn;++n<e;)this.push(t[n])}function Gn(t,n){var e=t.__data__;if(Ui(n)){var r=e.__data__,i="string"==typeof n?r.string:r.hash;return i[n]===Z}return e.has(n)}function Zn(t){var n=this.__data__;if(Ui(t)){var e=n.__data__,r="string"==typeof t?e.string:e.hash;r[t]=Z}else n.set(t,Z)}function Xn(t){var n=-1,e=t?t.length:0;for(this.clear();++n<e;){var r=t[n];this.set(r[0],r[1])}}function Jn(){this.__data__={array:[],map:null}}function Kn(t){var n=this.__data__,e=n.array;return e?ee(e,t):n.map["delete"](t)}function Qn(t){var n=this.__data__,e=n.array;return e?re(e,t):n.map.get(t)}function te(t){var n=this.__data__,e=n.array;return e?ie(e,t):n.map.has(t)}function ne(t,n){var e=this.__data__,r=e.array;r&&(r.length<Y-1?ae(r,t,n):(e.array=null,e.map=new zn(r)));var i=e.map;return i&&i.set(t,n),this}function ee(t,n){var e=oe(t,n);if(e<0)return!1;var r=t.length-1;return e==r?t.pop():Ol.call(t,e,1),!0}function re(t,n){var e=oe(t,n);return e<0?W:t[e][1]}function ie(t,n){return oe(t,n)>-1}function oe(t,n){for(var e=t.length;e--;)if(Ha(t[e][0],n))return e;return-1}function ae(t,n,e){var r=oe(t,n);r<0?t.push([n,e]):t[r][1]=e}function ue(t,n,e,r){return t===W||Ha(t,fl[e])&&!dl.call(r,e)?n:t}function se(t,n,e){(e===W||Ha(t[n],e))&&("number"!=typeof n||e!==W||n in t)||(t[n]=e)}function le(t,n,e){var r=t[n];dl.call(t,n)&&Ha(r,e)&&(e!==W||n in t)||(t[n]=e)}function ce(t,n,e,r){return sc(t,function(t,i,o){n(r,t,e(t),o)}),r}function fe(t,n){return t&&Jr(n,Yu(n),t)}function de(t,n){for(var e=-1,r=null==t,i=n.length,o=Array(i);++e<i;)o[e]=r?W:Uu(t,n[e]);return o}function we(t,n,e){return t===t&&(e!==W&&(t=t<=e?t:e),n!==W&&(t=t>=n?t:n)),t}function Ce(t,n,e,r,i,a,u){var s;if(r&&(s=a?r(t,i,a,u):r(t)),s!==W)return s;if(!su(t))return t;var l=tf(t);if(l){if(s=Ni(t),!n)return Xr(t,s)}else{var c=Ti(t),f=c==At||c==Et;if(nf(t))return Fr(t,n);if(c==Tt||c==Ct||f&&!a){if(R(t))return a?t:{};if(s=Ri(f?{}:t),!n)return Kr(t,fe(s,t))}else{if(!xe[c])return a?t:{};s=Di(t,c,Ce,n)}}u||(u=new Xn);var h=u.get(t);if(h)return h;if(u.set(t,s),!l)var p=e?Ci(t):Yu(t);return o(p||t,function(i,o){p&&(o=i,i=t[o]),le(s,o,Ce(i,n,e,r,o,t,u))}),s}function Se(t){var n=Yu(t),e=n.length;return function(r){if(null==r)return!e;for(var i=e;i--;){var o=n[i],a=t[o],u=r[o];if(u===W&&!(o in Object(r))||!a(u))return!1}return!0}}function _e(t){return su(t)?Al(t):{}}function Me(t,n,e){if("function"!=typeof t)throw new ll(G);return Pl(function(){t.apply(W,e)},n)}function Ee(t,n,e,r){var i=-1,o=l,a=!0,u=t.length,s=[],h=n.length;if(!u)return s;e&&(n=f(n,M(e))),r?(o=c,a=!1):n.length>=Y&&(o=Gn,a=!1,n=new Yn(n));t:for(;++i<u;){var p=t[i],d=e?e(p):p;if(p=r||0!==p?p:0,a&&d===d){for(var v=h;v--;)if(n[v]===d)continue t;s.push(p)}else o(n,d,r)||s.push(p)}return s}function Pe(t,n){var e=!0;return sc(t,function(t,r,i){return e=!!n(t,r,i)}),e}function Te(t,n,e){for(var r=-1,i=t.length;++r<i;){var o=t[r],a=n(o);if(null!=a&&(u===W?a===a&&!Cu(a):e(a,u)))var u=a,s=o}return s}function Le(t,n,e,r){var i=t.length;for(e=Eu(e),e<0&&(e=-e>i?0:i+e),r=r===W||r>i?i:Eu(r),r<0&&(r+=i),r=e>r?0:Pu(r);e<r;)t[e++]=n;return t}function je(t,n){var e=[];return sc(t,function(t,r,i){n(t,r,i)&&e.push(t)}),e}function Ne(t,n,e,r,i){var o=-1,a=t.length;for(e||(e=Ii),i||(i=[]);++o<a;){var u=t[o];n>0&&e(u)?n>1?Ne(u,n-1,e,r,i):h(i,u):r||(i[i.length]=u)}return i}function Fe(t,n){return t&&cc(t,n,Yu)}function Ie(t,n){return t&&fc(t,n,Yu)}function qe(t,n){return s(n,function(n){return ou(t[n])})}function ze(t,n){n=Bi(n,t)?[n]:Rr(n);for(var e=0,r=n.length;null!=t&&e<r;)t=t[Qi(n[e++])];return e&&e==r?t:W}function Ve(t,n,e){var r=n(t);return tf(t)?r:h(r,e(t))}function Be(t,n){return t>n}function Ue(t,n){return dl.call(t,n)||"object"==typeof t&&n in t&&null===Pi(t)}function We(t,n){return n in Object(t)}function He(t,n,e){return t>=Il(n,e)&&t<Fl(n,e)}function Ye(t,n,e){for(var r=e?c:l,i=t[0].length,o=t.length,a=o,u=Array(o),s=1/0,h=[];a--;){var p=t[a];a&&n&&(p=f(p,M(n))),s=Il(p.length,s),u[a]=!e&&(n||i>=120&&p.length>=120)?new Yn(a&&p):W}p=t[0];var d=-1,v=u[0];t:for(;++d<i&&h.length<s;){var g=p[d],m=n?n(g):g;if(g=e||0!==g?g:0,!(v?Gn(v,m):r(h,m,e))){for(a=o;--a;){var y=u[a];if(!(y?Gn(y,m):r(t[a],m,e)))continue t}v&&v.push(m),h.push(g)}}return h}function Ge(t,n,e,r){return Fe(t,function(t,i,o){n(r,e(t),i,o)}),r}function Ze(t,n,r){Bi(n,t)||(n=Rr(n),t=Ji(t,n),n=xo(n));var i=null==t?t:t[Qi(n)];return null==i?W:e(i,t,r)}function Xe(t,n,e,r,i){return t===n||(null==t||null==n||!su(t)&&!lu(n)?t!==t&&n!==n:Je(t,n,Xe,e,r,i))}function Je(t,n,e,r,i,o){var a=tf(t),u=tf(n),s=St,l=St;a||(s=Ti(t),s=s==Ct?Tt:s),u||(l=Ti(n),l=l==Ct?Tt:l);var c=s==Tt&&!R(t),f=l==Tt&&!R(n),h=s==l;if(h&&!c)return o||(o=new Xn),a||Su(t)?bi(t,n,e,r,i,o):xi(t,n,s,e,r,i,o);if(!(i&st)){var p=c&&dl.call(t,"__wrapped__"),d=f&&dl.call(n,"__wrapped__");if(p||d){var v=p?t.value():t,g=d?n.value():n;return o||(o=new Xn),e(v,g,r,i,o)}}return!!h&&(o||(o=new Xn),wi(t,n,e,r,i,o))}function Ke(t,n,e,r){var i=e.length,o=i,a=!r;if(null==t)return!o;for(t=Object(t);i--;){var u=e[i];if(a&&u[2]?u[1]!==t[u[0]]:!(u[0]in t))return!1}for(;++i<o;){u=e[i];var s=u[0],l=t[s],c=u[1];if(a&&u[2]){if(l===W&&!(s in t))return!1}else{var f=new Xn;if(r)var h=r(l,c,s,t,n,f);if(!(h===W?Xe(c,l,r,ut|st,f):h))return!1}}return!0}function Qe(t){return"function"==typeof t?t:null==t?Fs:"object"==typeof t?tf(t)?or(t[0],t[1]):ir(t):Hs(t)}function tr(t){return Dl(Object(t))}function nr(t){t=null==t?t:Object(t);var n=[];for(var e in t)n.push(e);return n}function er(t,n){return t<n}function rr(t,n){var e=-1,r=Za(t)?Array(t.length):[];return sc(t,function(t,i,o){r[++e]=n(t,i,o)}),r}function ir(t){var n=ki(t);return 1==n.length&&n[0][2]?Gi(n[0][0],n[0][1]):function(e){return e===t||Ke(e,t,n)}}function or(t,n){return Bi(t)&&Yi(n)?Gi(Qi(t),n):function(e){var r=Uu(e,t);return r===W&&r===n?Hu(e,t):Xe(n,r,W,ut|st)}}function ar(t,n,e,r,i){if(t!==n){if(!tf(n)&&!Su(n))var a=Gu(n);o(a||n,function(o,u){if(a&&(u=o,o=n[u]),su(o))i||(i=new Xn),ur(t,n,u,e,ar,r,i);else{var s=r?r(t[u],o,u+"",t,n,i):W;s===W&&(s=o),se(t,u,s)}})}}function ur(t,n,e,r,i,o,a){var u=t[e],s=n[e],l=a.get(s);if(l)return void se(t,e,l);var c=o?o(u,s,e+"",t,n,a):W,f=c===W;f&&(c=s,tf(s)||Su(s)?tf(u)?c=u:Xa(u)?c=Xr(u):(f=!1,c=Ce(s,!0)):yu(s)||Ya(s)?Ya(u)?c=Tu(u):!su(u)||r&&ou(u)?(f=!1,c=Ce(s,!0)):c=u:f=!1),a.set(s,c),f&&i(c,s,r,o,a),a["delete"](s),se(t,e,c)}function sr(t,n){var e=t.length;if(e)return n+=n<0?e:0,zi(n,e)?t[n]:W}function lr(t,n,e){var r=-1;n=f(n.length?n:[Fs],M(Mi()));var i=rr(t,function(t,e,i){var o=f(n,function(n){return n(t)});return{criteria:o,index:++r,value:t}});return w(i,function(t,n){return Yr(t,n,e)})}function cr(t,n){return t=Object(t),p(n,function(n,e){return e in t&&(n[e]=t[e]),n},{})}function fr(t,n){for(var e=-1,r=Si(t),i=r.length,o={};++e<i;){var a=r[e],u=t[a];n(u,a)&&(o[a]=u)}return o}function hr(t){return function(n){return null==n?W:n[t]}}function pr(t){return function(n){return ze(n,t)}}function dr(t,n,e,r){var i=r?$:y,o=-1,a=n.length,u=t;for(e&&(u=f(t,M(e)));++o<a;)for(var s=0,l=n[o],c=e?e(l):l;(s=i(u,c,s,r))>-1;)u!==t&&Ol.call(u,s,1),Ol.call(t,s,1);return t}function vr(t,n){for(var e=t?n.length:0,r=e-1;e--;){var i=n[e];if(e==r||i!==o){var o=i;if(zi(i))Ol.call(t,i,1);else if(Bi(i,t))delete t[Qi(i)];else{var a=Rr(i),u=Ji(t,a);null!=u&&delete u[Qi(xo(a))]}}}return t}function gr(t,n){return t+Ll(zl()*(n-t+1))}function mr(t,n,e,r){for(var i=-1,o=Fl(Tl((n-t)/(e||1)),0),a=Array(o);o--;)a[r?o:++i]=t,t+=e;return a}function yr(t,n){var e="";if(!t||n<1||n>mt)return e;do n%2&&(e+=t),n=Ll(n/2),n&&(t+=t);while(n);return e}function $r(t,n,e,r){n=Bi(n,t)?[n]:Rr(n);for(var i=-1,o=n.length,a=o-1,u=t;null!=u&&++i<o;){var s=Qi(n[i]);if(su(u)){var l=e;if(i!=a){var c=u[s];l=r?r(c,s,u):W,l===W&&(l=null==c?zi(n[i+1])?[]:{}:c)}le(u,s,l)}u=u[s]}return t}function br(t,n,e){var r=-1,i=t.length;n<0&&(n=-n>i?0:i+n),e=e>i?i:e,e<0&&(e+=i),i=n>e?0:e-n>>>0,n>>>=0;for(var o=Array(i);++r<i;)o[r]=t[r+n];return o}function xr(t,n){var e;return sc(t,function(t,r,i){return e=n(t,r,i),!e}),!!e}function wr(t,n,e){var r=0,i=t?t.length:r;if("number"==typeof n&&n===n&&i<=wt){for(;r<i;){var o=r+i>>>1,a=t[o];null!==a&&!Cu(a)&&(e?a<=n:a<n)?r=o+1:i=o}return i}return Cr(t,n,Fs,e)}function Cr(t,n,e,r){n=e(n);for(var i=0,o=t?t.length:0,a=n!==n,u=null===n,s=Cu(n),l=n===W;i<o;){var c=Ll((i+o)/2),f=e(t[c]),h=f!==W,p=null===f,d=f===f,v=Cu(f);if(a)var g=r||d;else g=l?d&&(r||h):u?d&&h&&(r||!p):s?d&&h&&!p&&(r||!v):!p&&!v&&(r?f<=n:f<n);g?i=c+1:o=c}return Il(o,xt)}function Sr(t,n){for(var e=-1,r=t.length,i=0,o=[];++e<r;){var a=t[e],u=n?n(a):a;if(!e||!Ha(u,s)){var s=u;o[i++]=0===a?0:a}}return o}function _r(t){return"number"==typeof t?t:Cu(t)?$t:+t}function Mr(t){if("string"==typeof t)return t;if(Cu(t))return uc?uc.call(t):"";var n=t+"";return"0"==n&&1/t==-gt?"-0":n}function kr(t,n,e){var r=-1,i=l,o=t.length,a=!0,u=[],s=u;if(e)a=!1,i=c;else if(o>=Y){var f=n?null:pc(t);if(f)return q(f);a=!1,i=Gn,s=new Yn}else s=n?[]:u;t:for(;++r<o;){var h=t[r],p=n?n(h):h;if(h=e||0!==h?h:0,a&&p===p){for(var d=s.length;d--;)if(s[d]===p)continue t;n&&s.push(p),u.push(h)}else i(s,p,e)||(s!==u&&s.push(p),u.push(h))}return u}function Ar(t,n){n=Bi(n,t)?[n]:Rr(n),t=Ji(t,n);var e=Qi(xo(n));return!(null!=t&&Ue(t,e))||delete t[e]}function Er(t,n,e,r){return $r(t,n,e(ze(t,n)),r)}function Pr(t,n,e,r){for(var i=t.length,o=r?i:-1;(r?o--:++o<i)&&n(t[o],o,t););return e?br(t,r?0:o,r?o+1:i):br(t,r?o+1:0,r?i:o)}function Or(t,n){var e=t;return e instanceof Tn&&(e=e.value()),p(n,function(t,n){return n.func.apply(n.thisArg,h([t],n.args))},e)}function Tr(t,n,e){for(var r=-1,i=t.length;++r<i;)var o=o?h(Ee(o,t[r],n,e),Ee(t[r],o,n,e)):t[r];return o&&o.length?kr(o,n,e):[]}function Lr(t,n,e){for(var r=-1,i=t.length,o=n.length,a={};++r<i;){var u=r<o?n[r]:W;e(a,t[r],u)}return a}function jr(t){return Xa(t)?t:[]}function Nr(t){return"function"==typeof t?t:Fs}function Rr(t){return tf(t)?t:yc(t)}function Dr(t,n,e){var r=t.length;return e=e===W?r:e,!n&&e>=r?t:br(t,n,e)}function Fr(t,n){if(n)return t.slice();var e=new t.constructor(t.length);return t.copy(e),e}function Ir(t){var n=new t.constructor(t.byteLength);return new Cl(n).set(new Cl(t)),n}function qr(t,n){var e=n?Ir(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.byteLength)}function zr(n,e,r){var i=e?r(F(n),!0):F(n);return p(i,t,new n.constructor)}function Vr(t){var n=new t.constructor(t.source,$n.exec(t));return n.lastIndex=t.lastIndex,n}function Br(t,e,r){var i=e?r(q(t),!0):q(t);return p(i,n,new t.constructor)}function Ur(t){return ac?Object(ac.call(t)):{}}function Wr(t,n){var e=n?Ir(t.buffer):t.buffer;return new t.constructor(e,t.byteOffset,t.length)}function Hr(t,n){if(t!==n){var e=t!==W,r=null===t,i=t===t,o=Cu(t),a=n!==W,u=null===n,s=n===n,l=Cu(n);if(!u&&!l&&!o&&t>n||o&&a&&s&&!u&&!l||r&&a&&s||!e&&s||!i)return 1;if(!r&&!o&&!l&&t<n||l&&e&&i&&!r&&!o||u&&e&&i||!a&&i||!s)return-1}return 0}function Yr(t,n,e){for(var r=-1,i=t.criteria,o=n.criteria,a=i.length,u=e.length;++r<a;){var s=Hr(i[r],o[r]);if(s){if(r>=u)return s;var l=e[r];return s*("desc"==l?-1:1)}}return t.index-n.index}function Gr(t,n,e,r){for(var i=-1,o=t.length,a=e.length,u=-1,s=n.length,l=Fl(o-a,0),c=Array(s+l),f=!r;++u<s;)c[u]=n[u];for(;++i<a;)(f||i<o)&&(c[e[i]]=t[i]);for(;l--;)c[u++]=t[i++];return c}function Zr(t,n,e,r){for(var i=-1,o=t.length,a=-1,u=e.length,s=-1,l=n.length,c=Fl(o-u,0),f=Array(c+l),h=!r;++i<c;)f[i]=t[i];for(var p=i;++s<l;)f[p+s]=n[s];for(;++a<u;)(h||i<o)&&(f[p+e[a]]=t[i++]);return f}function Xr(t,n){var e=-1,r=t.length;for(n||(n=Array(r));++e<r;)n[e]=t[e];return n}function Jr(t,n,e,r){e||(e={});for(var i=-1,o=n.length;++i<o;){var a=n[i],u=r?r(e[a],t[a],a,e,t):t[a];le(e,a,u)}return e}function Kr(t,n){return Jr(t,Oi(t),n)}function Qr(t,n){return function(e,i){var o=tf(e)?r:ce,a=n?n():{};return o(e,t,Mi(i),a)}}function ti(t){return Ra(function(n,e){var r=-1,i=e.length,o=i>1?e[i-1]:W,a=i>2?e[2]:W;for(o="function"==typeof o?(i--,o):W,a&&Vi(e[0],e[1],a)&&(o=i<3?W:o,i=1),n=Object(n);++r<i;){var u=e[r];u&&t(n,u,r,o)}return n})}function ni(t,n){return function(e,r){if(null==e)return e;if(!Za(e))return t(e,r);for(var i=e.length,o=n?i:-1,a=Object(e);(n?o--:++o<i)&&r(a[o],o,a)!==!1;);return e}}function ei(t){return function(n,e,r){for(var i=-1,o=Object(n),a=r(n),u=a.length;u--;){var s=a[t?u:++i];if(e(o[s],s,o)===!1)break}return n}}function ri(t,n,e){function r(){var n=this&&this!==Re&&this instanceof r?o:t;return n.apply(i?e:this,arguments)}var i=n&J,o=ai(t);return r}function ii(t){return function(n){n=ju(n);var e=ge.test(n)?V(n):W,r=e?e[0]:n.charAt(0),i=e?Dr(e,1).join(""):n.slice(1);return r[t]()+i}}function oi(t){return function(n){return p(js(ds(n).replace(he,"")),t,"")}}function ai(t){return function(){var n=arguments;switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3]);case 5:return new t(n[0],n[1],n[2],n[3],n[4]);case 6:return new t(n[0],n[1],n[2],n[3],n[4],n[5]);case 7:return new t(n[0],n[1],n[2],n[3],n[4],n[5],n[6])}var e=_e(t.prototype),r=t.apply(e,n);return su(r)?r:e}}function ui(t,n,r){function i(){for(var a=arguments.length,u=Array(a),s=a,l=Ei(i);s--;)u[s]=arguments[s];var c=a<3&&u[0]!==l&&u[a-1]!==l?[]:I(u,l);if(a-=c.length,a<r)return mi(t,n,li,i.placeholder,W,u,c,W,W,r-a);var f=this&&this!==Re&&this instanceof i?o:t;return e(f,this,u)}var o=ai(t);return i}function si(t){return Ra(function(n){n=Ne(n,1);var e=n.length,r=e,i=On.prototype.thru;for(t&&n.reverse();r--;){var o=n[r];if("function"!=typeof o)throw new ll(G);if(i&&!a&&"wrapper"==_i(o))var a=new On([],(!0))}for(r=a?r:e;++r<e;){o=n[r];var u=_i(o),s="wrapper"==u?dc(o):W;a=s&&Wi(s[0])&&s[1]==(it|tt|et|ot)&&!s[4].length&&1==s[9]?a[_i(s[0])].apply(a,s[3]):1==o.length&&Wi(o)?a[u]():a.thru(o)}return function(){var t=arguments,r=t[0];if(a&&1==t.length&&tf(r)&&r.length>=Y)return a.plant(r).value();for(var i=0,o=e?n[i].apply(this,t):r;++i<e;)o=n[i].call(this,o);return o}})}function li(t,n,e,r,i,o,a,u,s,l){function c(){for(var m=arguments.length,y=m,$=Array(m);y--;)$[y]=arguments[y];if(d)var b=Ei(c),x=O($,b);if(r&&($=Gr($,r,i,d)),o&&($=Zr($,o,a,d)),m-=x,d&&m<l){var w=I($,b);return mi(t,n,li,c.placeholder,e,$,w,u,s,l-m)}var C=h?e:this,S=p?C[t]:t;return m=$.length,u?$=Ki($,u):v&&m>1&&$.reverse(),f&&s<m&&($.length=s),this&&this!==Re&&this instanceof c&&(S=g||ai(S)),S.apply(C,$)}var f=n&it,h=n&J,p=n&K,d=n&(tt|nt),v=n&at,g=p?W:ai(t);return c}function ci(t,n){return function(e,r){return Ge(e,t,n(r),{})}}function fi(t){return function(n,e){var r;if(n===W&&e===W)return 0;if(n!==W&&(r=n),e!==W){if(r===W)return e;"string"==typeof n||"string"==typeof e?(n=Mr(n),e=Mr(e)):(n=_r(n),e=_r(e)),r=t(n,e)}return r}}function hi(t){return Ra(function(n){return n=1==n.length&&tf(n[0])?f(n[0],M(Mi())):f(Ne(n,1,qi),M(Mi())),Ra(function(r){var i=this;return t(n,function(t){return e(t,i,r)})})})}function pi(t,n){n=n===W?" ":Mr(n);var e=n.length;if(e<2)return e?yr(n,t):n;var r=yr(n,Tl(t/z(n)));return ge.test(n)?Dr(V(r),0,t).join(""):r.slice(0,t)}function di(t,n,r,i){function o(){for(var n=-1,s=arguments.length,l=-1,c=i.length,f=Array(c+s),h=this&&this!==Re&&this instanceof o?u:t;++l<c;)f[l]=i[l];for(;s--;)f[l++]=arguments[++n];return e(h,a?r:this,f)}var a=n&J,u=ai(t);return o}function vi(t){return function(n,e,r){return r&&"number"!=typeof r&&Vi(n,e,r)&&(e=r=W),n=Ou(n),n=n===n?n:0,e===W?(e=n,n=0):e=Ou(e)||0,r=r===W?n<e?1:-1:Ou(r)||0,mr(n,e,r,t)}}function gi(t){return function(n,e){return"string"==typeof n&&"string"==typeof e||(n=Ou(n),e=Ou(e)),t(n,e)}}function mi(t,n,e,r,i,o,a,u,s,l){var c=n&tt,f=c?a:W,h=c?W:a,p=c?o:W,d=c?W:o;n|=c?et:rt,n&=~(c?rt:et),n&Q||(n&=~(J|K));var v=[t,n,i,p,f,d,h,u,s,l],g=e.apply(W,v);return Wi(t)&&mc(g,v),g.placeholder=r,g}function yi(t){var n=ul[t];return function(t,e){if(t=Ou(t),e=Eu(e)){var r=(ju(t)+"e").split("e"),i=n(r[0]+"e"+(+r[1]+e));return r=(ju(i)+"e").split("e"),+(r[0]+"e"+(+r[1]-e))}return n(t)}}function $i(t,n,e,r,i,o,a,u){var s=n&K;if(!s&&"function"!=typeof t)throw new ll(G);var l=r?r.length:0;if(l||(n&=~(et|rt),r=i=W),a=a===W?a:Fl(Eu(a),0),u=u===W?u:Eu(u),l-=i?i.length:0,n&rt){var c=r,f=i;r=i=W}var h=s?W:dc(t),p=[t,n,e,r,i,c,f,o,a,u];if(h&&Zi(p,h),t=p[0],n=p[1],e=p[2],r=p[3],i=p[4],u=p[9]=null==p[9]?s?0:t.length:Fl(p[9]-l,0),!u&&n&(tt|nt)&&(n&=~(tt|nt)),n&&n!=J)d=n==tt||n==nt?ui(t,n,u):n!=et&&n!=(J|et)||i.length?li.apply(W,p):di(t,n,e,r);else var d=ri(t,n,e);var v=h?hc:mc;return v(d,p)}function bi(t,n,e,r,i,o){var a=-1,u=i&st,s=i&ut,l=t.length,c=n.length;if(l!=c&&!(u&&c>l))return!1;var f=o.get(t);if(f)return f==n;var h=!0;for(o.set(t,n);++a<l;){var p=t[a],d=n[a];if(r)var g=u?r(d,p,a,n,t,o):r(p,d,a,t,n,o);if(g!==W){if(g)continue;h=!1;break}if(s){if(!v(n,function(t){return p===t||e(p,t,r,i,o)})){h=!1;break}}else if(p!==d&&!e(p,d,r,i,o)){h=!1;break}}return o["delete"](t),h}function xi(t,n,e,r,i,o,a){switch(e){case zt:if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)return!1;t=t.buffer,n=n.buffer;case qt:return!(t.byteLength!=n.byteLength||!r(new Cl(t),new Cl(n)));case _t:case Mt:return+t==+n;case kt:return t.name==n.name&&t.message==n.message;case Ot:return t!=+t?n!=+n:t==+n;case jt:case Rt:return t==n+"";case Pt:var u=F;case Nt:var s=o&st;if(u||(u=q),t.size!=n.size&&!s)return!1;var l=a.get(t);return l?l==n:(o|=ut,a.set(t,n),bi(u(t),u(n),r,i,o,a));case Dt:if(ac)return ac.call(t)==ac.call(n)}return!1}function wi(t,n,e,r,i,o){var a=i&st,u=Yu(t),s=u.length,l=Yu(n),c=l.length;if(s!=c&&!a)return!1;for(var f=s;f--;){var h=u[f];if(!(a?h in n:Ue(n,h)))return!1}var p=o.get(t);if(p)return p==n;var d=!0;o.set(t,n);for(var v=a;++f<s;){h=u[f];var g=t[h],m=n[h];if(r)var y=a?r(m,g,h,n,t,o):r(g,m,h,t,n,o);if(!(y===W?g===m||e(g,m,r,i,o):y)){d=!1;break}v||(v="constructor"==h)}if(d&&!v){var $=t.constructor,b=n.constructor;$!=b&&"constructor"in t&&"constructor"in n&&!("function"==typeof $&&$ instanceof $&&"function"==typeof b&&b instanceof b)&&(d=!1)}return o["delete"](t),d}function Ci(t){return Ve(t,Yu,Oi)}function Si(t){return Ve(t,Gu,gc)}function _i(t){for(var n=t.name+"",e=Ql[n],r=dl.call(Ql,n)?e.length:0;r--;){var i=e[r],o=i.func;if(null==o||o==t)return i.name}return n}function Mi(){var t=En.iteratee||Is;return t=t===Is?Qe:t,arguments.length?t(arguments[0],arguments[1]):t}function ki(t){for(var n=es(t),e=n.length;e--;)n[e][2]=Yi(n[e][1]);return n}function Ai(t,n){var e=t[n];return du(e)?e:W}function Ei(t){var n=dl.call(En,"placeholder")?En:t;return n.placeholder}function Pi(t){return jl(Object(t))}function Oi(t){return Ml(Object(t))}function Ti(t){return ml.call(t)}function Li(t,n,e){for(var r=-1,i=e.length;++r<i;){var o=e[r],a=o.size;switch(o.type){case"drop":t+=a;break;case"dropRight":n-=a;break;case"take":n=Il(n,t+a);break;case"takeRight":t=Fl(t,n-a)}}return{start:t,end:n}}function ji(t,n,e){n=Bi(n,t)?[n]:Rr(n);for(var r,i=-1,o=n.length;++i<o;){var a=Qi(n[i]);if(!(r=null!=t&&e(t,a)))break;t=t[a]}if(r)return r;var o=t?t.length:0;return!!o&&uu(o)&&zi(a,o)&&(tf(t)||wu(t)||Ya(t))}function Ni(t){var n=t.length,e=t.constructor(n);return n&&"string"==typeof t[0]&&dl.call(t,"index")&&(e.index=t.index,e.input=t.input),e}function Ri(t){return"function"!=typeof t.constructor||Hi(t)?{}:_e(Pi(t))}function Di(t,n,e,r){var i=t.constructor;switch(n){case qt:return Ir(t);case _t:case Mt:return new i((+t));case zt:return qr(t,r);case Vt:case Bt:case Ut:case Wt:case Ht:case Yt:case Gt:case Zt:case Xt:return Wr(t,r);case Pt:return zr(t,r,e);case Ot:case Rt:return new i(t);case jt:return Vr(t);case Nt:return Br(t,r,e);case Dt:return Ur(t)}}function Fi(t){var n=t?t.length:W;return uu(n)&&(tf(t)||wu(t)||Ya(t))?S(n,String):null}function Ii(t){
+return Xa(t)&&(tf(t)||Ya(t))}function qi(t){return tf(t)&&!(2==t.length&&!ou(t[0]))}function zi(t,n){return n=null==n?mt:n,!!n&&("number"==typeof t||_n.test(t))&&t>-1&&t%1==0&&t<n}function Vi(t,n,e){if(!su(e))return!1;var r=typeof n;return!!("number"==r?Za(e)&&zi(n,e.length):"string"==r&&n in e)&&Ha(e[n],t)}function Bi(t,n){if(tf(t))return!1;var e=typeof t;return!("number"!=e&&"symbol"!=e&&"boolean"!=e&&null!=t&&!Cu(t))||(ln.test(t)||!sn.test(t)||null!=n&&t in Object(n))}function Ui(t){var n=typeof t;return"string"==n||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==t:null===t}function Wi(t){var n=_i(t),e=En[n];if("function"!=typeof e||!(n in Tn.prototype))return!1;if(t===e)return!0;var r=dc(e);return!!r&&t===r[0]}function Hi(t){var n=t&&t.constructor,e="function"==typeof n&&n.prototype||fl;return t===e}function Yi(t){return t===t&&!su(t)}function Gi(t,n){return function(e){return null!=e&&(e[t]===n&&(n!==W||t in Object(e)))}}function Zi(t,n){var e=t[1],r=n[1],i=e|r,o=i<(J|K|it),a=r==it&&e==tt||r==it&&e==ot&&t[7].length<=n[8]||r==(it|ot)&&n[7].length<=n[8]&&e==tt;if(!o&&!a)return t;r&J&&(t[2]=n[2],i|=e&J?0:Q);var u=n[3];if(u){var s=t[3];t[3]=s?Gr(s,u,n[4]):u,t[4]=s?I(t[3],X):n[4]}return u=n[5],u&&(s=t[5],t[5]=s?Zr(s,u,n[6]):u,t[6]=s?I(t[5],X):n[6]),u=n[7],u&&(t[7]=u),r&it&&(t[8]=null==t[8]?n[8]:Il(t[8],n[8])),null==t[9]&&(t[9]=n[9]),t[0]=n[0],t[1]=i,t}function Xi(t,n,e,r,i,o){return su(t)&&su(n)&&ar(t,n,W,Xi,o.set(n,t)),t}function Ji(t,n){return 1==n.length?t:ze(t,br(n,0,-1))}function Ki(t,n){for(var e=t.length,r=Il(n.length,e),i=Xr(t);r--;){var o=n[r];t[r]=zi(o,e)?i[o]:W}return t}function Qi(t){if("string"==typeof t||Cu(t))return t;var n=t+"";return"0"==n&&1/t==-gt?"-0":n}function to(t){if(null!=t){try{return pl.call(t)}catch(n){}try{return t+""}catch(n){}}return""}function no(t){if(t instanceof Tn)return t.clone();var n=new On(t.__wrapped__,t.__chain__);return n.__actions__=Xr(t.__actions__),n.__index__=t.__index__,n.__values__=t.__values__,n}function eo(t,n,e){n=(e?Vi(t,n,e):n===W)?1:Fl(Eu(n),0);var r=t?t.length:0;if(!r||n<1)return[];for(var i=0,o=0,a=Array(Tl(r/n));i<r;)a[o++]=br(t,i,i+=n);return a}function ro(t){for(var n=-1,e=t?t.length:0,r=0,i=[];++n<e;){var o=t[n];o&&(i[r++]=o)}return i}function io(){var t=arguments.length,n=za(arguments[0]);if(t<2)return t?Xr(n):[];for(var e=Array(t-1);t--;)e[t-1]=arguments[t];return i(n,Ne(e,1))}function oo(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),br(t,n<0?0:n,r)):[]}function ao(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),n=r-n,br(t,0,n<0?0:n)):[]}function uo(t,n){return t&&t.length?Pr(t,Mi(n,3),!0,!0):[]}function so(t,n){return t&&t.length?Pr(t,Mi(n,3),!0):[]}function lo(t,n,e,r){var i=t?t.length:0;return i?(e&&"number"!=typeof e&&Vi(t,n,e)&&(e=0,r=i),Le(t,n,e,r)):[]}function co(t,n){return t&&t.length?m(t,Mi(n,3)):-1}function fo(t,n){return t&&t.length?m(t,Mi(n,3),!0):-1}function ho(t){var n=t?t.length:0;return n?Ne(t,1):[]}function po(t){var n=t?t.length:0;return n?Ne(t,gt):[]}function vo(t,n){var e=t?t.length:0;return e?(n=n===W?1:Eu(n),Ne(t,n)):[]}function go(t){for(var n=-1,e=t?t.length:0,r={};++n<e;){var i=t[n];r[i[0]]=i[1]}return r}function mo(t){return t&&t.length?t[0]:W}function yo(t,n,e){var r=t?t.length:0;return r?(e=Eu(e),e<0&&(e=Fl(r+e,0)),y(t,n,e)):-1}function $o(t){return ao(t,1)}function bo(t,n){return t?Rl.call(t,n):""}function xo(t){var n=t?t.length:0;return n?t[n-1]:W}function wo(t,n,e){var r=t?t.length:0;if(!r)return-1;var i=r;if(e!==W&&(i=Eu(e),i=(i<0?Fl(r+i,0):Il(i,r-1))+1),n!==n)return N(t,i,!0);for(;i--;)if(t[i]===n)return i;return-1}function Co(t,n){return t&&t.length?sr(t,Eu(n)):W}function So(t,n){return t&&t.length&&n&&n.length?dr(t,n):t}function _o(t,n,e){return t&&t.length&&n&&n.length?dr(t,n,Mi(e)):t}function Mo(t,n,e){return t&&t.length&&n&&n.length?dr(t,n,W,e):t}function ko(t,n){var e=[];if(!t||!t.length)return e;var r=-1,i=[],o=t.length;for(n=Mi(n,3);++r<o;){var a=t[r];n(a,r,t)&&(e.push(a),i.push(r))}return vr(t,i),e}function Ao(t){return t?Bl.call(t):t}function Eo(t,n,e){var r=t?t.length:0;return r?(e&&"number"!=typeof e&&Vi(t,n,e)?(n=0,e=r):(n=null==n?0:Eu(n),e=e===W?r:Eu(e)),br(t,n,e)):[]}function Po(t,n){return wr(t,n)}function Oo(t,n,e){return Cr(t,n,Mi(e))}function To(t,n){var e=t?t.length:0;if(e){var r=wr(t,n);if(r<e&&Ha(t[r],n))return r}return-1}function Lo(t,n){return wr(t,n,!0)}function jo(t,n,e){return Cr(t,n,Mi(e),!0)}function No(t,n){var e=t?t.length:0;if(e){var r=wr(t,n,!0)-1;if(Ha(t[r],n))return r}return-1}function Ro(t){return t&&t.length?Sr(t):[]}function Do(t,n){return t&&t.length?Sr(t,Mi(n)):[]}function Fo(t){return oo(t,1)}function Io(t,n,e){return t&&t.length?(n=e||n===W?1:Eu(n),br(t,0,n<0?0:n)):[]}function qo(t,n,e){var r=t?t.length:0;return r?(n=e||n===W?1:Eu(n),n=r-n,br(t,n<0?0:n,r)):[]}function zo(t,n){return t&&t.length?Pr(t,Mi(n,3),!1,!0):[]}function Vo(t,n){return t&&t.length?Pr(t,Mi(n,3)):[]}function Bo(t){return t&&t.length?kr(t):[]}function Uo(t,n){return t&&t.length?kr(t,Mi(n)):[]}function Wo(t,n){return t&&t.length?kr(t,W,n):[]}function Ho(t){if(!t||!t.length)return[];var n=0;return t=s(t,function(t){if(Xa(t))return n=Fl(t.length,n),!0}),S(n,function(n){return f(t,hr(n))})}function Yo(t,n){if(!t||!t.length)return[];var r=Ho(t);return null==n?r:f(r,function(t){return e(n,W,t)})}function Go(t,n){return Lr(t||[],n||[],le)}function Zo(t,n){return Lr(t||[],n||[],$r)}function Xo(t){var n=En(t);return n.__chain__=!0,n}function Jo(t,n){return n(t),t}function Ko(t,n){return n(t)}function Qo(){return Xo(this)}function ta(){return new On(this.value(),this.__chain__)}function na(){this.__values__===W&&(this.__values__=Au(this.value()));var t=this.__index__>=this.__values__.length,n=t?W:this.__values__[this.__index__++];return{done:t,value:n}}function ea(){return this}function ra(t){for(var n,e=this;e instanceof Pn;){var r=no(e);r.__index__=0,r.__values__=W,n?i.__wrapped__=r:n=r;var i=r;e=e.__wrapped__}return i.__wrapped__=t,n}function ia(){var t=this.__wrapped__;if(t instanceof Tn){var n=t;return this.__actions__.length&&(n=new Tn(this)),n=n.reverse(),n.__actions__.push({func:Ko,args:[Ao],thisArg:W}),new On(n,this.__chain__)}return this.thru(Ao)}function oa(){return Or(this.__wrapped__,this.__actions__)}function aa(t,n,e){var r=tf(t)?u:Pe;return e&&Vi(t,n,e)&&(n=W),r(t,Mi(n,3))}function ua(t,n){var e=tf(t)?s:je;return e(t,Mi(n,3))}function sa(t,n){if(n=Mi(n,3),tf(t)){var e=m(t,n);return e>-1?t[e]:W}return g(t,n,sc)}function la(t,n){if(n=Mi(n,3),tf(t)){var e=m(t,n,!0);return e>-1?t[e]:W}return g(t,n,lc)}function ca(t,n){return Ne(ga(t,n),1)}function fa(t,n){return Ne(ga(t,n),gt)}function ha(t,n,e){return e=e===W?1:Eu(e),Ne(ga(t,n),e)}function pa(t,n){return"function"==typeof n&&tf(t)?o(t,n):sc(t,Mi(n))}function da(t,n){return"function"==typeof n&&tf(t)?a(t,n):lc(t,Mi(n))}function va(t,n,e,r){t=Za(t)?t:ss(t),e=e&&!r?Eu(e):0;var i=t.length;return e<0&&(e=Fl(i+e,0)),wu(t)?e<=i&&t.indexOf(n,e)>-1:!!i&&y(t,n,e)>-1}function ga(t,n){var e=tf(t)?f:rr;return e(t,Mi(n,3))}function ma(t,n,e,r){return null==t?[]:(tf(n)||(n=null==n?[]:[n]),e=r?W:e,tf(e)||(e=null==e?[]:[e]),lr(t,n,e))}function ya(t,n,e){var r=tf(t)?p:x,i=arguments.length<3;return r(t,Mi(n,4),e,i,sc)}function $a(t,n,e){var r=tf(t)?d:x,i=arguments.length<3;return r(t,Mi(n,4),e,i,lc)}function ba(t,n){var e=tf(t)?s:je;return n=Mi(n,3),e(t,function(t,e,r){return!n(t,e,r)})}function xa(t){var n=Za(t)?t:ss(t),e=n.length;return e>0?n[gr(0,e-1)]:W}function wa(t,n,e){var r=-1,i=Au(t),o=i.length,a=o-1;for(n=(e?Vi(t,n,e):n===W)?1:we(Eu(n),0,o);++r<n;){var u=gr(r,a),s=i[u];i[u]=i[r],i[r]=s}return i.length=n,i}function Ca(t){return wa(t,bt)}function Sa(t){if(null==t)return 0;if(Za(t)){var n=t.length;return n&&wu(t)?z(t):n}if(lu(t)){var e=Ti(t);if(e==Pt||e==Nt)return t.size}return Yu(t).length}function _a(t,n,e){var r=tf(t)?v:xr;return e&&Vi(t,n,e)&&(n=W),r(t,Mi(n,3))}function Ma(t,n){if("function"!=typeof n)throw new ll(G);return t=Eu(t),function(){if(--t<1)return n.apply(this,arguments)}}function ka(t,n,e){return n=e?W:n,n=t&&null==n?t.length:n,$i(t,it,W,W,W,W,n)}function Aa(t,n){var e;if("function"!=typeof n)throw new ll(G);return t=Eu(t),function(){return--t>0&&(e=n.apply(this,arguments)),t<=1&&(n=W),e}}function Ea(t,n,e){n=e?W:n;var r=$i(t,tt,W,W,W,W,W,n);return r.placeholder=Ea.placeholder,r}function Pa(t,n,e){n=e?W:n;var r=$i(t,nt,W,W,W,W,W,n);return r.placeholder=Pa.placeholder,r}function Oa(t,n,e){function r(n){var e=h,r=p;return h=p=W,y=n,v=t.apply(r,e)}function i(t){return y=t,g=Pl(u,n),$?r(t):v}function o(t){var e=t-m,r=t-y,i=n-e;return b?Il(i,d-r):i}function a(t){var e=t-m,r=t-y;return!m||e>=n||e<0||b&&r>=d}function u(){var t=Bc();return a(t)?s(t):void(g=Pl(u,o(t)))}function s(t){return Sl(g),g=W,x&&h?r(t):(h=p=W,v)}function l(){g!==W&&Sl(g),m=y=0,h=p=g=W}function c(){return g===W?v:s(Bc())}function f(){var t=Bc(),e=a(t);if(h=arguments,p=this,m=t,e){if(g===W)return i(m);if(b)return Sl(g),g=Pl(u,n),r(m)}return g===W&&(g=Pl(u,n)),v}var h,p,d,v,g,m=0,y=0,$=!1,b=!1,x=!0;if("function"!=typeof t)throw new ll(G);return n=Ou(n)||0,su(e)&&($=!!e.leading,b="maxWait"in e,d=b?Fl(Ou(e.maxWait)||0,n):d,x="trailing"in e?!!e.trailing:x),f.cancel=l,f.flush=c,f}function Ta(t){return $i(t,at)}function La(t,n){if("function"!=typeof t||n&&"function"!=typeof n)throw new ll(G);var e=function(){var r=arguments,i=n?n.apply(this,r):r[0],o=e.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return e.cache=o.set(i,a),a};return e.cache=new(La.Cache||zn),e}function ja(t){if("function"!=typeof t)throw new ll(G);return function(){return!t.apply(this,arguments)}}function Na(t){return Aa(2,t)}function Ra(t,n){if("function"!=typeof t)throw new ll(G);return n=Fl(n===W?t.length-1:Eu(n),0),function(){for(var r=arguments,i=-1,o=Fl(r.length-n,0),a=Array(o);++i<o;)a[i]=r[n+i];switch(n){case 0:return t.call(this,a);case 1:return t.call(this,r[0],a);case 2:return t.call(this,r[0],r[1],a)}var u=Array(n+1);for(i=-1;++i<n;)u[i]=r[i];return u[n]=a,e(t,this,u)}}function Da(t,n){if("function"!=typeof t)throw new ll(G);return n=n===W?0:Fl(Eu(n),0),Ra(function(r){var i=r[n],o=Dr(r,0,n);return i&&h(o,i),e(t,this,o)})}function Fa(t,n,e){var r=!0,i=!0;if("function"!=typeof t)throw new ll(G);return su(e)&&(r="leading"in e?!!e.leading:r,i="trailing"in e?!!e.trailing:i),Oa(t,n,{leading:r,maxWait:n,trailing:i})}function Ia(t){return ka(t,1)}function qa(t,n){return n=null==n?Fs:n,Zc(n,t)}function za(){if(!arguments.length)return[];var t=arguments[0];return tf(t)?t:[t]}function Va(t){return Ce(t,!1,!0)}function Ba(t,n){return Ce(t,!1,!0,n)}function Ua(t){return Ce(t,!0,!0)}function Wa(t,n){return Ce(t,!0,!0,n)}function Ha(t,n){return t===n||t!==t&&n!==n}function Ya(t){return Xa(t)&&dl.call(t,"callee")&&(!El.call(t,"callee")||ml.call(t)==Ct)}function Ga(t){return lu(t)&&ml.call(t)==qt}function Za(t){return null!=t&&uu(vc(t))&&!ou(t)}function Xa(t){return lu(t)&&Za(t)}function Ja(t){return t===!0||t===!1||lu(t)&&ml.call(t)==_t}function Ka(t){return lu(t)&&ml.call(t)==Mt}function Qa(t){return!!t&&1===t.nodeType&&lu(t)&&!yu(t)}function tu(t){if(Za(t)&&(tf(t)||wu(t)||ou(t.splice)||Ya(t)||nf(t)))return!t.length;if(lu(t)){var n=Ti(t);if(n==Pt||n==Nt)return!t.size}for(var e in t)if(dl.call(t,e))return!1;return!(Kl&&Yu(t).length)}function nu(t,n){return Xe(t,n)}function eu(t,n,e){e="function"==typeof e?e:W;var r=e?e(t,n):W;return r===W?Xe(t,n,e):!!r}function ru(t){return!!lu(t)&&(ml.call(t)==kt||"string"==typeof t.message&&"string"==typeof t.name)}function iu(t){return"number"==typeof t&&Nl(t)}function ou(t){var n=su(t)?ml.call(t):"";return n==At||n==Et}function au(t){return"number"==typeof t&&t==Eu(t)}function uu(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=mt}function su(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function lu(t){return!!t&&"object"==typeof t}function cu(t){return lu(t)&&Ti(t)==Pt}function fu(t,n){return t===n||Ke(t,n,ki(n))}function hu(t,n,e){return e="function"==typeof e?e:W,Ke(t,n,ki(n),e)}function pu(t){return mu(t)&&t!=+t}function du(t){if(!su(t))return!1;var n=ou(t)||R(t)?$l:Cn;return n.test(to(t))}function vu(t){return null===t}function gu(t){return null==t}function mu(t){return"number"==typeof t||lu(t)&&ml.call(t)==Ot}function yu(t){if(!lu(t)||ml.call(t)!=Tt||R(t))return!1;var n=Pi(t);if(null===n)return!0;var e=dl.call(n,"constructor")&&n.constructor;return"function"==typeof e&&e instanceof e&&pl.call(e)==gl}function $u(t){return su(t)&&ml.call(t)==jt}function bu(t){return au(t)&&t>=-mt&&t<=mt}function xu(t){return lu(t)&&Ti(t)==Nt}function wu(t){return"string"==typeof t||!tf(t)&&lu(t)&&ml.call(t)==Rt}function Cu(t){return"symbol"==typeof t||lu(t)&&ml.call(t)==Dt}function Su(t){return lu(t)&&uu(t.length)&&!!be[ml.call(t)]}function _u(t){return t===W}function Mu(t){return lu(t)&&Ti(t)==Ft}function ku(t){return lu(t)&&ml.call(t)==It}function Au(t){if(!t)return[];if(Za(t))return wu(t)?V(t):Xr(t);if(kl&&t[kl])return D(t[kl]());var n=Ti(t),e=n==Pt?F:n==Nt?q:ss;return e(t)}function Eu(t){if(!t)return 0===t?t:0;if(t=Ou(t),t===gt||t===-gt){var n=t<0?-1:1;return n*yt}var e=t%1;return t===t?e?t-e:t:0}function Pu(t){return t?we(Eu(t),0,bt):0}function Ou(t){if("number"==typeof t)return t;if(Cu(t))return $t;if(su(t)){var n=ou(t.valueOf)?t.valueOf():t;t=su(n)?n+"":n}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(pn,"");var e=wn.test(t);return e||Sn.test(t)?Ae(t.slice(2),e?2:8):xn.test(t)?$t:+t}function Tu(t){return Jr(t,Gu(t))}function Lu(t){return we(Eu(t),-mt,mt)}function ju(t){return null==t?"":Mr(t)}function Nu(t,n){var e=_e(t);return n?fe(e,n):e}function Ru(t,n){return g(t,Mi(n,3),Fe,!0)}function Du(t,n){return g(t,Mi(n,3),Ie,!0)}function Fu(t,n){return null==t?t:cc(t,Mi(n),Gu)}function Iu(t,n){return null==t?t:fc(t,Mi(n),Gu)}function qu(t,n){return t&&Fe(t,Mi(n))}function zu(t,n){return t&&Ie(t,Mi(n))}function Vu(t){return null==t?[]:qe(t,Yu(t))}function Bu(t){return null==t?[]:qe(t,Gu(t))}function Uu(t,n,e){var r=null==t?W:ze(t,n);return r===W?e:r}function Wu(t,n){return null!=t&&ji(t,n,Ue)}function Hu(t,n){return null!=t&&ji(t,n,We)}function Yu(t){var n=Hi(t);if(!n&&!Za(t))return tr(t);var e=Fi(t),r=!!e,i=e||[],o=i.length;for(var a in t)!Ue(t,a)||r&&("length"==a||zi(a,o))||n&&"constructor"==a||i.push(a);return i}function Gu(t){for(var n=-1,e=Hi(t),r=nr(t),i=r.length,o=Fi(t),a=!!o,u=o||[],s=u.length;++n<i;){var l=r[n];a&&("length"==l||zi(l,s))||"constructor"==l&&(e||!dl.call(t,l))||u.push(l)}return u}function Zu(t,n){var e={};return n=Mi(n,3),Fe(t,function(t,r,i){e[n(t,r,i)]=t}),e}function Xu(t,n){var e={};return n=Mi(n,3),Fe(t,function(t,r,i){e[r]=n(t,r,i)}),e}function Ju(t,n){return n=Mi(n),fr(t,function(t,e){return!n(t,e)})}function Ku(t,n){return null==t?{}:fr(t,Mi(n))}function Qu(t,n,e){n=Bi(n,t)?[n]:Rr(n);var r=-1,i=n.length;for(i||(t=W,i=1);++r<i;){var o=null==t?W:t[Qi(n[r])];o===W&&(r=i,o=e),t=ou(o)?o.call(t):o}return t}function ts(t,n,e){return null==t?t:$r(t,n,e)}function ns(t,n,e,r){return r="function"==typeof r?r:W,null==t?t:$r(t,n,e,r)}function es(t){return _(t,Yu(t))}function rs(t){return _(t,Gu(t))}function is(t,n,e){var r=tf(t)||Su(t);if(n=Mi(n,4),null==e)if(r||su(t)){var i=t.constructor;e=r?tf(t)?new i:[]:ou(i)?_e(Pi(t)):{}}else e={};return(r?o:Fe)(t,function(t,r,i){return n(e,t,r,i)}),e}function os(t,n){return null==t||Ar(t,n)}function as(t,n,e){return null==t?t:Er(t,n,Nr(e))}function us(t,n,e,r){return r="function"==typeof r?r:W,null==t?t:Er(t,n,Nr(e),r)}function ss(t){return t?k(t,Yu(t)):[]}function ls(t){return null==t?[]:k(t,Gu(t))}function cs(t,n,e){return e===W&&(e=n,n=W),e!==W&&(e=Ou(e),e=e===e?e:0),n!==W&&(n=Ou(n),n=n===n?n:0),we(Ou(t),n,e)}function fs(t,n,e){return n=Ou(n)||0,e===W?(e=n,n=0):e=Ou(e)||0,t=Ou(t),He(t,n,e)}function hs(t,n,e){if(e&&"boolean"!=typeof e&&Vi(t,n,e)&&(n=e=W),e===W&&("boolean"==typeof n?(e=n,n=W):"boolean"==typeof t&&(e=t,t=W)),t===W&&n===W?(t=0,n=1):(t=Ou(t)||0,n===W?(n=t,t=0):n=Ou(n)||0),t>n){var r=t;t=n,n=r}if(e||t%1||n%1){var i=zl();return Il(t+i*(n-t+ke("1e-"+((i+"").length-1))),n)}return gr(t,n)}function ps(t){return Mf(ju(t).toLowerCase())}function ds(t){return t=ju(t),t&&t.replace(Mn,T).replace(pe,"")}function vs(t,n,e){t=ju(t),n=Mr(n);var r=t.length;return e=e===W?r:we(Eu(e),0,r),e-=n.length,e>=0&&t.indexOf(n,e)==e}function gs(t){return t=ju(t),t&&rn.test(t)?t.replace(nn,L):t}function ms(t){return t=ju(t),t&&hn.test(t)?t.replace(fn,"\\$&"):t}function ys(t,n,e){t=ju(t),n=Eu(n);var r=n?z(t):0;if(!n||r>=n)return t;var i=(n-r)/2;return pi(Ll(i),e)+t+pi(Tl(i),e)}function $s(t,n,e){t=ju(t),n=Eu(n);var r=n?z(t):0;return n&&r<n?t+pi(n-r,e):t}function bs(t,n,e){t=ju(t),n=Eu(n);var r=n?z(t):0;return n&&r<n?pi(n-r,e)+t:t}function xs(t,n,e){return e||null==n?n=0:n&&(n=+n),t=ju(t).replace(pn,""),ql(t,n||(bn.test(t)?16:10))}function ws(t,n,e){return n=(e?Vi(t,n,e):n===W)?1:Eu(n),yr(ju(t),n)}function Cs(){var t=arguments,n=ju(t[0]);return t.length<3?n:Vl.call(n,t[1],t[2])}function Ss(t,n,e){return e&&"number"!=typeof e&&Vi(t,n,e)&&(n=e=W),(e=e===W?bt:e>>>0)?(t=ju(t),t&&("string"==typeof n||null!=n&&!$u(n))&&(n=Mr(n),""==n&&ge.test(t))?Dr(V(t),0,e):Ul.call(t,n,e)):[]}function _s(t,n,e){return t=ju(t),e=we(Eu(e),0,t.length),t.lastIndexOf(Mr(n),e)==e}function Ms(t,n,e){var r=En.templateSettings;e&&Vi(t,n,e)&&(n=W),t=ju(t),n=uf({},n,r,ue);var i,o,a=uf({},n.imports,r.imports,ue),u=Yu(a),s=k(a,u),l=0,c=n.interpolate||kn,f="__p += '",h=sl((n.escape||kn).source+"|"+c.source+"|"+(c===un?yn:kn).source+"|"+(n.evaluate||kn).source+"|$","g"),p="//# sourceURL="+("sourceURL"in n?n.sourceURL:"lodash.templateSources["+ ++$e+"]")+"\n";t.replace(h,function(n,e,r,a,u,s){return r||(r=a),f+=t.slice(l,s).replace(An,j),e&&(i=!0,f+="' +\n__e("+e+") +\n'"),u&&(o=!0,f+="';\n"+u+";\n__p += '"),r&&(f+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),l=s+n.length,n}),f+="';\n";var d=n.variable;d||(f="with (obj) {\n"+f+"\n}\n"),f=(o?f.replace(Jt,""):f).replace(Kt,"$1").replace(Qt,"$1;"),f="function("+(d||"obj")+") {\n"+(d?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+f+"return __p\n}";var v=kf(function(){return Function(u,p+"return "+f).apply(W,s)});if(v.source=f,ru(v))throw v;return v}function ks(t){return ju(t).toLowerCase()}function As(t){return ju(t).toUpperCase()}function Es(t,n,e){if(t=ju(t),t&&(e||n===W))return t.replace(pn,"");if(!t||!(n=Mr(n)))return t;var r=V(t),i=V(n),o=A(r,i),a=E(r,i)+1;return Dr(r,o,a).join("")}function Ps(t,n,e){if(t=ju(t),t&&(e||n===W))return t.replace(vn,"");if(!t||!(n=Mr(n)))return t;var r=V(t),i=E(r,V(n))+1;return Dr(r,0,i).join("")}function Os(t,n,e){if(t=ju(t),t&&(e||n===W))return t.replace(dn,"");if(!t||!(n=Mr(n)))return t;var r=V(t),i=A(r,V(n));return Dr(r,i).join("")}function Ts(t,n){var e=lt,r=ct;if(su(n)){var i="separator"in n?n.separator:i;e="length"in n?Eu(n.length):e,r="omission"in n?Mr(n.omission):r}t=ju(t);var o=t.length;if(ge.test(t)){var a=V(t);o=a.length}if(e>=o)return t;var u=e-z(r);if(u<1)return r;var s=a?Dr(a,0,u).join(""):t.slice(0,u);if(i===W)return s+r;if(a&&(u+=s.length-u),$u(i)){if(t.slice(u).search(i)){var l,c=s;for(i.global||(i=sl(i.source,ju($n.exec(i))+"g")),i.lastIndex=0;l=i.exec(c);)var f=l.index;s=s.slice(0,f===W?u:f)}}else if(t.indexOf(Mr(i),u)!=u){var h=s.lastIndexOf(i);h>-1&&(s=s.slice(0,h))}return s+r}function Ls(t){return t=ju(t),t&&en.test(t)?t.replace(tn,B):t}function js(t,n,e){return t=ju(t),n=e?W:n,n===W&&(n=me.test(t)?ve:gn),t.match(n)||[]}function Ns(t){var n=t?t.length:0,r=Mi();return t=n?f(t,function(t){if("function"!=typeof t[1])throw new ll(G);return[r(t[0]),t[1]]}):[],Ra(function(r){for(var i=-1;++i<n;){var o=t[i];if(e(o[0],this,r))return e(o[1],this,r)}})}function Rs(t){return Se(Ce(t,!0))}function Ds(t){return function(){return t}}function Fs(t){return t}function Is(t){return Qe("function"==typeof t?t:Ce(t,!0))}function qs(t){return ir(Ce(t,!0))}function zs(t,n){return or(t,Ce(n,!0))}function Vs(t,n,e){var r=Yu(n),i=qe(n,r);null!=e||su(n)&&(i.length||!r.length)||(e=n,n=t,t=this,i=qe(n,Yu(n)));var a=!(su(e)&&"chain"in e&&!e.chain),u=ou(t);return o(i,function(e){var r=n[e];t[e]=r,u&&(t.prototype[e]=function(){var n=this.__chain__;if(a||n){var e=t(this.__wrapped__),i=e.__actions__=Xr(this.__actions__);return i.push({func:r,args:arguments,thisArg:t}),e.__chain__=n,e}return r.apply(t,h([this.value()],arguments))})}),t}function Bs(){return Re._===this&&(Re._=yl),this}function Us(){}function Ws(t){return t=Eu(t),Ra(function(n){return sr(n,t)})}function Hs(t){return Bi(t)?hr(Qi(t)):pr(t)}function Ys(t){return function(n){return null==t?W:ze(t,n)}}function Gs(t,n){if(t=Eu(t),t<1||t>mt)return[];var e=bt,r=Il(t,bt);n=Mi(n),t-=bt;for(var i=S(r,n);++e<t;)n(e);return i}function Zs(t){return tf(t)?f(t,Qi):Cu(t)?[t]:Xr(yc(t))}function Xs(t){var n=++vl;return ju(t)+n}function Js(t){return t&&t.length?Te(t,Fs,Be):W}function Ks(t,n){return t&&t.length?Te(t,Mi(n),Be):W}function Qs(t){return b(t,Fs)}function tl(t,n){return b(t,Mi(n))}function nl(t){return t&&t.length?Te(t,Fs,er):W}function el(t,n){return t&&t.length?Te(t,Mi(n),er):W}function rl(t){return t&&t.length?C(t,Fs):0}function il(t,n){return t&&t.length?C(t,Mi(n)):0}P=P?De.defaults({},P,De.pick(Re,ye)):Re;var ol=P.Date,al=P.Error,ul=P.Math,sl=P.RegExp,ll=P.TypeError,cl=P.Array.prototype,fl=P.Object.prototype,hl=P.String.prototype,pl=P.Function.prototype.toString,dl=fl.hasOwnProperty,vl=0,gl=pl.call(Object),ml=fl.toString,yl=Re._,$l=sl("^"+pl.call(dl).replace(fn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),bl=Oe?P.Buffer:W,xl=P.Reflect,wl=P.Symbol,Cl=P.Uint8Array,Sl=P.clearTimeout,_l=xl?xl.enumerate:W,Ml=Object.getOwnPropertySymbols,kl="symbol"==typeof(kl=wl&&wl.iterator)?kl:W,Al=Object.create,El=fl.propertyIsEnumerable,Pl=P.setTimeout,Ol=cl.splice,Tl=ul.ceil,Ll=ul.floor,jl=Object.getPrototypeOf,Nl=P.isFinite,Rl=cl.join,Dl=Object.keys,Fl=ul.max,Il=ul.min,ql=P.parseInt,zl=ul.random,Vl=hl.replace,Bl=cl.reverse,Ul=hl.split,Wl=Ai(P,"DataView"),Hl=Ai(P,"Map"),Yl=Ai(P,"Promise"),Gl=Ai(P,"Set"),Zl=Ai(P,"WeakMap"),Xl=Ai(Object,"create"),Jl=Zl&&new Zl,Kl=!El.call({valueOf:1},"valueOf"),Ql={},tc=to(Wl),nc=to(Hl),ec=to(Yl),rc=to(Gl),ic=to(Zl),oc=wl?wl.prototype:W,ac=oc?oc.valueOf:W,uc=oc?oc.toString:W;En.templateSettings={escape:on,evaluate:an,interpolate:un,variable:"",imports:{_:En}},En.prototype=Pn.prototype,En.prototype.constructor=En,On.prototype=_e(Pn.prototype),On.prototype.constructor=On,Tn.prototype=_e(Pn.prototype),Tn.prototype.constructor=Tn,Rn.prototype=Xl?Xl(null):fl,zn.prototype.clear=Vn,zn.prototype["delete"]=Bn,zn.prototype.get=Un,zn.prototype.has=Wn,zn.prototype.set=Hn,Yn.prototype.push=Zn,Xn.prototype.clear=Jn,Xn.prototype["delete"]=Kn,Xn.prototype.get=Qn,Xn.prototype.has=te,Xn.prototype.set=ne;var sc=ni(Fe),lc=ni(Ie,!0),cc=ei(),fc=ei(!0);_l&&!El.call({valueOf:1},"valueOf")&&(nr=function(t){return D(_l(t))});var hc=Jl?function(t,n){return Jl.set(t,n),t}:Fs,pc=Gl&&1/q(new Gl([,-0]))[1]==gt?function(t){return new Gl(t)}:Us,dc=Jl?function(t){return Jl.get(t)}:Us,vc=hr("length");Ml||(Oi=function(){return[]});var gc=Ml?function(t){for(var n=[];t;)h(n,Oi(t)),t=Pi(t);return n}:Oi;(Wl&&Ti(new Wl(new ArrayBuffer(1)))!=zt||Hl&&Ti(new Hl)!=Pt||Yl&&Ti(Yl.resolve())!=Lt||Gl&&Ti(new Gl)!=Nt||Zl&&Ti(new Zl)!=Ft)&&(Ti=function(t){var n=ml.call(t),e=n==Tt?t.constructor:W,r=e?to(e):W;if(r)switch(r){case tc:return zt;case nc:return Pt;case ec:return Lt;case rc:return Nt;case ic:return Ft}return n});var mc=function(){var t=0,n=0;return function(e,r){var i=Bc(),o=ht-(i-n);if(n=i,o>0){if(++t>=ft)return e}else t=0;return hc(e,r)}}(),yc=La(function(t){var n=[];return ju(t).replace(cn,function(t,e,r,i){n.push(r?i.replace(mn,"$1"):e||t)}),n}),$c=Ra(function(t,n){return Xa(t)?Ee(t,Ne(n,1,Xa,!0)):[]}),bc=Ra(function(t,n){var e=xo(n);return Xa(e)&&(e=W),Xa(t)?Ee(t,Ne(n,1,Xa,!0),Mi(e)):[]}),xc=Ra(function(t,n){var e=xo(n);return Xa(e)&&(e=W),Xa(t)?Ee(t,Ne(n,1,Xa,!0),W,e):[]}),wc=Ra(function(t){var n=f(t,jr);return n.length&&n[0]===t[0]?Ye(n):[]}),Cc=Ra(function(t){var n=xo(t),e=f(t,jr);return n===xo(e)?n=W:e.pop(),e.length&&e[0]===t[0]?Ye(e,Mi(n)):[]}),Sc=Ra(function(t){var n=xo(t),e=f(t,jr);return n===xo(e)?n=W:e.pop(),e.length&&e[0]===t[0]?Ye(e,W,n):[]}),_c=Ra(So),Mc=Ra(function(t,n){n=Ne(n,1);var e=t?t.length:0,r=de(t,n);return vr(t,f(n,function(t){return zi(t,e)?+t:t}).sort(Hr)),r}),kc=Ra(function(t){return kr(Ne(t,1,Xa,!0))}),Ac=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),kr(Ne(t,1,Xa,!0),Mi(n))}),Ec=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),kr(Ne(t,1,Xa,!0),W,n)}),Pc=Ra(function(t,n){return Xa(t)?Ee(t,n):[]}),Oc=Ra(function(t){return Tr(s(t,Xa))}),Tc=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),Tr(s(t,Xa),Mi(n))}),Lc=Ra(function(t){var n=xo(t);return Xa(n)&&(n=W),Tr(s(t,Xa),W,n)}),jc=Ra(Ho),Nc=Ra(function(t){var n=t.length,e=n>1?t[n-1]:W;return e="function"==typeof e?(t.pop(),e):W,Yo(t,e)}),Rc=Ra(function(t){t=Ne(t,1);var n=t.length,e=n?t[0]:0,r=this.__wrapped__,i=function(n){return de(n,t)};return!(n>1||this.__actions__.length)&&r instanceof Tn&&zi(e)?(r=r.slice(e,+e+(n?1:0)),r.__actions__.push({func:Ko,args:[i],thisArg:W}),new On(r,this.__chain__).thru(function(t){return n&&!t.length&&t.push(W),t})):this.thru(i)}),Dc=Qr(function(t,n,e){dl.call(t,e)?++t[e]:t[e]=1}),Fc=Qr(function(t,n,e){dl.call(t,e)?t[e].push(n):t[e]=[n]}),Ic=Ra(function(t,n,r){var i=-1,o="function"==typeof n,a=Bi(n),u=Za(t)?Array(t.length):[];return sc(t,function(t){var s=o?n:a&&null!=t?t[n]:W;u[++i]=s?e(s,t,r):Ze(t,n,r)}),u}),qc=Qr(function(t,n,e){t[e]=n}),zc=Qr(function(t,n,e){t[e?0:1].push(n)},function(){return[[],[]]}),Vc=Ra(function(t,n){if(null==t)return[];var e=n.length;return e>1&&Vi(t,n[0],n[1])?n=[]:e>2&&Vi(n[0],n[1],n[2])&&(n=[n[0]]),n=1==n.length&&tf(n[0])?n[0]:Ne(n,1,qi),lr(t,n,[])}),Bc=ol.now,Uc=Ra(function(t,n,e){var r=J;if(e.length){var i=I(e,Ei(Uc));r|=et}return $i(t,r,n,e,i)}),Wc=Ra(function(t,n,e){var r=J|K;if(e.length){var i=I(e,Ei(Wc));r|=et}return $i(n,r,t,e,i)}),Hc=Ra(function(t,n){return Me(t,1,n)}),Yc=Ra(function(t,n,e){return Me(t,Ou(n)||0,e)});La.Cache=zn;var Gc=Ra(function(t,n){n=1==n.length&&tf(n[0])?f(n[0],M(Mi())):f(Ne(n,1,qi),M(Mi()));var r=n.length;return Ra(function(i){for(var o=-1,a=Il(i.length,r);++o<a;)i[o]=n[o].call(this,i[o]);return e(t,this,i)})}),Zc=Ra(function(t,n){var e=I(n,Ei(Zc));return $i(t,et,W,n,e)}),Xc=Ra(function(t,n){var e=I(n,Ei(Xc));return $i(t,rt,W,n,e)}),Jc=Ra(function(t,n){return $i(t,ot,W,W,W,Ne(n,1))}),Kc=gi(Be),Qc=gi(function(t,n){return t>=n}),tf=Array.isArray,nf=bl?function(t){return t instanceof bl}:Ds(!1),ef=gi(er),rf=gi(function(t,n){return t<=n}),of=ti(function(t,n){if(Kl||Hi(n)||Za(n))return void Jr(n,Yu(n),t);for(var e in n)dl.call(n,e)&&le(t,e,n[e])}),af=ti(function(t,n){if(Kl||Hi(n)||Za(n))return void Jr(n,Gu(n),t);for(var e in n)le(t,e,n[e])}),uf=ti(function(t,n,e,r){Jr(n,Gu(n),t,r)}),sf=ti(function(t,n,e,r){Jr(n,Yu(n),t,r)}),lf=Ra(function(t,n){return de(t,Ne(n,1))}),cf=Ra(function(t){return t.push(W,ue),e(uf,W,t)}),ff=Ra(function(t){return t.push(W,Xi),e(gf,W,t)}),hf=ci(function(t,n,e){t[n]=e},Ds(Fs)),pf=ci(function(t,n,e){dl.call(t,n)?t[n].push(e):t[n]=[e]},Mi),df=Ra(Ze),vf=ti(function(t,n,e){ar(t,n,e)}),gf=ti(function(t,n,e,r){ar(t,n,e,r)}),mf=Ra(function(t,n){return null==t?{}:(n=f(Ne(n,1),Qi),cr(t,Ee(Si(t),n)))}),yf=Ra(function(t,n){return null==t?{}:cr(t,f(Ne(n,1),Qi))}),$f=oi(function(t,n,e){return n=n.toLowerCase(),t+(e?ps(n):n)}),bf=oi(function(t,n,e){return t+(e?"-":"")+n.toLowerCase()}),xf=oi(function(t,n,e){return t+(e?" ":"")+n.toLowerCase()}),wf=ii("toLowerCase"),Cf=oi(function(t,n,e){return t+(e?"_":"")+n.toLowerCase()}),Sf=oi(function(t,n,e){return t+(e?" ":"")+Mf(n)}),_f=oi(function(t,n,e){return t+(e?" ":"")+n.toUpperCase()}),Mf=ii("toUpperCase"),kf=Ra(function(t,n){try{return e(t,W,n)}catch(r){return ru(r)?r:new al(r)}}),Af=Ra(function(t,n){return o(Ne(n,1),function(n){n=Qi(n),t[n]=Uc(t[n],t)}),t}),Ef=si(),Pf=si(!0),Of=Ra(function(t,n){return function(e){return Ze(e,t,n)}}),Tf=Ra(function(t,n){return function(e){return Ze(t,e,n)}}),Lf=hi(f),jf=hi(u),Nf=hi(v),Rf=vi(),Df=vi(!0),Ff=fi(function(t,n){return t+n}),If=yi("ceil"),qf=fi(function(t,n){return t/n}),zf=yi("floor"),Vf=fi(function(t,n){return t*n}),Bf=yi("round"),Uf=fi(function(t,n){return t-n});return En.after=Ma,En.ary=ka,En.assign=of,En.assignIn=af,En.assignInWith=uf,En.assignWith=sf,En.at=lf,En.before=Aa,En.bind=Uc,En.bindAll=Af,En.bindKey=Wc,En.castArray=za,En.chain=Xo,En.chunk=eo,En.compact=ro,En.concat=io,En.cond=Ns,En.conforms=Rs,En.constant=Ds,En.countBy=Dc,En.create=Nu,En.curry=Ea,En.curryRight=Pa,En.debounce=Oa,En.defaults=cf,En.defaultsDeep=ff,En.defer=Hc,En.delay=Yc,En.difference=$c,En.differenceBy=bc,En.differenceWith=xc,En.drop=oo,En.dropRight=ao,En.dropRightWhile=uo,En.dropWhile=so,En.fill=lo,En.filter=ua,En.flatMap=ca,En.flatMapDeep=fa,En.flatMapDepth=ha,En.flatten=ho,En.flattenDeep=po,En.flattenDepth=vo,En.flip=Ta,En.flow=Ef,En.flowRight=Pf,En.fromPairs=go,En.functions=Vu,En.functionsIn=Bu,En.groupBy=Fc,En.initial=$o,En.intersection=wc,En.intersectionBy=Cc,En.intersectionWith=Sc,En.invert=hf,En.invertBy=pf,En.invokeMap=Ic,En.iteratee=Is,En.keyBy=qc,En.keys=Yu,En.keysIn=Gu,En.map=ga,En.mapKeys=Zu,En.mapValues=Xu,En.matches=qs,En.matchesProperty=zs,En.memoize=La,En.merge=vf,En.mergeWith=gf,En.method=Of,En.methodOf=Tf,En.mixin=Vs,En.negate=ja,En.nthArg=Ws,En.omit=mf,En.omitBy=Ju,En.once=Na,En.orderBy=ma,En.over=Lf,En.overArgs=Gc,En.overEvery=jf,En.overSome=Nf,En.partial=Zc,En.partialRight=Xc,En.partition=zc,En.pick=yf,En.pickBy=Ku,En.property=Hs,En.propertyOf=Ys,En.pull=_c,En.pullAll=So,En.pullAllBy=_o,En.pullAllWith=Mo,En.pullAt=Mc,En.range=Rf,En.rangeRight=Df,En.rearg=Jc,En.reject=ba,En.remove=ko,En.rest=Ra,En.reverse=Ao,En.sampleSize=wa,En.set=ts,En.setWith=ns,En.shuffle=Ca,En.slice=Eo,En.sortBy=Vc,En.sortedUniq=Ro,En.sortedUniqBy=Do,En.split=Ss,En.spread=Da,En.tail=Fo,En.take=Io,En.takeRight=qo,En.takeRightWhile=zo,En.takeWhile=Vo,En.tap=Jo,En.throttle=Fa,En.thru=Ko,En.toArray=Au,En.toPairs=es,En.toPairsIn=rs,En.toPath=Zs,En.toPlainObject=Tu,En.transform=is,En.unary=Ia,En.union=kc,En.unionBy=Ac,En.unionWith=Ec,En.uniq=Bo,En.uniqBy=Uo,En.uniqWith=Wo,En.unset=os,En.unzip=Ho,En.unzipWith=Yo,En.update=as,En.updateWith=us,En.values=ss,En.valuesIn=ls,En.without=Pc,En.words=js,En.wrap=qa,En.xor=Oc,En.xorBy=Tc,En.xorWith=Lc,En.zip=jc,En.zipObject=Go,En.zipObjectDeep=Zo,En.zipWith=Nc,En.entries=es,En.entriesIn=rs,En.extend=af,En.extendWith=uf,Vs(En,En),En.add=Ff,En.attempt=kf,En.camelCase=$f,En.capitalize=ps,En.ceil=If,En.clamp=cs,En.clone=Va,En.cloneDeep=Ua,En.cloneDeepWith=Wa,En.cloneWith=Ba,En.deburr=ds,En.divide=qf,En.endsWith=vs,En.eq=Ha,En.escape=gs,En.escapeRegExp=ms,En.every=aa,En.find=sa,En.findIndex=co,En.findKey=Ru,En.findLast=la,En.findLastIndex=fo,En.findLastKey=Du,En.floor=zf,En.forEach=pa,En.forEachRight=da,En.forIn=Fu,En.forInRight=Iu,En.forOwn=qu,En.forOwnRight=zu,En.get=Uu,En.gt=Kc,En.gte=Qc,En.has=Wu,En.hasIn=Hu,En.head=mo,En.identity=Fs,En.includes=va,En.indexOf=yo,En.inRange=fs,En.invoke=df,En.isArguments=Ya,En.isArray=tf,En.isArrayBuffer=Ga,En.isArrayLike=Za,En.isArrayLikeObject=Xa,En.isBoolean=Ja,En.isBuffer=nf,En.isDate=Ka,En.isElement=Qa,En.isEmpty=tu,En.isEqual=nu,En.isEqualWith=eu,En.isError=ru,En.isFinite=iu,En.isFunction=ou,En.isInteger=au,En.isLength=uu,En.isMap=cu,En.isMatch=fu,En.isMatchWith=hu,En.isNaN=pu,En.isNative=du,En.isNil=gu,En.isNull=vu,En.isNumber=mu,En.isObject=su,En.isObjectLike=lu,En.isPlainObject=yu,En.isRegExp=$u,En.isSafeInteger=bu,En.isSet=xu,En.isString=wu,En.isSymbol=Cu,En.isTypedArray=Su,En.isUndefined=_u,En.isWeakMap=Mu,En.isWeakSet=ku,En.join=bo,En.kebabCase=bf,En.last=xo,En.lastIndexOf=wo,En.lowerCase=xf,En.lowerFirst=wf,En.lt=ef,En.lte=rf,En.max=Js,En.maxBy=Ks,En.mean=Qs,En.meanBy=tl,En.min=nl,En.minBy=el,En.multiply=Vf,En.nth=Co,En.noConflict=Bs,En.noop=Us,En.now=Bc,En.pad=ys,En.padEnd=$s,En.padStart=bs,En.parseInt=xs,En.random=hs,En.reduce=ya,En.reduceRight=$a,
+En.repeat=ws,En.replace=Cs,En.result=Qu,En.round=Bf,En.runInContext=U,En.sample=xa,En.size=Sa,En.snakeCase=Cf,En.some=_a,En.sortedIndex=Po,En.sortedIndexBy=Oo,En.sortedIndexOf=To,En.sortedLastIndex=Lo,En.sortedLastIndexBy=jo,En.sortedLastIndexOf=No,En.startCase=Sf,En.startsWith=_s,En.subtract=Uf,En.sum=rl,En.sumBy=il,En.template=Ms,En.times=Gs,En.toInteger=Eu,En.toLength=Pu,En.toLower=ks,En.toNumber=Ou,En.toSafeInteger=Lu,En.toString=ju,En.toUpper=As,En.trim=Es,En.trimEnd=Ps,En.trimStart=Os,En.truncate=Ts,En.unescape=Ls,En.uniqueId=Xs,En.upperCase=_f,En.upperFirst=Mf,En.each=pa,En.eachRight=da,En.first=mo,Vs(En,function(){var t={};return Fe(En,function(n,e){dl.call(En.prototype,e)||(t[e]=n)}),t}(),{chain:!1}),En.VERSION=H,o(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){En[t].placeholder=En}),o(["drop","take"],function(t,n){Tn.prototype[t]=function(e){var r=this.__filtered__;if(r&&!n)return new Tn(this);e=e===W?1:Fl(Eu(e),0);var i=this.clone();return r?i.__takeCount__=Il(e,i.__takeCount__):i.__views__.push({size:Il(e,bt),type:t+(i.__dir__<0?"Right":"")}),i},Tn.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}}),o(["filter","map","takeWhile"],function(t,n){var e=n+1,r=e==pt||e==vt;Tn.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({iteratee:Mi(t,3),type:e}),n.__filtered__=n.__filtered__||r,n}}),o(["head","last"],function(t,n){var e="take"+(n?"Right":"");Tn.prototype[t]=function(){return this[e](1).value()[0]}}),o(["initial","tail"],function(t,n){var e="drop"+(n?"":"Right");Tn.prototype[t]=function(){return this.__filtered__?new Tn(this):this[e](1)}}),Tn.prototype.compact=function(){return this.filter(Fs)},Tn.prototype.find=function(t){return this.filter(t).head()},Tn.prototype.findLast=function(t){return this.reverse().find(t)},Tn.prototype.invokeMap=Ra(function(t,n){return"function"==typeof t?new Tn(this):this.map(function(e){return Ze(e,t,n)})}),Tn.prototype.reject=function(t){return t=Mi(t,3),this.filter(function(n){return!t(n)})},Tn.prototype.slice=function(t,n){t=Eu(t);var e=this;return e.__filtered__&&(t>0||n<0)?new Tn(e):(t<0?e=e.takeRight(-t):t&&(e=e.drop(t)),n!==W&&(n=Eu(n),e=n<0?e.dropRight(-n):e.take(n-t)),e)},Tn.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Tn.prototype.toArray=function(){return this.take(bt)},Fe(Tn.prototype,function(t,n){var e=/^(?:filter|find|map|reject)|While$/.test(n),r=/^(?:head|last)$/.test(n),i=En[r?"take"+("last"==n?"Right":""):n],o=r||/^find/.test(n);i&&(En.prototype[n]=function(){var n=this.__wrapped__,a=r?[1]:arguments,u=n instanceof Tn,s=a[0],l=u||tf(n),c=function(t){var n=i.apply(En,h([t],a));return r&&f?n[0]:n};l&&e&&"function"==typeof s&&1!=s.length&&(u=l=!1);var f=this.__chain__,p=!!this.__actions__.length,d=o&&!f,v=u&&!p;if(!o&&l){n=v?n:new Tn(this);var g=t.apply(n,a);return g.__actions__.push({func:Ko,args:[c],thisArg:W}),new On(g,f)}return d&&v?t.apply(this,a):(g=this.thru(c),d?r?g.value()[0]:g.value():g)})}),o(["pop","push","shift","sort","splice","unshift"],function(t){var n=cl[t],e=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);En.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return n.apply(tf(i)?i:[],t)}return this[e](function(e){return n.apply(tf(e)?e:[],t)})}}),Fe(Tn.prototype,function(t,n){var e=En[n];if(e){var r=e.name+"",i=Ql[r]||(Ql[r]=[]);i.push({name:n,func:e})}}),Ql[li(W,K).name]=[{name:"wrapper",func:W}],Tn.prototype.clone=Ln,Tn.prototype.reverse=jn,Tn.prototype.value=Nn,En.prototype.at=Rc,En.prototype.chain=Qo,En.prototype.commit=ta,En.prototype.next=na,En.prototype.plant=ra,En.prototype.reverse=ia,En.prototype.toJSON=En.prototype.valueOf=En.prototype.value=oa,kl&&(En.prototype[kl]=ea),En}var W,H="4.11.2",Y=200,G="Expected a function",Z="__lodash_hash_undefined__",X="__lodash_placeholder__",J=1,K=2,Q=4,tt=8,nt=16,et=32,rt=64,it=128,ot=256,at=512,ut=1,st=2,lt=30,ct="...",ft=150,ht=16,pt=1,dt=2,vt=3,gt=1/0,mt=9007199254740991,yt=1.7976931348623157e308,$t=NaN,bt=4294967295,xt=bt-1,wt=bt>>>1,Ct="[object Arguments]",St="[object Array]",_t="[object Boolean]",Mt="[object Date]",kt="[object Error]",At="[object Function]",Et="[object GeneratorFunction]",Pt="[object Map]",Ot="[object Number]",Tt="[object Object]",Lt="[object Promise]",jt="[object RegExp]",Nt="[object Set]",Rt="[object String]",Dt="[object Symbol]",Ft="[object WeakMap]",It="[object WeakSet]",qt="[object ArrayBuffer]",zt="[object DataView]",Vt="[object Float32Array]",Bt="[object Float64Array]",Ut="[object Int8Array]",Wt="[object Int16Array]",Ht="[object Int32Array]",Yt="[object Uint8Array]",Gt="[object Uint8ClampedArray]",Zt="[object Uint16Array]",Xt="[object Uint32Array]",Jt=/\b__p \+= '';/g,Kt=/\b(__p \+=) '' \+/g,Qt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,tn=/&(?:amp|lt|gt|quot|#39|#96);/g,nn=/[&<>"'`]/g,en=RegExp(tn.source),rn=RegExp(nn.source),on=/<%-([\s\S]+?)%>/g,an=/<%([\s\S]+?)%>/g,un=/<%=([\s\S]+?)%>/g,sn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ln=/^\w*$/,cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,fn=/[\\^$.*+?()[\]{}|]/g,hn=RegExp(fn.source),pn=/^\s+|\s+$/g,dn=/^\s+/,vn=/\s+$/,gn=/[a-zA-Z0-9]+/g,mn=/\\(\\)?/g,yn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,$n=/\w*$/,bn=/^0x/i,xn=/^[-+]0x[0-9a-f]+$/i,wn=/^0b[01]+$/i,Cn=/^\[object .+?Constructor\]$/,Sn=/^0o[0-7]+$/i,_n=/^(?:0|[1-9]\d*)$/,Mn=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,kn=/($^)/,An=/['\n\r\u2028\u2029\\]/g,En="\\ud800-\\udfff",Pn="\\u0300-\\u036f\\ufe20-\\ufe23",On="\\u20d0-\\u20f0",Tn="\\u2700-\\u27bf",Ln="a-z\\xdf-\\xf6\\xf8-\\xff",jn="\\xac\\xb1\\xd7\\xf7",Nn="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Rn="\\u2000-\\u206f",Dn=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Fn="A-Z\\xc0-\\xd6\\xd8-\\xde",In="\\ufe0e\\ufe0f",qn=jn+Nn+Rn+Dn,zn="['’]",Vn="["+En+"]",Bn="["+qn+"]",Un="["+Pn+On+"]",Wn="\\d+",Hn="["+Tn+"]",Yn="["+Ln+"]",Gn="[^"+En+qn+Wn+Tn+Ln+Fn+"]",Zn="\\ud83c[\\udffb-\\udfff]",Xn="(?:"+Un+"|"+Zn+")",Jn="[^"+En+"]",Kn="(?:\\ud83c[\\udde6-\\uddff]){2}",Qn="[\\ud800-\\udbff][\\udc00-\\udfff]",te="["+Fn+"]",ne="\\u200d",ee="(?:"+Yn+"|"+Gn+")",re="(?:"+te+"|"+Gn+")",ie="(?:"+zn+"(?:d|ll|m|re|s|t|ve))?",oe="(?:"+zn+"(?:D|LL|M|RE|S|T|VE))?",ae=Xn+"?",ue="["+In+"]?",se="(?:"+ne+"(?:"+[Jn,Kn,Qn].join("|")+")"+ue+ae+")*",le=ue+ae+se,ce="(?:"+[Hn,Kn,Qn].join("|")+")"+le,fe="(?:"+[Jn+Un+"?",Un,Kn,Qn,Vn].join("|")+")",he=RegExp(zn,"g"),pe=RegExp(Un,"g"),de=RegExp(Zn+"(?="+Zn+")|"+fe+le,"g"),ve=RegExp([te+"?"+Yn+"+"+ie+"(?="+[Bn,te,"$"].join("|")+")",re+"+"+oe+"(?="+[Bn,te+ee,"$"].join("|")+")",te+"?"+ee+"+"+ie,te+"+"+oe,Wn,ce].join("|"),"g"),ge=RegExp("["+ne+En+Pn+On+In+"]"),me=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ye=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","Reflect","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],$e=-1,be={};be[Vt]=be[Bt]=be[Ut]=be[Wt]=be[Ht]=be[Yt]=be[Gt]=be[Zt]=be[Xt]=!0,be[Ct]=be[St]=be[qt]=be[_t]=be[zt]=be[Mt]=be[kt]=be[At]=be[Pt]=be[Ot]=be[Tt]=be[jt]=be[Nt]=be[Rt]=be[Ft]=!1;var xe={};xe[Ct]=xe[St]=xe[qt]=xe[zt]=xe[_t]=xe[Mt]=xe[Vt]=xe[Bt]=xe[Ut]=xe[Wt]=xe[Ht]=xe[Pt]=xe[Ot]=xe[Tt]=xe[jt]=xe[Nt]=xe[Rt]=xe[Dt]=xe[Yt]=xe[Gt]=xe[Zt]=xe[Xt]=!0,xe[kt]=xe[At]=xe[Ft]=!1;var we={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss"},Ce={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},Se={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'","&#96;":"`"},_e={"function":!0,object:!0},Me={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ke=parseFloat,Ae=parseInt,Ee=_e[typeof exports]&&exports&&!exports.nodeType?exports:W,Pe=_e[typeof module]&&module&&!module.nodeType?module:W,Oe=Pe&&Pe.exports===Ee?Ee:W,Te=P(Ee&&Pe&&"object"==typeof global&&global),Le=P(_e[typeof self]&&self),je=P(_e[typeof window]&&window),Ne=P(_e[typeof this]&&this),Re=Te||je!==(Ne&&Ne.window)&&je||Le||Ne||Function("return this")(),De=U();(je||Le||{})._=De,"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return De}):Ee&&Pe?(Oe&&((Pe.exports=De)._=De),Ee._=De):Re._=De}.call(this),function(){"use strict";var t=this,n=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var n=function(t,n){return t["offset"+n]?t["offset"+n]:document.defaultView.getComputedStyle(t).getPropertyValue(n)};this.width=n(t.canvas,"Width")||t.canvas.width,this.height=n(t.canvas,"Height")||t.canvas.height;return this.aspectRatio=this.width/this.height,r.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipTitleTemplate:"<%= label%>",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= datasetLabel %>: <%= value %>",multiTooltipKeyBackground:"#fff",segmentColorDefault:["#A6CEE3","#1F78B4","#B2DF8A","#33A02C","#FB9A99","#E31A1C","#FDBF6F","#FF7F00","#CAB2D6","#6A3D9A","#B4B482","#B15928"],segmentHighlightColorDefaults:["#CEF6FF","#47A0DC","#DAFFB2","#5BC854","#FFC2C1","#FF4244","#FFE797","#FFA728","#F2DAFE","#9265C2","#DCDCAA","#D98150"],onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var r=e.helpers={},i=r.each=function(t,n,e){var r=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var i;for(i=0;i<t.length;i++)n.apply(e,[t[i],i].concat(r))}else for(var o in t)n.apply(e,[t[o],o].concat(r))},o=r.clone=function(t){var n={};return i(t,function(e,r){t.hasOwnProperty(r)&&(n[r]=e)}),n},a=r.extend=function(t){return i(Array.prototype.slice.call(arguments,1),function(n){i(n,function(e,r){n.hasOwnProperty(r)&&(t[r]=e)})}),t},u=r.merge=function(t,n){var e=Array.prototype.slice.call(arguments,0);return e.unshift({}),a.apply(null,e)},s=r.indexOf=function(t,n){if(Array.prototype.indexOf)return t.indexOf(n);for(var e=0;e<t.length;e++)if(t[e]===n)return e;return-1},l=(r.where=function(t,n){var e=[];return r.each(t,function(t){n(t)&&e.push(t)}),e},r.findNextWhere=function(t,n,e){e||(e=-1);for(var r=e+1;r<t.length;r++){var i=t[r];if(n(i))return i}},r.findPreviousWhere=function(t,n,e){e||(e=t.length);for(var r=e-1;r>=0;r--){var i=t[r];if(n(i))return i}},r.inherits=function(t){var n=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return n.apply(this,arguments)},r=function(){this.constructor=e};return r.prototype=n.prototype,e.prototype=new r,e.extend=l,t&&a(e.prototype,t),e.__super__=n.prototype,e}),c=r.noop=function(){},f=r.uid=function(){var t=0;return function(){return"chart-"+t++}}(),h=r.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=r.amd="function"==typeof define&&define.amd,d=r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},v=r.max=function(t){return Math.max.apply(Math,t)},g=r.min=function(t){return Math.min.apply(Math,t)},m=(r.cap=function(t,n,e){if(d(n)){if(t>n)return n}else if(d(e)&&t<e)return e;return t},r.getDecimalPlaces=function(t){if(t%1!==0&&d(t)){var n=t.toString();if(n.indexOf("e-")<0)return n.split(".")[1].length;if(n.indexOf(".")<0)return parseInt(n.split("e-")[1]);var e=n.split(".")[1].split("e-");return e[0].length+parseInt(e[1])}return 0}),y=r.radians=function(t){return t*(Math.PI/180)},$=(r.getAngleFromPoint=function(t,n){var e=n.x-t.x,r=n.y-t.y,i=Math.sqrt(e*e+r*r),o=2*Math.PI+Math.atan2(r,e);return e<0&&r<0&&(o+=2*Math.PI),{angle:o,distance:i}},r.aliasPixel=function(t){return t%2===0?0:.5}),b=(r.splineCurve=function(t,n,e,r){var i=Math.sqrt(Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2)),a=r*i/(i+o),u=r*o/(i+o);return{inner:{x:n.x-a*(e.x-t.x),y:n.y-a*(e.y-t.y)},outer:{x:n.x+u*(e.x-t.x),y:n.y+u*(e.y-t.y)}}},r.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),x=(r.calculateScaleRange=function(t,n,e,r,o){var a=2,u=Math.floor(n/(1.5*e)),s=a>=u,l=[];i(t,function(t){null==t||l.push(t)});var c=g(l),f=v(l);f===c&&(f+=.5,c>=.5&&!r?c-=.5:f+=.5);for(var h=Math.abs(f-c),p=b(h),d=Math.ceil(f/(1*Math.pow(10,p)))*Math.pow(10,p),m=r?0:Math.floor(c/(1*Math.pow(10,p)))*Math.pow(10,p),y=d-m,$=Math.pow(10,p),x=Math.round(y/$);(x>u||2*x<u)&&!s;)if(x>u)$*=2,x=Math.round(y/$),x%1!==0&&(s=!0);else if(o&&p>=0){if($/2%1!==0)break;$/=2,x=Math.round(y/$)}else $/=2,x=Math.round(y/$);return s&&(x=a,$=y/x),{steps:x,stepValue:$,min:m,max:m+x*$}},r.template=function(t,n){function e(t,n){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):r[t]=r[t];return n?e(n):e}if(t instanceof Function)return t(n);var r={};return e(t,n)}),w=(r.generateLabels=function(t,n,e,r){var o=new Array(n);return t&&i(o,function(n,i){o[i]=x(t,{value:e+r*(i+1)})}),o},r.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),-(r*Math.pow(2,10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)))},easeOutElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),r*Math.pow(2,-10*t)*Math.sin((1*t-n)*(2*Math.PI)/e)+1)},easeInOutElastic:function(t){var n=1.70158,e=0,r=1;return 0===t?0:2==(t/=.5)?1:(e||(e=1*(.3*1.5)),r<Math.abs(1)?(r=1,n=e/4):n=e/(2*Math.PI)*Math.asin(1/r),t<1?-.5*(r*Math.pow(2,10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)):r*Math.pow(2,-10*(t-=1))*Math.sin((1*t-n)*(2*Math.PI)/e)*.5+1)},easeInBack:function(t){var n=1.70158;return 1*(t/=1)*t*((n+1)*t-n)},easeOutBack:function(t){var n=1.70158;return 1*((t=t/1-1)*t*((n+1)*t+n)+1)},easeInOutBack:function(t){var n=1.70158;return(t/=.5)<1?.5*(t*t*(((n*=1.525)+1)*t-n)):.5*((t-=2)*t*(((n*=1.525)+1)*t+n)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):t<2/2.75?1*(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return t<.5?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),C=r.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),S=(r.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),r.animationLoop=function(t,n,e,r,i,o){var a=0,u=w[e]||w.linear,s=function(){a++;var e=a/n,l=u(e);t.call(o,l,e,a),r.call(o,l,e),a<n?o.animationFrame=C(s):i.apply(o)};C(s)},r.getRelativePosition=function(t){var n,e,r=t.originalEvent||t,i=t.currentTarget||t.srcElement,o=i.getBoundingClientRect();return r.touches?(n=r.touches[0].clientX-o.left,e=r.touches[0].clientY-o.top):(n=r.clientX-o.left,e=r.clientY-o.top),{x:n,y:e}},r.addEvent=function(t,n,e){t.addEventListener?t.addEventListener(n,e):t.attachEvent?t.attachEvent("on"+n,e):t["on"+n]=e}),_=r.removeEvent=function(t,n,e){t.removeEventListener?t.removeEventListener(n,e,!1):t.detachEvent?t.detachEvent("on"+n,e):t["on"+n]=c},M=(r.bindEvents=function(t,n,e){t.events||(t.events={}),i(n,function(n){t.events[n]=function(){e.apply(t,arguments)},S(t.chart.canvas,n,t.events[n])})},r.unbindEvents=function(t,n){i(n,function(n,e){_(t.chart.canvas,e,n)})}),k=r.getMaximumWidth=function(t){var n=t.parentNode,e=parseInt(E(n,"padding-left"))+parseInt(E(n,"padding-right"));return n?n.clientWidth-e:0},A=r.getMaximumHeight=function(t){var n=t.parentNode,e=parseInt(E(n,"padding-bottom"))+parseInt(E(n,"padding-top"));return n?n.clientHeight-e:0},E=r.getStyle=function(t,n){return t.currentStyle?t.currentStyle[n]:document.defaultView.getComputedStyle(t,null).getPropertyValue(n)},P=(r.getMaximumSize=r.getMaximumWidth,r.retinaScale=function(t){var n=t.ctx,e=t.canvas.width,r=t.canvas.height;window.devicePixelRatio&&(n.canvas.style.width=e+"px",n.canvas.style.height=r+"px",n.canvas.height=r*window.devicePixelRatio,n.canvas.width=e*window.devicePixelRatio,n.scale(window.devicePixelRatio,window.devicePixelRatio))}),O=r.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},T=r.fontString=function(t,n,e){return n+" "+t+"px "+e},L=r.longestText=function(t,n,e){t.font=n;var r=0;return i(e,function(n){var e=t.measureText(n).width;r=e>r?e:r}),r},j=r.drawRoundedRectangle=function(t,n,e,r,i,o){t.beginPath(),t.moveTo(n+o,e),t.lineTo(n+r-o,e),t.quadraticCurveTo(n+r,e,n+r,e+o),t.lineTo(n+r,e+i-o),t.quadraticCurveTo(n+r,e+i,n+r-o,e+i),t.lineTo(n+o,e+i),t.quadraticCurveTo(n,e+i,n,e+i-o),t.lineTo(n,e+o),t.quadraticCurveTo(n,e,n+o,e),t.closePath()};e.instances={},e.Type=function(t,n,r){this.options=n,this.chart=r,this.id=f(),e.instances[this.id]=this,n.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return O(this.chart),this},stop:function(){return e.animationService.cancelAnimation(this),this},resize:function(t){this.stop();var n=this.chart.canvas,e=k(this.chart.canvas),r=this.options.maintainAspectRatio?e/this.chart.aspectRatio:A(this.chart.canvas);return n.width=this.chart.width=e,n.height=this.chart.height=r,P(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){if(t&&this.reflow(),this.options.animation&&!t){var n=new e.Animation;n.numSteps=this.options.animationSteps,n.easing=this.options.animationEasing,n.render=function(t,n){var e=r.easingEffects[n.easing],i=n.currentStep/n.numSteps,o=e(i);t.draw(o,i,n.currentStep)},n.onAnimationProgress=this.options.onAnimationProgress,n.onAnimationComplete=this.options.onAnimationComplete,e.animationService.addAnimation(this,n)}else this.draw(),this.options.onAnimationComplete.call(this);return this},generateLegend:function(){return r.template(this.options.legendTemplate,this)},destroy:function(){this.stop(),this.clear(),M(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,n){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var n=!1;return t.length!==this.activeElements.length?n=!0:(i(t,function(t,e){t!==this.activeElements[e]&&(n=!0)},this),n)}.call(this,t);if(o||n){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,u,l=this.datasets.length-1;l>=0&&(a=this.datasets[l].points||this.datasets[l].bars||this.datasets[l].segments,u=s(a,t[0]),u===-1);l--);var c=[],f=[],h=function(t){var n,e,i,o,a,s=[],l=[],h=[];return r.each(this.datasets,function(t){n=t.points||t.bars||t.segments,n[u]&&n[u].hasValue()&&s.push(n[u])}),r.each(s,function(t){l.push(t.x),h.push(t.y),c.push(r.template(this.options.multiTooltipTemplate,t)),f.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),a=g(h),i=v(h),o=g(l),e=v(l),{x:o>this.chart.width/2?o:e,y:(a+i)/2}}.call(this,u);new e.MultiTooltip({x:h.x,y:h.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:f,legendColorBackground:this.options.multiTooltipKeyBackground,title:x(this.options.tooltipTitleTemplate,t[0]),chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else i(t,function(t){var n=t.tooltipPosition();new e.Tooltip({x:Math.round(n.x),y:Math.round(n.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:x(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var n=this,r=function(){return n.apply(this,arguments)};if(r.prototype=o(n.prototype),a(r.prototype,t),r.extend=e.Type.extend,t.name||n.prototype.name){var i=t.name||n.prototype.name,s=e.defaults[n.prototype.name]?o(e.defaults[n.prototype.name]):{};e.defaults[i]=a(s,t.defaults),e.types[i]=r,e.prototype[i]=function(t,n){var o=u(e.defaults.global,e.defaults[i],n||{});return new r(t,o,this)}}else h("Name not provided for this chart, so it hasn't been registered");return n},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?i(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return i(t,function(t,n){this._saved[n]=this[n],this[n]=t},this),this},transition:function(t,n){return i(t,function(t,e){this[e]=(t-this._saved[e])*n+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return d(this.value)}}),e.Element.extend=l,e.Point=e.Element.extend({display:!0,inRange:function(t,n){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(n-this.y,2)<Math.pow(e,2)},draw:function(){if(this.display){var t=this.ctx;t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.closePath(),t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.fillStyle=this.fillColor,t.fill(),t.stroke()}}}),e.Arc=e.Element.extend({inRange:function(t,n){var e=r.getAngleFromPoint(this,{x:t,y:n}),i=e.angle%(2*Math.PI),o=(2*Math.PI+this.startAngle)%(2*Math.PI),a=(2*Math.PI+this.endAngle)%(2*Math.PI)||360,u=a<o?i<=a||i>=o:i>=o&&i<=a,s=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return u&&s},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,n=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*n,y:this.y+Math.sin(t)*n}},draw:function(t){var n=this.ctx;n.beginPath(),n.arc(this.x,this.y,this.outerRadius<0?0:this.outerRadius,this.startAngle,this.endAngle),n.arc(this.x,this.y,this.innerRadius<0?0:this.innerRadius,this.endAngle,this.startAngle,!0),n.closePath(),n.strokeStyle=this.strokeColor,n.lineWidth=this.strokeWidth,n.fillStyle=this.fillColor,n.fill(),n.lineJoin="bevel",this.showStroke&&n.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,n=this.width/2,e=this.x-n,r=this.x+n,i=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,r-=o,i+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,i),t.lineTo(r,i),t.lineTo(r,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,n){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&n>=this.y&&n<=this.base}}),e.Animation=e.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var n=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,r=this.fontSize+2*this.yPadding,i=r+this.caretHeight+n;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-i<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-i;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-n),t.lineTo(this.x+this.caretHeight,this.y-(n+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(n+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+n+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+n),t.lineTo(this.x+this.caretHeight,this.y+n+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+n+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}j(t,o,a,e,r,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+r/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=T(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.titleHeight=this.title?1.5*this.titleFontSize:0,this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+this.titleHeight,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,n=L(this.ctx,this.font,this.labels)+this.fontSize+3,e=v([n,t]);this.width=e+2*this.xPadding;var r=this.height/2;this.y-r<0?this.y=r:this.y+r>this.chart.height&&(this.y=this.chart.height-r),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var n=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?n+this.titleHeight/3:n+(1.5*this.fontSize*e+this.fontSize/2)+this.titleHeight},draw:function(){if(this.custom)this.custom(this);else{j(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,r.each(this.labels,function(n,e){t.fillStyle=this.textColor,t.fillText(n,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=m(this.stepValue),n=0;n<=this.steps;n++)this.yLabels.push(x(this.templateString,{value:(this.min+n*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?L(this.ctx,this.font,this.yLabels)+10:0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,n=this.endPoint,e=this.endPoint-this.startPoint;for(this.calculateYRange(e),this.buildYLabels(),this.calculateXLabelRotation();e>this.endPoint-this.startPoint;)e=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(e),this.buildYLabels(),t<this.yLabelWidth&&(this.endPoint=n,this.calculateXLabelRotation())},calculateXLabelRotation:function(){this.ctx.font=this.font;var t,n,e=this.ctx.measureText(this.xLabels[0]).width,r=this.ctx.measureText(this.xLabels[this.xLabels.length-1]).width;if(this.xScalePaddingRight=r/2+3,this.xScalePaddingLeft=e/2>this.yLabelWidth?e/2:this.yLabelWidth,this.xLabelRotation=0,this.display){var i,o=L(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)i=Math.cos(y(this.xLabelRotation)),t=i*e,n=i*r,t+this.fontSize/2>this.yLabelWidth&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=i*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(y(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){
+var n=this.drawingArea()/(this.min-this.max);return this.endPoint-n*(t-this.min)},calculateX:function(t){var n=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=n/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),r=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(r+=e/2),Math.round(r)},update:function(t){r.extend(this,t),this.fit()},draw:function(){var t=this.ctx,n=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,i(this.yLabels,function(i,o){var a=this.endPoint-n*o,u=Math.round(a),s=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(i,e-10,a),0!==o||s||(s=!0),s&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),u+=r.aliasPixel(t.lineWidth),s&&(t.moveTo(e,u),t.lineTo(this.width,u),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,u),t.lineTo(e,u),t.stroke(),t.closePath()},this),i(this.xLabels,function(n,e){var r=this.calculateX(e)+$(this.lineWidth),i=this.calculateX(e-(this.offsetGridLines?.5:0))+$(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(i,this.endPoint),t.lineTo(i,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(i,this.endPoint),t.lineTo(i,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(r,o?this.endPoint+12:this.endPoint+8),t.rotate(y(this.xLabelRotation)*-1),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(n,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=g([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var n=this.drawingArea/(this.max-this.min);return(t-this.min)*n},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=m(this.stepValue),n=0;n<=this.steps;n++)this.yLabels.push(x(this.templateString,{value:(this.min+n*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,n,e,r,i,o,a,u,s,l,c,f,h=g([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,v=0;for(this.ctx.font=T(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),n=0;n<this.valuesCount;n++)t=this.getPointPosition(n,h),e=this.ctx.measureText(x(this.templateString,{value:this.labels[n]})).width+5,0===n||n===this.valuesCount/2?(r=e/2,t.x+r>p&&(p=t.x+r,i=n),t.x-r<v&&(v=t.x-r,a=n)):n<this.valuesCount/2?t.x+e>p&&(p=t.x+e,i=n):n>this.valuesCount/2&&t.x-e<v&&(v=t.x-e,a=n);s=v,l=Math.ceil(p-this.width),o=this.getIndexAngle(i),u=this.getIndexAngle(a),c=l/Math.sin(o+Math.PI/2),f=s/Math.sin(u+Math.PI/2),c=d(c)?c:0,f=d(f)?f:0,this.drawingArea=h-(f+c)/2,this.setCenterPoint(f,c)},setCenterPoint:function(t,n){var e=this.width-n-this.drawingArea,r=t+this.drawingArea;this.xCenter=(r+e)/2,this.yCenter=this.height/2},getIndexAngle:function(t){var n=2*Math.PI/this.valuesCount;return t*n-Math.PI/2},getPointPosition:function(t,n){var e=this.getIndexAngle(t);return{x:Math.cos(e)*n+this.xCenter,y:Math.sin(e)*n+this.yCenter}},draw:function(){if(this.display){var t=this.ctx;if(i(this.yLabels,function(n,e){if(e>0){var r,i=e*(this.drawingArea/this.steps),o=this.yCenter-i;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,i,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a<this.valuesCount;a++)r=this.getPointPosition(a,this.calculateCenterOffset(this.min+e*this.stepValue)),0===a?t.moveTo(r.x,r.y):t.lineTo(r.x,r.y);t.closePath(),t.stroke()}if(this.showLabels){if(t.font=T(this.fontSize,this.fontStyle,this.fontFamily),this.showLabelBackdrop){var u=t.measureText(n).width;t.fillStyle=this.backdropColor,t.fillRect(this.xCenter-u/2-this.backdropPaddingX,o-this.fontSize/2-this.backdropPaddingY,u+2*this.backdropPaddingX,this.fontSize+2*this.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.fontColor,t.fillText(n,this.xCenter,o)}}},this),!this.lineArc){t.lineWidth=this.angleLineWidth,t.strokeStyle=this.angleLineColor;for(var n=this.valuesCount-1;n>=0;n--){var e=null,r=null;if(this.angleLineWidth>0&&n%this.angleLineInterval===0&&(e=this.calculateCenterOffset(this.max),r=this.getPointPosition(n,e),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke(),t.closePath()),this.backgroundColors&&this.backgroundColors.length==this.valuesCount){null==e&&(e=this.calculateCenterOffset(this.max)),null==r&&(r=this.getPointPosition(n,e));var o=this.getPointPosition(0===n?this.valuesCount-1:n-1,e),a=this.getPointPosition(n===this.valuesCount-1?0:n+1,e),u={x:(o.x+r.x)/2,y:(o.y+r.y)/2},s={x:(r.x+a.x)/2,y:(r.y+a.y)/2};t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(u.x,u.y),t.lineTo(r.x,r.y),t.lineTo(s.x,s.y),t.fillStyle=this.backgroundColors[n],t.fill(),t.closePath()}var l=this.getPointPosition(n,this.calculateCenterOffset(this.max)+5);t.font=T(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var c=this.labels.length,f=this.labels.length/2,h=f/2,p=n<h||n>c-h,d=n===h||n===c-h;0===n?t.textAlign="center":n===f?t.textAlign="center":n<f?t.textAlign="left":t.textAlign="right",d?t.textBaseline="middle":p?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.labels[n],l.x,l.y)}}}}}),e.animationService={frameDuration:17,animations:[],dropFrames:0,addAnimation:function(t,n){for(var e=0;e<this.animations.length;++e)if(this.animations[e].chartInstance===t)return void(this.animations[e].animationObject=n);this.animations.push({chartInstance:t,animationObject:n}),1==this.animations.length&&r.requestAnimFrame.call(window,this.digestWrapper)},cancelAnimation:function(t){var n=r.findNextWhere(this.animations,function(n){return n.chartInstance===t});n&&this.animations.splice(n,1)},digestWrapper:function(){e.animationService.startDigest.call(e.animationService)},startDigest:function(){var t=Date.now(),n=0;this.dropFrames>1&&(n=Math.floor(this.dropFrames),this.dropFrames-=n);for(var e=0;e<this.animations.length;e++)null===this.animations[e].animationObject.currentStep&&(this.animations[e].animationObject.currentStep=0),this.animations[e].animationObject.currentStep+=1+n,this.animations[e].animationObject.currentStep>this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.currentStep=this.animations[e].animationObject.numSteps),this.animations[e].animationObject.render(this.animations[e].chartInstance,this.animations[e].animationObject),this.animations[e].animationObject.currentStep==this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.onAnimationComplete.call(this.animations[e].chartInstance),this.animations.splice(e,1),e--);var i=Date.now(),o=i-t-this.frameDuration,a=o/this.frameDuration;a>1&&(this.dropFrames+=a),this.animations.length>0&&r.requestAnimFrame.call(window,this.digestWrapper)}},r.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){i(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define("Chart",[],function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=n,e}}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"Bar",defaults:r,initialize:function(t){var r=this.options;this.ScaleClass=n.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,n,e){var i=this.calculateBaseWidth(),o=this.calculateX(e)-i/2,a=this.calculateBarWidth(t);return o+a*n+n*r.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*r.barValueSpacing},calculateBarWidth:function(t){var n=this.calculateBaseWidth()-(t-1)*r.barDatasetSpacing;return n/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t&&(t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke)}),this.showTooltip(n)}),this.BarClass=n.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(n,r){var i={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,bars:[]};this.datasets.push(i),e.each(n.data,function(e,r){i.bars.push(new this.BarClass({value:e,label:t.labels[r],datasetLabel:n.label,strokeColor:"object"==typeof n.strokeColor?n.strokeColor[r]:n.strokeColor,fillColor:"object"==typeof n.fillColor?n.fillColor[r]:n.fillColor,highlightFill:n.highlightFill?"object"==typeof n.highlightFill?n.highlightFill[r]:n.highlightFill:"object"==typeof n.fillColor?n.fillColor[r]:n.fillColor,highlightStroke:n.highlightStroke?"object"==typeof n.highlightStroke?n.highlightStroke[r]:n.highlightStroke:"object"==typeof n.strokeColor?n.strokeColor[r]:n.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,n,r){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,r,n),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(n,r){e.each(n.bars,t,this,r)},this)},getBarsAtEvent:function(t){for(var n,r=[],i=e.getRelativePosition(t),o=function(t){r.push(t.bars[n])},a=0;a<this.datasets.length;a++)for(n=0;n<this.datasets[a].bars.length;n++)if(this.datasets[a].bars[n].inRange(i.x,i.y))return e.each(this.datasets,o),r;return r},buildScale:function(t){var n=this,r=function(){var t=[];return n.eachBars(function(n){t.push(n.value)}),t},i={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var n=e.calculateScaleRange(r(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,n)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.barShowStroke?this.options.barStrokeWidth:0,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(i,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new this.ScaleClass(i)},addData:function(t,n){e.each(t,function(t,e){this.datasets[e].bars.push(new this.BarClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:this.scale.calculateBarX(this.datasets.length,e,this.scale.valuesCount+1),y:this.scale.endPoint,width:this.scale.calculateBarWidth(this.datasets.length),base:this.scale.endPoint,strokeColor:this.datasets[e].strokeColor,fillColor:this.datasets[e].fillColor}))},this),this.scale.addXLabel(n),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.bars.shift()},this),this.update()},reflow:function(){e.extend(this.BarClass.prototype,{y:this.scale.endPoint,base:this.scale.endPoint});var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var n=t||1;this.clear();this.chart.ctx;this.scale.draw(n),e.each(this.datasets,function(t,r){e.each(t.bars,function(t,e){t.hasValue()&&(t.base=this.scale.endPoint,t.transition({x:this.scale.calculateBarX(this.datasets.length,r,e),y:this.scale.calculateY(t.value),width:this.scale.calculateBarWidth(this.datasets.length)},n).draw())},this)},this)}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=segments[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"Doughnut",defaults:r,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=n.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(n,function(t){t.fillColor=t.highlightColor}),this.showTooltip(n)}),this.calculateTotal(t),e.each(t,function(n,e){n.color||(n.color="hsl("+360*e/t.length+", 100%, 50%)"),this.addData(n,e,!0)},this),this.render()},getSegmentsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(r.x,r.y)&&n.push(t)},this),n},addData:function(t,e,r){var i=void 0!==e?e:this.segments.length;"undefined"==typeof t.color&&(t.color=n.defaults.global.segmentColorDefault[i%n.defaults.global.segmentColorDefault.length],t.highlight=n.defaults.global.segmentHighlightColorDefaults[i%n.defaults.global.segmentHighlightColorDefaults.length]),this.segments.splice(i,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),r||(this.reflow(),this.update())},calculateCircumference:function(t){return this.total>0?2*Math.PI*(t/this.total):0},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var n=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(n,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var n=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},n),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle)},this)}}),n.types.Doughnut.extend({name:"Pie",defaults:e.merge(r,{percentageInnerCutout:0})})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,bezierCurve:!0,bezierCurveTension:.4,pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].strokeColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>',offsetGridLines:!1};n.Type.extend({name:"Line",defaults:r,initialize:function(t){this.PointClass=n.Point.extend({offsetGridLines:this.options.offsetGridLines,strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)<Math.pow(this.radius+this.hitDetectionRadius,2)}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(n)}),e.each(t.datasets,function(n){var r={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,pointColor:n.pointColor,pointStrokeColor:n.pointStrokeColor,points:[]};this.datasets.push(r),e.each(n.data,function(e,i){r.points.push(new this.PointClass({value:e,label:t.labels[i],datasetLabel:n.label,strokeColor:n.pointStrokeColor,fillColor:n.pointColor,highlightFill:n.pointHighlightFill||n.pointColor,highlightStroke:n.pointHighlightStroke||n.pointStrokeColor}))},this),this.buildScale(t.labels),this.eachPoints(function(t,n){e.extend(t,{x:this.scale.calculateX(n),y:this.scale.endPoint}),t.save()},this)},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachPoints(function(t){t.save()}),this.render()},eachPoints:function(t){e.each(this.datasets,function(n){e.each(n.points,t,this)},this)},getPointsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.datasets,function(t){e.each(t.points,function(t){t.inRange(r.x,r.y)&&n.push(t)})},this),n},buildScale:function(t){var r=this,i=function(){var t=[];return r.eachPoints(function(n){t.push(n.value)}),t},o={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,offsetGridLines:this.options.offsetGridLines,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var n=e.calculateScaleRange(i(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,n)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.pointDotRadius+this.options.pointDotStrokeWidth,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(o,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new n.Scale(o)},addData:function(t,n){e.each(t,function(t,e){this.datasets[e].points.push(new this.PointClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:this.scale.calculateX(this.scale.valuesCount+1),y:this.scale.endPoint,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.addXLabel(n),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.points.shift()},this),this.update()},reflow:function(){var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var n=t||1;this.clear();var r=this.chart.ctx,i=function(t){return null!==t.value},o=function(t,n,r){return e.findNextWhere(n,i,r)||t},a=function(t,n,r){return e.findPreviousWhere(n,i,r)||t};this.scale&&(this.scale.draw(n),e.each(this.datasets,function(t){var u=e.where(t.points,i);e.each(t.points,function(t,e){t.hasValue()&&t.transition({y:this.scale.calculateY(t.value),x:this.scale.calculateX(e)},n)},this),this.options.bezierCurve&&e.each(u,function(t,n){var r=n>0&&n<u.length-1?this.options.bezierCurveTension:0;t.controlPoints=e.splineCurve(a(t,u,n),t,o(t,u,n),r),t.controlPoints.outer.y>this.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.y<this.scale.startPoint&&(t.controlPoints.outer.y=this.scale.startPoint),t.controlPoints.inner.y>this.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y<this.scale.startPoint&&(t.controlPoints.inner.y=this.scale.startPoint)},this),r.lineWidth=this.options.datasetStrokeWidth,r.strokeStyle=t.strokeColor,r.beginPath(),e.each(u,function(t,n){if(0===n)r.moveTo(t.x,t.y);else if(this.options.bezierCurve){var e=a(t,u,n);r.bezierCurveTo(e.controlPoints.outer.x,e.controlPoints.outer.y,t.controlPoints.inner.x,t.controlPoints.inner.y,t.x,t.y)}else r.lineTo(t.x,t.y)},this),this.options.datasetStroke&&r.stroke(),this.options.datasetFill&&u.length>0&&(r.lineTo(u[u.length-1].x,this.scale.endPoint),r.lineTo(u[0].x,this.scale.endPoint),r.fillStyle=t.fillColor,r.closePath(),r.fill()),e.each(u,function(t){t.draw()})},this))}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers,r={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=segments[i].fillColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>'};n.Type.extend({name:"PolarArea",defaults:r,initialize:function(t){this.segments=[],this.SegmentArc=n.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new n.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,n){this.addData(t,n,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(n,function(t){t.fillColor=t.highlightColor}),this.showTooltip(n)}),this.render()},getSegmentsAtEvent:function(t){var n=[],r=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(r.x,r.y)&&n.push(t)},this),n},addData:function(t,n,e){var r=n||this.segments.length;this.segments.splice(r,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var n=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(n,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var n=[];e.each(t,function(t){n.push(t.value)});var r=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(n,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,r,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var n=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},n),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle),t.draw()},this),this.scale.draw()}})}.call(this),function(){"use strict";var t=this,n=t.Chart,e=n.helpers;n.Type.extend({name:"Radar",defaults:{scaleShowLine:!0,angleShowLineOut:!0,scaleShowLabels:!1,scaleBeginAtZero:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,angleLineInterval:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:10,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span class="<%=name.toLowerCase()%>-legend-icon" style="background-color:<%=datasets[i].strokeColor%>"></span><span class="<%=name.toLowerCase()%>-legend-text"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>'},initialize:function(t){this.PointClass=n.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var n="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(n,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(n)}),e.each(t.datasets,function(n){var r={label:n.label||null,fillColor:n.fillColor,strokeColor:n.strokeColor,pointColor:n.pointColor,pointStrokeColor:n.pointStrokeColor,points:[]};this.datasets.push(r),e.each(n.data,function(e,i){var o;this.scale.animation||(o=this.scale.getPointPosition(i,this.scale.calculateCenterOffset(e))),r.points.push(new this.PointClass({value:e,label:t.labels[i],datasetLabel:n.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:n.pointStrokeColor,fillColor:n.pointColor,highlightFill:n.pointHighlightFill||n.pointColor,highlightStroke:n.pointHighlightStroke||n.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(n){e.each(n.points,t,this)},this)},getPointsAtEvent:function(t){var n=e.getRelativePosition(t),r=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},n),i=2*Math.PI/this.scale.valuesCount,o=Math.round((r.angle-1.5*Math.PI)/i),a=[];return(o>=this.scale.valuesCount||o<0)&&(o=0),r.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new n.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backgroundColors:this.options.scaleBackgroundColors,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,angleLineInterval:this.options.angleLineInterval?this.options.angleLineInterval:1,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var n=function(){var n=[];return e.each(t,function(t){t.data?n=n.concat(t.data):e.each(t.points,function(t){
+n.push(t.value)})}),n}(),r=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(n,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,r)},addData:function(t,n){this.scale.valuesCount++,e.each(t,function(t,e){var r=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:n,datasetLabel:this.datasets[e].label,x:r.x,y:r.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(n),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var n=t||1,r=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),n)},this),r.lineWidth=this.options.datasetStrokeWidth,r.strokeStyle=t.strokeColor,r.beginPath(),e.each(t.points,function(t,n){0===n?r.moveTo(t.x,t.y):r.lineTo(t.x,t.y)},this),r.closePath(),r.stroke(),r.fillStyle=t.fillColor,this.options.datasetFill&&r.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this),function(t){"use strict";"object"==typeof exports?module.exports=t("undefined"!=typeof angular?angular:require("angular"),"undefined"!=typeof Chart?Chart:require("chart.js")):"function"==typeof define&&define.amd?define(["angular","chart"],t):t(angular,Chart)}(function(t,n){"use strict";function e(){var e={},r={Chart:n,getOptions:function(n){var r=n&&e[n]||{};return t.extend({},e,r)}};this.setOptions=function(n,r){return r?void(e[n]=t.extend(e[n]||{},r)):(r=n,void(e=t.extend(e,r)))},this.$get=function(){return r}}function r(e,r){function o(t,n){return!!(t&&n&&t.length&&n.length)&&(Array.isArray(t[0])?t.length===n.length&&t.every(function(t,e){return t.length===n[e].length}):n.reduce(a,0)>0&&t.length===n.length)}function a(t,n){return t+n}function u(n,e,r,i){var o=null;return function(a){var u=e.getPointsAtEvent||e.getBarsAtEvent||e.getSegmentsAtEvent;if(u){var s=u.call(e,a);i!==!1&&t.equals(o,s)!==!1||(o=s,n[r](s,a),n.$apply())}}}function s(r,i){for(var o=!1,a=t.copy(i.colours||e.getOptions(r).colours||n.defaults.global.colours);a.length<i.data.length;)a.push(i.getColour()),o=!0;return o&&(i.colours=a),a.map(l)}function l(t){return"object"==typeof t&&null!==t?t:"string"==typeof t&&"#"===t[0]?f(d(t.substr(1))):c()}function c(){var t=[h(0,255),h(0,255),h(0,255)];return f(t)}function f(t){return{fillColor:p(t,.2),strokeColor:p(t,1),pointColor:p(t,1),pointStrokeColor:"#fff",pointHighlightFill:"#fff",pointHighlightStroke:p(t,.8)}}function h(t,n){return Math.floor(Math.random()*(n-t+1))+t}function p(t,n){return i?"rgb("+t.join(",")+")":"rgba("+t.concat(n).join(",")+")"}function d(t){var n=parseInt(t,16),e=n>>16&255,r=n>>8&255,i=255&n;return[e,r,i]}function v(n,e,r,i){return{labels:n,datasets:e.map(function(n,e){return t.extend({},i[e],{label:r[e],data:n})})}}function g(n,e,r){return n.map(function(n,i){return t.extend({},r[i],{label:n,value:e[i],color:r[i].strokeColor,highlight:r[i].pointHighlightStroke})})}function m(t,n){var e=t.parent(),r=e.find("chart-legend"),i="<chart-legend>"+n.generateLegend()+"</chart-legend>";r.length?r.replaceWith(i):e.append(i)}function y(t,n,e,r){Array.isArray(e.data[0])?t.datasets.forEach(function(t,e){(t.points||t.bars).forEach(function(t,r){t.value=n[e][r]})}):t.segments.forEach(function(t,e){t.value=n[e]}),t.update(),e.$emit("update",t),e.legend&&"false"!==e.legend&&m(r,t)}function $(t){return!t||Array.isArray(t)&&!t.length||"object"==typeof t&&!Object.keys(t).length}function b(r,i){var o=t.extend({},n.defaults.global,e.getOptions(r),i.options);return o.responsive}function x(t,n){t&&(t.destroy(),n.$emit("destroy",t))}return function(n){return{restrict:"CA",scope:{data:"=?",labels:"=?",options:"=?",series:"=?",colours:"=?",getColour:"=?",chartType:"=",legend:"@",click:"=?",hover:"=?",chartData:"=?",chartLabels:"=?",chartOptions:"=?",chartSeries:"=?",chartColours:"=?",chartLegend:"@",chartClick:"=?",chartHover:"=?"},link:function(a,l){function f(t,n){a.$watch(t,function(t){"undefined"!=typeof t&&(a[n]=t)})}function h(e,r){if(!$(e)&&!t.equals(e,r)){var i=n||a.chartType;i&&p(i)}}function p(n){if(b(n,a)&&0===l[0].clientHeight&&0===C.clientHeight)return r(function(){p(n)},50,!1);if(a.data&&a.data.length){a.getColour="function"==typeof a.getColour?a.getColour:c;var i=s(n,a),o=l[0],f=o.getContext("2d"),h=Array.isArray(a.data[0])?v(a.labels,a.data,a.series||[],i):g(a.labels,a.data,i),d=t.extend({},e.getOptions(n),a.options);x(w,a),w=new e.Chart(f)[n](h,d),a.$emit("create",w),o.onclick=a.click?u(a,w,"click",!1):t.noop,o.onmousemove=a.hover?u(a,w,"hover",!0):t.noop,a.legend&&"false"!==a.legend&&m(l,w)}}function d(t){if("undefined"!=typeof console&&"test"!==e.getOptions().env){var n="function"==typeof console.warn?console.warn:console.log;a[t]&&n.call(console,'"%s" is deprecated and will be removed in a future version. Please use "chart-%s" instead.',t,t)}}var w,C=document.createElement("div");C.className="chart-container",l.replaceWith(C),C.appendChild(l[0]),i&&window.G_vmlCanvasManager.initElement(l[0]),["data","labels","options","series","colours","legend","click","hover"].forEach(d),f("chartData","data"),f("chartLabels","labels"),f("chartOptions","options"),f("chartSeries","series"),f("chartColours","colours"),f("chartLegend","legend"),f("chartClick","click"),f("chartHover","hover"),a.$watch("data",function(t,e){if(!t||!t.length||Array.isArray(t[0])&&!t[0].length)return void x(w,a);var r=n||a.chartType;if(r)return w&&o(t,e)?y(w,t,a,l):void p(r)},!0),a.$watch("series",h,!0),a.$watch("labels",h,!0),a.$watch("options",h,!0),a.$watch("colours",h,!0),a.$watch("chartType",function(n,e){$(n)||t.equals(n,e)||p(n)}),a.$on("$destroy",function(){x(w,a)})}}}}n.defaults.global.responsive=!0,n.defaults.global.multiTooltipTemplate="<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>",n.defaults.global.colours=["#97BBCD","#DCDCDC","#F7464A","#46BFBD","#FDB45C","#949FB1","#4D5360"];var i="object"==typeof window.G_vmlCanvasManager&&null!==window.G_vmlCanvasManager&&"function"==typeof window.G_vmlCanvasManager.initElement;return i&&(n.defaults.global.animation=!1),t.module("chart.js",[]).provider("ChartJs",e).factory("ChartJsFactory",["ChartJs","$timeout",r]).directive("chartBase",["ChartJsFactory",function(t){return new t}]).directive("chartLine",["ChartJsFactory",function(t){return new t("Line")}]).directive("chartBar",["ChartJsFactory",function(t){return new t("Bar")}]).directive("chartRadar",["ChartJsFactory",function(t){return new t("Radar")}]).directive("chartDoughnut",["ChartJsFactory",function(t){return new t("Doughnut")}]).directive("chartPie",["ChartJsFactory",function(t){return new t("Pie")}]).directive("chartPolarArea",["ChartJsFactory",function(t){return new t("PolarArea")}])}),!function(){function t(t){return t&&(t.ownerDocument||t.document||t).documentElement}function n(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}function e(t,n){return t<n?-1:t>n?1:t>=n?0:NaN}function r(t){return null===t?NaN:+t}function i(t){return!isNaN(t)}function o(t){return{left:function(n,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=n.length);r<i;){var o=r+i>>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=n.length);r<i;){var o=r+i>>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}function a(t){return t.length}function u(t){for(var n=1;t*n%1;)n*=10;return n}function s(t,n){for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}function l(){this._=Object.create(null)}function c(t){return(t+="")===xa||t[0]===wa?wa+t:t}function f(t){return(t+="")[0]===wa?t.slice(1):t}function h(t){return c(t)in this._}function p(t){return(t=c(t))in this._&&delete this._[t]}function d(){var t=[];for(var n in this._)t.push(f(n));return t}function v(){var t=0;for(var n in this._)++t;return t}function g(){for(var t in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(t){return t}function $(t,n,e){return function(){var r=e.apply(n,arguments);return r===n?t:r}}function b(t,n){if(n in t)return n;n=n.charAt(0).toUpperCase()+n.slice(1);for(var e=0,r=Ca.length;e<r;++e){var i=Ca[e]+n;if(i in t)return i}}function x(){}function w(){}function C(t){function n(){for(var n,r=e,i=-1,o=r.length;++i<o;)(n=r[i].on)&&n.apply(this,arguments);return t}var e=[],r=new l;return n.on=function(n,i){var o,a=r.get(n);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,o=e.indexOf(a)).concat(e.slice(o+1)),r.remove(n)),i&&e.push(r.set(n,{on:i})),t)},n}function S(){sa.event.preventDefault()}function _(){for(var t,n=sa.event;t=n.sourceEvent;)n=t;return n}function M(t){for(var n=new w,e=0,r=arguments.length;++e<r;)n[arguments[e]]=C(n);return n.of=function(e,r){return function(i){try{var o=i.sourceEvent=sa.event;i.target=t,sa.event=i,n[i.type].apply(e,r)}finally{sa.event=o}}},n}function k(t){return _a(t,Ea),t}function A(t){return"function"==typeof t?t:function(){return Ma(t,this)}}function E(t){return"function"==typeof t?t:function(){return ka(t,this)}}function P(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function i(){this.setAttribute(t,n)}function o(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function u(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=sa.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?u:a:t.local?o:i}function O(t){return t.trim().replace(/\s+/g," ")}function T(t){return new RegExp("(?:^|\\s+)"+sa.requote(t)+"(?:\\s+|$)","g")}function L(t){return(t+"").trim().split(/^|\s+/)}function j(t,n){function e(){for(var e=-1;++e<i;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);++e<i;)t[e](this,r)}t=L(t).map(N);var i=t.length;return"function"==typeof n?r:e}function N(t){var n=T(t);return function(e,r){if(i=e.classList)return r?i.add(t):i.remove(t);var i=e.getAttribute("class")||"";r?(n.lastIndex=0,n.test(i)||e.setAttribute("class",O(i+" "+t))):e.setAttribute("class",O(i.replace(n," ")))}}function R(t,n,e){function r(){this.style.removeProperty(t)}function i(){this.style.setProperty(t,n,e)}function o(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?o:i}function D(t,n){function e(){delete this[t]}function r(){this[t]=n}function i(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?i:r}function F(t){function n(){var n=this.ownerDocument,e=this.namespaceURI;return e===Pa&&n.documentElement.namespaceURI===Pa?n.createElement(t):n.createElementNS(e,t)}function e(){return this.ownerDocument.createElementNS(t.space,t.local)}return"function"==typeof t?t:(t=sa.ns.qualify(t)).local?e:n}function I(){var t=this.parentNode;t&&t.removeChild(this)}function q(t){return{__data__:t}}function z(t){return function(){return Aa(this,t)}}function V(t){return arguments.length||(t=e),function(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}}function B(t,n){for(var e=0,r=t.length;e<r;e++)for(var i,o=t[e],a=0,u=o.length;a<u;a++)(i=o[a])&&n(i,a,e);return t}function U(t){return _a(t,Ta),t}function W(t){var n,e;return function(r,i,o){var a,u=t[o].update,s=u.length;for(o!=e&&(e=o,n=0),i>=n&&(n=i+1);!(a=u[n])&&++n<s;);return a}}function H(t,n,e){function r(){var n=this[a];n&&(this.removeEventListener(t,n,n.$),delete this[a])}function i(){var i=s(n,ca(arguments));r.call(this),this.addEventListener(t,this[a]=i,i.$=e),i._=n}function o(){var n,e=new RegExp("^__on([^.]+)"+sa.requote(t)+"$");for(var r in this)if(n=r.match(e)){var i=this[r];this.removeEventListener(n[1],i,i.$),delete this[r]}}var a="__on"+t,u=t.indexOf("."),s=Y;u>0&&(t=t.slice(0,u));var l=La.get(t);return l&&(t=l,s=G),u?n?i:r:n?x:o}function Y(t,n){return function(e){var r=sa.event;sa.event=e,n[0]=this.__data__;try{t.apply(this,n)}finally{sa.event=r}}}function G(t,n){var e=Y(t,n);return function(t){var n=this,r=t.relatedTarget;r&&(r===n||8&r.compareDocumentPosition(n))||e.call(n,t)}}function Z(e){var r=".dragsuppress-"+ ++Na,i="click"+r,o=sa.select(n(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==ja&&(ja=!("onselectstart"in e)&&b(e.style,"userSelect")),ja){var a=t(e).style,u=a[ja];a[ja]="none"}return function(t){if(o.on(r,null),ja&&(a[ja]=u),t){var n=function(){o.on(i,null)};o.on(i,function(){S(),n()},!0),setTimeout(n,0)}}}function X(t,e){e.changedTouches&&(e=e.changedTouches[0]);var r=t.ownerSVGElement||t;if(r.createSVGPoint){var i=r.createSVGPoint();if(Ra<0){var o=n(t);if(o.scrollX||o.scrollY){r=sa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(t.getScreenCTM().inverse()),[i.x,i.y]}var u=t.getBoundingClientRect();return[e.clientX-u.left-t.clientLeft,e.clientY-u.top-t.clientTop]}function J(){return sa.event.changedTouches[0].identifier}function K(t){return t>0?1:t<0?-1:0}function Q(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function tt(t){return t>1?0:t<-1?Ia:Math.acos(t)}function nt(t){return t>1?Va:t<-1?-Va:Math.asin(t)}function et(t){return((t=Math.exp(t))-1/t)/2}function rt(t){return((t=Math.exp(t))+1/t)/2}function it(t){return((t=Math.exp(2*t))-1)/(t+1)}function ot(t){return(t=Math.sin(t/2))*t}function at(){}function ut(t,n,e){return this instanceof ut?(this.h=+t,this.s=+n,void(this.l=+e)):arguments.length<2?t instanceof ut?new ut(t.h,t.s,t.l):xt(""+t,wt,ut):new ut(t,n,e)}function st(t,n,e){function r(t){return t>360?t-=360:t<0&&(t+=360),t<60?o+(a-o)*t/60:t<180?a:t<240?o+(a-o)*(240-t)/60:o}function i(t){return Math.round(255*r(t))}var o,a;return t=isNaN(t)?0:(t%=360)<0?t+360:t,n=isNaN(n)?0:n<0?0:n>1?1:n,e=e<0?0:e>1?1:e,a=e<=.5?e*(1+n):e+n-e*n,o=2*e-a,new mt(i(t+120),i(t),i(t-120))}function lt(t,n,e){return this instanceof lt?(this.h=+t,this.c=+n,void(this.l=+e)):arguments.length<2?t instanceof lt?new lt(t.h,t.c,t.l):t instanceof ft?pt(t.l,t.a,t.b):pt((t=Ct((t=sa.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new lt(t,n,e)}function ct(t,n,e){return isNaN(t)&&(t=0),isNaN(n)&&(n=0),new ft(e,Math.cos(t*=Ba)*n,Math.sin(t)*n)}function ft(t,n,e){return this instanceof ft?(this.l=+t,this.a=+n,void(this.b=+e)):arguments.length<2?t instanceof ft?new ft(t.l,t.a,t.b):t instanceof lt?ct(t.h,t.c,t.l):Ct((t=mt(t)).r,t.g,t.b):new ft(t,n,e)}function ht(t,n,e){var r=(t+16)/116,i=r+n/500,o=r-e/200;return i=dt(i)*tu,r=dt(r)*nu,o=dt(o)*eu,new mt(gt(3.2404542*i-1.5371385*r-.4985314*o),gt(-.969266*i+1.8760108*r+.041556*o),gt(.0556434*i-.2040259*r+1.0572252*o))}function pt(t,n,e){return t>0?new lt(Math.atan2(e,n)*Ua,Math.sqrt(n*n+e*e),t):new lt(NaN,NaN,t)}function dt(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function vt(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function gt(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mt(t,n,e){return this instanceof mt?(this.r=~~t,this.g=~~n,void(this.b=~~e)):arguments.length<2?t instanceof mt?new mt(t.r,t.g,t.b):xt(""+t,mt,st):new mt(t,n,e)}function yt(t){return new mt(t>>16,t>>8&255,255&t)}function $t(t){return yt(t)+""}function bt(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function xt(t,n,e){var r,i,o,a=0,u=0,s=0;if(r=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return n(_t(i[0]),_t(i[1]),_t(i[2]))}return(o=ou.get(t))?n(o.r,o.g,o.b):(null==t||"#"!==t.charAt(0)||isNaN(o=parseInt(t.slice(1),16))||(4===t.length?(a=(3840&o)>>4,a=a>>4|a,u=240&o,u=u>>4|u,s=15&o,s=s<<4|s):7===t.length&&(a=(16711680&o)>>16,u=(65280&o)>>8,s=255&o)),n(a,u,s))}function wt(t,n,e){var r,i,o=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),u=a-o,s=(a+o)/2;return u?(i=s<.5?u/(a+o):u/(2-a-o),r=t==a?(n-e)/u+(n<e?6:0):n==a?(e-t)/u+2:(t-n)/u+4,r*=60):(r=NaN,i=s>0&&s<1?0:r),new ut(r,i,s)}function Ct(t,n,e){t=St(t),n=St(n),e=St(e);var r=vt((.4124564*t+.3575761*n+.1804375*e)/tu),i=vt((.2126729*t+.7151522*n+.072175*e)/nu),o=vt((.0193339*t+.119192*n+.9503041*e)/eu);return ft(116*i-16,500*(r-i),200*(i-o))}function St(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function _t(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function Mt(t){return"function"==typeof t?t:function(){return t}}function kt(t){return function(n,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),At(n,e,t,r)}}function At(t,n,e,r){function i(){var t,n=s.status;if(!n&&Pt(s)||n>=200&&n<300||304===n){try{t=e.call(o,s)}catch(r){return void a.error.call(o,r)}a.load.call(o,t)}else a.error.call(o,s)}var o={},a=sa.dispatch("beforesend","progress","load","error"),u={},s=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in s||!/^(http(s)?:)?\/\//.test(t)||(s=new XDomainRequest),"onload"in s?s.onload=s.onerror=i:s.onreadystatechange=function(){s.readyState>3&&i()},s.onprogress=function(t){var n=sa.event;sa.event=t;try{a.progress.call(o,s)}finally{sa.event=n}},o.header=function(t,n){return t=(t+"").toLowerCase(),arguments.length<2?u[t]:(null==n?delete u[t]:u[t]=n+"",o)},o.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",o):n},o.responseType=function(t){return arguments.length?(l=t,o):l},o.response=function(t){return e=t,o},["get","post"].forEach(function(t){o[t]=function(){return o.send.apply(o,[t].concat(ca(arguments)))}}),o.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),s.open(e,t,!0),null==n||"accept"in u||(u.accept=n+",*/*"),s.setRequestHeader)for(var c in u)s.setRequestHeader(c,u[c]);return null!=n&&s.overrideMimeType&&s.overrideMimeType(n),null!=l&&(s.responseType=l),null!=i&&o.on("error",i).on("load",function(t){i(null,t)}),a.beforesend.call(o,s),s.send(null==r?null:r),o},o.abort=function(){return s.abort(),o},sa.rebind(o,a,"on"),null==r?o:o.get(Et(r))}function Et(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function Pt(t){var n=t.responseType;return n&&"text"!==n?t.response:t.responseText}function Ot(t,n,e){var r=arguments.length;r<2&&(n=0),r<3&&(e=Date.now());var i=e+n,o={c:t,t:i,n:null};return uu?uu.n=o:au=o,uu=o,su||(lu=clearTimeout(lu),su=1,cu(Tt)),o}function Tt(){var t=Lt(),n=jt()-t;n>24?(isFinite(n)&&(clearTimeout(lu),lu=setTimeout(Tt,n)),su=0):(su=1,cu(Tt))}function Lt(){for(var t=Date.now(),n=au;n;)t>=n.t&&n.c(t-n.t)&&(n.c=null),n=n.n;return t}function jt(){for(var t,n=au,e=1/0;n;)n.c?(n.t<e&&(e=n.t),n=(t=n).n):n=t?t.n=n.n:au=n.n;return uu=t,e}function Nt(t,n){return n-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function Rt(t,n){var e=Math.pow(10,3*ba(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function Dt(t){var n=t.decimal,e=t.thousands,r=t.grouping,i=t.currency,o=r&&e?function(t,n){for(var i=t.length,o=[],a=0,u=r[0],s=0;i>0&&u>0&&(s+u+1>n&&(u=Math.max(1,n-s)),o.push(t.substring(i-=u,i+u)),!((s+=u+1)>n));)u=r[a=(a+1)%r.length];return o.reverse().join(e)}:y;return function(t){var e=hu.exec(t),r=e[1]||" ",a=e[2]||">",u=e[3]||"-",s=e[4]||"",l=e[5],c=+e[6],f=e[7],h=e[8],p=e[9],d=1,v="",g="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===a)&&(l=r="0",a="="),p){case"n":f=!0,p="g";break;case"%":d=100,g="%",p="f";break;case"p":d=100,g="%",p="r";break;case"b":case"o":case"x":case"X":"#"===s&&(v="0"+p.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":d=-1,p="r"}"$"===s&&(v=i[0],g=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pu.get(p)||Ft;var $=l&&f;return function(t){var e=g;if(m&&t%1)return"";var i=t<0||0===t&&1/t<0?(t=-t,"-"):"-"===u?"":u;if(d<0){var s=sa.formatPrefix(t,h);t=s.scale(t),e=s.symbol+g}else t*=d;t=p(t,h);var b,x,w=t.lastIndexOf(".");if(w<0){var C=y?t.lastIndexOf("e"):-1;C<0?(b=t,x=""):(b=t.substring(0,C),x=t.substring(C))}else b=t.substring(0,w),x=n+t.substring(w+1);!l&&f&&(b=o(b,1/0));var S=v.length+b.length+x.length+($?0:i.length),_=S<c?new Array(S=c-S+1).join(r):"";return $&&(b=o(_+b,_.length?c-x.length:1/0)),i+=v,t=b+x,("<"===a?i+t+_:">"===a?_+i+t:"^"===a?_.substring(0,S>>=1)+i+t+_.substring(S):i+($?t:_+t))+e}}}function Ft(t){return t+""}function It(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function qt(t,n,e){function r(n){var e=t(n),r=o(e,1);return n-e<r-n?e:r}function i(e){return n(e=t(new vu(e-1)),1),e}function o(t,e){return n(t=new vu((+t)),e),t}function a(t,r,o){var a=i(t),u=[];if(o>1)for(;a<r;)e(a)%o||u.push(new Date((+a))),n(a,1);else for(;a<r;)u.push(new Date((+a))),n(a,1);return u}function u(t,n,e){try{vu=It;var r=new It;return r._=t,a(r,n,e)}finally{vu=Date}}t.floor=t,t.round=r,t.ceil=i,t.offset=o,t.range=a;var s=t.utc=zt(t);return s.floor=s,s.round=zt(r),s.ceil=zt(i),s.offset=zt(o),s.range=u,t}function zt(t){return function(n,e){try{vu=It;var r=new It;return r._=n,t(r,e)._}finally{vu=Date}}}function Vt(t){function n(t){function n(n){for(var e,i,o,a=[],u=-1,s=0;++u<r;)37===t.charCodeAt(u)&&(a.push(t.slice(s,u)),null!=(i=mu[e=t.charAt(++u)])&&(e=t.charAt(++u)),(o=A[e])&&(e=o(n,null==i?"e"===e?" ":"0":i)),a.push(e),s=u+1);return a.push(t.slice(s,u)),a.join("")}var r=t.length;return n.parse=function(n){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},i=e(r,t,n,0);if(i!=n.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var o=null!=r.Z&&vu!==It,a=new(o?It:vu);return"j"in r?a.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),a.setFullYear(r.y,0,1),a.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(a.getDay()+5)%7:r.w+7*r.U-(a.getDay()+6)%7)):a.setFullYear(r.y,r.m,r.d),a.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),o?a._:a},n.toString=function(){return t},n}function e(t,n,e,r){for(var i,o,a,u=0,s=n.length,l=e.length;u<s;){if(r>=l)return-1;if(i=n.charCodeAt(u++),37===i){if(a=n.charAt(u++),o=E[a in mu?n.charAt(u++):a],!o||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(t,n,e){w.lastIndex=0;var r=w.exec(n.slice(e));return r?(t.w=C.get(r[0].toLowerCase()),e+r[0].length):-1}function i(t,n,e){b.lastIndex=0;var r=b.exec(n.slice(e));return r?(t.w=x.get(r[0].toLowerCase()),e+r[0].length):-1}function o(t,n,e){M.lastIndex=0;var r=M.exec(n.slice(e));return r?(t.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(t,n,e){S.lastIndex=0;var r=S.exec(n.slice(e));return r?(t.m=_.get(r[0].toLowerCase()),e+r[0].length):-1}function u(t,n,r){return e(t,A.c.toString(),n,r)}function s(t,n,r){return e(t,A.x.toString(),n,r)}function l(t,n,r){return e(t,A.X.toString(),n,r)}function c(t,n,e){var r=$.get(n.slice(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}var f=t.dateTime,h=t.date,p=t.time,d=t.periods,v=t.days,g=t.shortDays,m=t.months,y=t.shortMonths;n.utc=function(t){function e(t){try{vu=It;var n=new vu;return n._=t,r(n)}finally{vu=Date}}var r=n(t);return e.parse=function(t){try{vu=It;var n=r.parse(t);return n&&n._}finally{vu=Date}},e.toString=r.toString,e},n.multi=n.utc.multi=ln;var $=sa.map(),b=Ut(v),x=Wt(v),w=Ut(g),C=Wt(g),S=Ut(m),_=Wt(m),M=Ut(y),k=Wt(y);d.forEach(function(t,n){$.set(t.toLowerCase(),n)});var A={a:function(t){return g[t.getDay()]},A:function(t){return v[t.getDay()]},b:function(t){return y[t.getMonth()]},B:function(t){return m[t.getMonth()]},c:n(f),d:function(t,n){return Bt(t.getDate(),n,2)},e:function(t,n){return Bt(t.getDate(),n,2)},H:function(t,n){return Bt(t.getHours(),n,2)},I:function(t,n){return Bt(t.getHours()%12||12,n,2)},j:function(t,n){return Bt(1+du.dayOfYear(t),n,3)},L:function(t,n){return Bt(t.getMilliseconds(),n,3)},m:function(t,n){return Bt(t.getMonth()+1,n,2)},M:function(t,n){return Bt(t.getMinutes(),n,2)},p:function(t){return d[+(t.getHours()>=12)]},S:function(t,n){return Bt(t.getSeconds(),n,2)},U:function(t,n){return Bt(du.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return Bt(du.mondayOfYear(t),n,2)},x:n(h),X:n(p),y:function(t,n){return Bt(t.getFullYear()%100,n,2)},Y:function(t,n){return Bt(t.getFullYear()%1e4,n,4)},Z:un,"%":function(){return"%"}},E={a:r,A:i,b:o,B:a,c:u,d:tn,e:tn,H:en,I:en,j:nn,L:an,m:Qt,M:rn,p:c,S:on,U:Yt,w:Ht,W:Gt,x:s,X:l,y:Xt,Y:Zt,Z:Jt,"%":sn};return n}function Bt(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o<e?new Array(e-o+1).join(n)+i:i)}function Ut(t){return new RegExp("^(?:"+t.map(sa.requote).join("|")+")","i")}function Wt(t){for(var n=new l,e=-1,r=t.length;++e<r;)n.set(t[e].toLowerCase(),e);return n}function Ht(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r[0].length):-1}function Yt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e));return r?(t.U=+r[0],e+r[0].length):-1}function Gt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e));return r?(t.W=+r[0],e+r[0].length):-1}function Zt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r[0].length):-1}function Xt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.y=Kt(+r[0]),e+r[0].length):-1}function Jt(t,n,e){return/^[+-]\d{4}$/.test(n=n.slice(e,e+5))?(t.Z=-n,e+5):-1}function Kt(t){return t+(t>68?1900:2e3)}function Qt(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function tn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function nn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+3));return r?(t.j=+r[0],e+r[0].length):-1}function en(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function rn(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function on(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function an(t,n,e){yu.lastIndex=0;var r=yu.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function un(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=ba(n)/60|0,i=ba(n)%60;return e+Bt(r,"0",2)+Bt(i,"0",2)}function sn(t,n,e){$u.lastIndex=0;var r=$u.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function ln(t){for(var n=t.length,e=-1;++e<n;)t[e][0]=this(t[e][0]);return function(n){for(var e=0,r=t[e];!r[1](n);)r=t[++e];return r[0](n)}}function cn(){}function fn(t,n,e){var r=e.s=t+n,i=r-t,o=r-i;e.t=t-o+(n-i)}function hn(t,n){t&&Cu.hasOwnProperty(t.type)&&Cu[t.type](t,n)}function pn(t,n,e){var r,i=-1,o=t.length-e;for(n.lineStart();++i<o;)r=t[i],n.point(r[0],r[1],r[2]);n.lineEnd()}function dn(t,n){var e=-1,r=t.length;for(n.polygonStart();++e<r;)pn(t[e],n,1);n.polygonEnd()}function vn(){function t(t,n){t*=Ba,n=n*Ba/2+Ia/4;var e=t-r,a=e>=0?1:-1,u=a*e,s=Math.cos(n),l=Math.sin(n),c=o*l,f=i*s+c*Math.cos(u),h=c*a*Math.sin(u);_u.add(Math.atan2(h,f)),r=t,i=s,o=l}var n,e,r,i,o;Mu.point=function(a,u){Mu.point=t,r=(n=a)*Ba,i=Math.cos(u=(e=u)*Ba/2+Ia/4),o=Math.sin(u)},Mu.lineEnd=function(){t(n,e)}}function gn(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function mn(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function yn(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function $n(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function bn(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function xn(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function wn(t){return[Math.atan2(t[1],t[0]),nt(t[2])]}function Cn(t,n){return ba(t[0]-n[0])<Da&&ba(t[1]-n[1])<Da}function Sn(t,n){t*=Ba;var e=Math.cos(n*=Ba);_n(e*Math.cos(t),e*Math.sin(t),Math.sin(n))}function _n(t,n,e){++ku,Eu+=(t-Eu)/ku,Pu+=(n-Pu)/ku,Ou+=(e-Ou)/ku}function Mn(){function t(t,i){t*=Ba;var o=Math.cos(i*=Ba),a=o*Math.cos(t),u=o*Math.sin(t),s=Math.sin(i),l=Math.atan2(Math.sqrt((l=e*s-r*u)*l+(l=r*a-n*s)*l+(l=n*u-e*a)*l),n*a+e*u+r*s);Au+=l,Tu+=l*(n+(n=a)),Lu+=l*(e+(e=u)),ju+=l*(r+(r=s)),_n(n,e,r)}var n,e,r;Fu.point=function(i,o){i*=Ba;var a=Math.cos(o*=Ba);n=a*Math.cos(i),e=a*Math.sin(i),r=Math.sin(o),Fu.point=t,_n(n,e,r)}}function kn(){Fu.point=Sn}function An(){function t(t,n){t*=Ba;var e=Math.cos(n*=Ba),a=e*Math.cos(t),u=e*Math.sin(t),s=Math.sin(n),l=i*s-o*u,c=o*a-r*s,f=r*u-i*a,h=Math.sqrt(l*l+c*c+f*f),p=r*a+i*u+o*s,d=h&&-tt(p)/h,v=Math.atan2(h,p);Nu+=d*l,Ru+=d*c,Du+=d*f,Au+=v,Tu+=v*(r+(r=a)),Lu+=v*(i+(i=u)),ju+=v*(o+(o=s)),_n(r,i,o)}var n,e,r,i,o;Fu.point=function(a,u){n=a,e=u,Fu.point=t,a*=Ba;var s=Math.cos(u*=Ba);r=s*Math.cos(a),i=s*Math.sin(a),o=Math.sin(u),_n(r,i,o)},Fu.lineEnd=function(){t(n,e),Fu.lineEnd=kn,Fu.point=Sn}}function En(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),e&&t.invert(e[0],e[1])}),e}function Pn(){return!0}function On(t,n,e,r,i){var o=[],a=[];if(t.forEach(function(t){if(!((n=t.length-1)<=0)){var n,e=t[0],r=t[n];if(Cn(e,r)){i.lineStart();for(var u=0;u<n;++u)i.point((e=t[u])[0],e[1]);return void i.lineEnd()}var s=new Ln(e,t,null,(!0)),l=new Ln(e,null,s,(!1));s.o=l,o.push(s),a.push(l),s=new Ln(r,t,null,(!1)),l=new Ln(r,null,s,(!0)),s.o=l,o.push(s),a.push(l)}}),a.sort(n),Tn(o),Tn(a),o.length){for(var u=0,s=e,l=a.length;u<l;++u)a[u].e=s=!s;for(var c,f,h=o[0];;){for(var p=h,d=!0;p.v;)if((p=p.n)===h)return;c=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(d)for(var u=0,l=c.length;u<l;++u)i.point((f=c[u])[0],f[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(d){c=p.p.z;for(var u=c.length-1;u>=0;--u)i.point((f=c[u])[0],f[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,c=p.z,d=!d}while(!p.v);i.lineEnd()}}}function Tn(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r<n;)i.n=e=t[r],e.p=i,i=e;i.n=e=t[0],e.p=i}}function Ln(t,n,e,r){this.x=t,this.z=n,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function jn(t,n,e,r){return function(i,o){function a(n,e){var r=i(n,e);t(n=r[0],e=r[1])&&o.point(n,e)}function u(t,n){var e=i(t,n);g.point(e[0],e[1])}function s(){y.point=u,g.lineStart()}function l(){y.point=a,g.lineEnd()}function c(t,n){v.push([t,n]);var e=i(t,n);b.point(e[0],e[1])}function f(){b.lineStart(),v=[]}function h(){c(v[0][0],v[0][1]),b.lineEnd();var t,n=b.clean(),e=$.buffer(),r=e.length;if(v.pop(),d.push(v),v=null,r)if(1&n){t=e[0];var i,r=t.length-1,a=-1;if(r>0){for(x||(o.polygonStart(),x=!0),o.lineStart();++a<r;)o.point((i=t[a])[0],i[1]);o.lineEnd()}}else r>1&&2&n&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Nn))}var p,d,v,g=n(o),m=i.invert(r[0],r[1]),y={point:a,lineStart:s,lineEnd:l,polygonStart:function(){y.point=c,y.lineStart=f,y.lineEnd=h,p=[],d=[]},polygonEnd:function(){y.point=a,y.lineStart=s,y.lineEnd=l,p=sa.merge(p);var t=zn(m,d);p.length?(x||(o.polygonStart(),x=!0),On(p,Dn,t,e,o)):t&&(x||(o.polygonStart(),x=!0),o.lineStart(),e(null,null,1,o),o.lineEnd()),x&&(o.polygonEnd(),x=!1),p=d=null},sphere:function(){o.polygonStart(),o.lineStart(),e(null,null,1,o),o.lineEnd(),o.polygonEnd()}},$=Rn(),b=n($),x=!1;return y}}function Nn(t){return t.length>1}function Rn(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:x,buffer:function(){var e=n;return n=[],t=null,
+e},rejoin:function(){n.length>1&&n.push(n.pop().concat(n.shift()))}}}function Dn(t,n){return((t=t.x)[0]<0?t[1]-Va-Da:Va-t[1])-((n=n.x)[0]<0?n[1]-Va-Da:Va-n[1])}function Fn(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?Ia:-Ia,s=ba(o-e);ba(s-Ia)<Da?(t.point(e,r=(r+a)/2>0?Va:-Va),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&s>=Ia&&(ba(e-i)<Da&&(e-=i*Da),ba(o-u)<Da&&(o-=u*Da),r=In(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}}function In(t,n,e,r){var i,o,a=Math.sin(t-e);return ba(a)>Da?Math.atan((Math.sin(n)*(o=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(n))*Math.sin(t))/(i*o*a)):(n+r)/2}function qn(t,n,e,r){var i;if(null==t)i=e*Va,r.point(-Ia,i),r.point(0,i),r.point(Ia,i),r.point(Ia,0),r.point(Ia,-i),r.point(0,-i),r.point(-Ia,-i),r.point(-Ia,0),r.point(-Ia,i);else if(ba(t[0]-n[0])>Da){var o=t[0]<n[0]?Ia:-Ia;i=e*o/2,r.point(-o,i),r.point(0,i),r.point(o,i)}else r.point(n[0],n[1])}function zn(t,n){var e=t[0],r=t[1],i=[Math.sin(e),-Math.cos(e),0],o=0,a=0;_u.reset();for(var u=0,s=n.length;u<s;++u){var l=n[u],c=l.length;if(c)for(var f=l[0],h=f[0],p=f[1]/2+Ia/4,d=Math.sin(p),v=Math.cos(p),g=1;;){g===c&&(g=0),t=l[g];var m=t[0],y=t[1]/2+Ia/4,$=Math.sin(y),b=Math.cos(y),x=m-h,w=x>=0?1:-1,C=w*x,S=C>Ia,_=d*$;if(_u.add(Math.atan2(_*w*Math.sin(C),v*b+_*Math.cos(C))),o+=S?x+w*qa:x,S^h>=e^m>=e){var M=yn(gn(f),gn(t));xn(M);var k=yn(i,M);xn(k);var A=(S^x>=0?-1:1)*nt(k[2]);(r>A||r===A&&(M[0]||M[1]))&&(a+=S^x>=0?1:-1)}if(!g++)break;h=m,d=$,v=b,f=t}}return(o<-Da||o<Da&&_u<-Da)^1&a}function Vn(t){function n(t,n){return Math.cos(t)*Math.cos(n)>o}function e(t){var e,o,s,l,c;return{lineStart:function(){l=s=!1,c=1},point:function(f,h){var p,d=[f,h],v=n(f,h),g=a?v?0:i(f,h):v?i(f+(f<0?Ia:-Ia),h):0;if(!e&&(l=s=v)&&t.lineStart(),v!==s&&(p=r(e,d),(Cn(e,p)||Cn(d,p))&&(d[0]+=Da,d[1]+=Da,v=n(d[0],d[1]))),v!==s)c=0,v?(t.lineStart(),p=r(d,e),t.point(p[0],p[1])):(p=r(e,d),t.point(p[0],p[1]),t.lineEnd()),e=p;else if(u&&e&&a^v){var m;g&o||!(m=r(d,e,!0))||(c=0,a?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1])))}!v||e&&Cn(e,d)||t.point(d[0],d[1]),e=d,s=v,o=g},lineEnd:function(){s&&t.lineEnd(),e=null},clean:function(){return c|(l&&s)<<1}}}function r(t,n,e){var r=gn(t),i=gn(n),a=[1,0,0],u=yn(r,i),s=mn(u,u),l=u[0],c=s-l*l;if(!c)return!e&&t;var f=o*s/c,h=-o*l/c,p=yn(a,u),d=bn(a,f),v=bn(u,h);$n(d,v);var g=p,m=mn(d,g),y=mn(g,g),$=m*m-y*(mn(d,d)-1);if(!($<0)){var b=Math.sqrt($),x=bn(g,(-m-b)/y);if($n(x,d),x=wn(x),!e)return x;var w,C=t[0],S=n[0],_=t[1],M=n[1];S<C&&(w=C,C=S,S=w);var k=S-C,A=ba(k-Ia)<Da,E=A||k<Da;if(!A&&M<_&&(w=_,_=M,M=w),E?A?_+M>0^x[1]<(ba(x[0]-C)<Da?_:M):_<=x[1]&&x[1]<=M:k>Ia^(C<=x[0]&&x[0]<=S)){var P=bn(g,(-m+b)/y);return $n(P,d),[x,wn(P)]}}}function i(n,e){var r=a?t:Ia-t,i=0;return n<-r?i|=1:n>r&&(i|=2),e<-r?i|=4:e>r&&(i|=8),i}var o=Math.cos(t),a=o>0,u=ba(o)>Da,s=ve(t,6*Ba);return jn(n,e,s,a?[0,-t]:[-Ia,t-Ia])}function Bn(t,n,e,r){return function(i){var o,a=i.a,u=i.b,s=a.x,l=a.y,c=u.x,f=u.y,h=0,p=1,d=c-s,v=f-l;if(o=t-s,d||!(o>0)){if(o/=d,d<0){if(o<h)return;o<p&&(p=o)}else if(d>0){if(o>p)return;o>h&&(h=o)}if(o=e-s,d||!(o<0)){if(o/=d,d<0){if(o>p)return;o>h&&(h=o)}else if(d>0){if(o<h)return;o<p&&(p=o)}if(o=n-l,v||!(o>0)){if(o/=v,v<0){if(o<h)return;o<p&&(p=o)}else if(v>0){if(o>p)return;o>h&&(h=o)}if(o=r-l,v||!(o<0)){if(o/=v,v<0){if(o>p)return;o>h&&(h=o)}else if(v>0){if(o<h)return;o<p&&(p=o)}return h>0&&(i.a={x:s+h*d,y:l+h*v}),p<1&&(i.b={x:s+p*d,y:l+p*v}),i}}}}}}function Un(t,n,e,r){function i(r,i){return ba(r[0]-t)<Da?i>0?0:3:ba(r[0]-e)<Da?i>0?2:1:ba(r[1]-n)<Da?i>0?1:0:i>0?3:2}function o(t,n){return a(t.x,n.x)}function a(t,n){var e=i(t,1),r=i(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(u){function s(t){for(var n=0,e=g.length,r=t[1],i=0;i<e;++i)for(var o,a=1,u=g[i],s=u.length,l=u[0];a<s;++a)o=u[a],l[1]<=r?o[1]>r&&Q(l,o,t)>0&&++n:o[1]<=r&&Q(l,o,t)<0&&--n,l=o;return 0!==n}function l(o,u,s,l){var c=0,f=0;if(null==o||(c=i(o,s))!==(f=i(u,s))||a(o,u)<0^s>0){do l.point(0===c||3===c?t:e,c>1?r:n);while((c=(c+s+4)%4)!==f)}else l.point(u[0],u[1])}function c(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function f(t,n){c(t,n)&&u.point(t,n)}function h(){E.point=d,g&&g.push(m=[]),S=!0,C=!1,x=w=NaN}function p(){v&&(d(y,$),b&&C&&k.rejoin(),v.push(k.buffer())),E.point=f,C&&u.lineEnd()}function d(t,n){t=Math.max(-qu,Math.min(qu,t)),n=Math.max(-qu,Math.min(qu,n));var e=c(t,n);if(g&&m.push([t,n]),S)y=t,$=n,b=e,S=!1,e&&(u.lineStart(),u.point(t,n));else if(e&&C)u.point(t,n);else{var r={a:{x:x,y:w},b:{x:t,y:n}};A(r)?(C||(u.lineStart(),u.point(r.a.x,r.a.y)),u.point(r.b.x,r.b.y),e||u.lineEnd(),_=!1):e&&(u.lineStart(),u.point(t,n),_=!1)}x=t,w=n,C=e}var v,g,m,y,$,b,x,w,C,S,_,M=u,k=Rn(),A=Bn(t,n,e,r),E={point:f,lineStart:h,lineEnd:p,polygonStart:function(){u=k,v=[],g=[],_=!0},polygonEnd:function(){u=M,v=sa.merge(v);var n=s([t,r]),e=_&&n,i=v.length;(e||i)&&(u.polygonStart(),e&&(u.lineStart(),l(null,null,1,u),u.lineEnd()),i&&On(v,o,n,l,u),u.polygonEnd()),v=g=m=null}};return E}}function Wn(t){var n=0,e=Ia/3,r=ue(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Ia/180,e=t[1]*Ia/180):[n/Ia*180,e/Ia*180]},i}function Hn(t,n){function e(t,n){var e=Math.sqrt(o-2*i*Math.sin(n))/i;return[e*Math.sin(t*=i),a-e*Math.cos(t)]}var r=Math.sin(t),i=(r+Math.sin(n))/2,o=1+r*(2*i-r),a=Math.sqrt(o)/i;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/i,nt((o-(t*t+e*e)*i*i)/(2*i))]},e}function Yn(){function t(t,n){Vu+=i*t-r*n,r=t,i=n}var n,e,r,i;Yu.point=function(o,a){Yu.point=t,n=r=o,e=i=a},Yu.lineEnd=function(){t(n,e)}}function Gn(t,n){t<Bu&&(Bu=t),t>Wu&&(Wu=t),n<Uu&&(Uu=n),n>Hu&&(Hu=n)}function Zn(){function t(t,n){a.push("M",t,",",n,o)}function n(t,n){a.push("M",t,",",n),u.point=e}function e(t,n){a.push("L",t,",",n)}function r(){u.point=t}function i(){a.push("Z")}var o=Xn(4.5),a=[],u={point:t,lineStart:function(){u.point=n},lineEnd:r,polygonStart:function(){u.lineEnd=i},polygonEnd:function(){u.lineEnd=r,u.point=t},pointRadius:function(t){return o=Xn(t),u},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return u}function Xn(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Jn(t,n){Eu+=t,Pu+=n,++Ou}function Kn(){function t(t,r){var i=t-n,o=r-e,a=Math.sqrt(i*i+o*o);Tu+=a*(n+t)/2,Lu+=a*(e+r)/2,ju+=a,Jn(n=t,e=r)}var n,e;Zu.point=function(r,i){Zu.point=t,Jn(n=r,e=i)}}function Qn(){Zu.point=Jn}function te(){function t(t,n){var e=t-r,o=n-i,a=Math.sqrt(e*e+o*o);Tu+=a*(r+t)/2,Lu+=a*(i+n)/2,ju+=a,a=i*t-r*n,Nu+=a*(r+t),Ru+=a*(i+n),Du+=3*a,Jn(r=t,i=n)}var n,e,r,i;Zu.point=function(o,a){Zu.point=t,Jn(n=r=o,e=i=a)},Zu.lineEnd=function(){t(n,e)}}function ne(t){function n(n,e){t.moveTo(n+a,e),t.arc(n,e,a,0,qa)}function e(n,e){t.moveTo(n,e),u.point=r}function r(n,e){t.lineTo(n,e)}function i(){u.point=n}function o(){t.closePath()}var a=4.5,u={point:n,lineStart:function(){u.point=e},lineEnd:i,polygonStart:function(){u.lineEnd=o},polygonEnd:function(){u.lineEnd=i,u.point=n},pointRadius:function(t){return a=t,u},result:x};return u}function ee(t){function n(t){return(u?r:e)(t)}function e(n){return oe(n,function(e,r){e=t(e,r),n.point(e[0],e[1])})}function r(n){function e(e,r){e=t(e,r),n.point(e[0],e[1])}function r(){$=NaN,S.point=o,n.lineStart()}function o(e,r){var o=gn([e,r]),a=t(e,r);i($,b,y,x,w,C,$=a[0],b=a[1],y=e,x=o[0],w=o[1],C=o[2],u,n),n.point($,b)}function a(){S.point=e,n.lineEnd()}function s(){r(),S.point=l,S.lineEnd=c}function l(t,n){o(f=t,h=n),p=$,d=b,v=x,g=w,m=C,S.point=o}function c(){i($,b,y,x,w,C,p,d,f,v,g,m,u,n),S.lineEnd=a,a()}var f,h,p,d,v,g,m,y,$,b,x,w,C,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){n.polygonStart(),S.lineStart=s},polygonEnd:function(){n.polygonEnd(),S.lineStart=r}};return S}function i(n,e,r,u,s,l,c,f,h,p,d,v,g,m){var y=c-n,$=f-e,b=y*y+$*$;if(b>4*o&&g--){var x=u+p,w=s+d,C=l+v,S=Math.sqrt(x*x+w*w+C*C),_=Math.asin(C/=S),M=ba(ba(C)-1)<Da||ba(r-h)<Da?(r+h)/2:Math.atan2(w,x),k=t(M,_),A=k[0],E=k[1],P=A-n,O=E-e,T=$*P-y*O;(T*T/b>o||ba((y*P+$*O)/b-.5)>.3||u*p+s*d+l*v<a)&&(i(n,e,r,u,s,l,A,E,M,x/=S,w/=S,C,g,m),m.point(A,E),i(A,E,M,x,w,C,c,f,h,p,d,v,g,m))}}var o=.5,a=Math.cos(30*Ba),u=16;return n.precision=function(t){return arguments.length?(u=(o=t*t)>0&&16,n):Math.sqrt(o)},n}function re(t){var n=ee(function(n,e){return t([n*Ua,e*Ua])});return function(t){return se(n(t))}}function ie(t){this.stream=t}function oe(t,n){return{point:n,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function ae(t){return ue(function(){return t})()}function ue(t){function n(t){return t=u(t[0]*Ba,t[1]*Ba),[t[0]*h+s,l-t[1]*h]}function e(t){return t=u.invert((t[0]-s)/h,(l-t[1])/h),t&&[t[0]*Ua,t[1]*Ua]}function r(){u=En(a=fe(m,$,b),o);var t=o(v,g);return s=p-t[0]*h,l=d+t[1]*h,i()}function i(){return c&&(c.valid=!1,c=null),n}var o,a,u,s,l,c,f=ee(function(t,n){return t=o(t,n),[t[0]*h+s,l-t[1]*h]}),h=150,p=480,d=250,v=0,g=0,m=0,$=0,b=0,x=Iu,w=y,C=null,S=null;return n.stream=function(t){return c&&(c.valid=!1),c=se(x(a,f(w(t)))),c.valid=!0,c},n.clipAngle=function(t){return arguments.length?(x=null==t?(C=t,Iu):Vn((C=+t)*Ba),i()):C},n.clipExtent=function(t){return arguments.length?(S=t,w=t?Un(t[0][0],t[0][1],t[1][0],t[1][1]):y,i()):S},n.scale=function(t){return arguments.length?(h=+t,r()):h},n.translate=function(t){return arguments.length?(p=+t[0],d=+t[1],r()):[p,d]},n.center=function(t){return arguments.length?(v=t[0]%360*Ba,g=t[1]%360*Ba,r()):[v*Ua,g*Ua]},n.rotate=function(t){return arguments.length?(m=t[0]%360*Ba,$=t[1]%360*Ba,b=t.length>2?t[2]%360*Ba:0,r()):[m*Ua,$*Ua,b*Ua]},sa.rebind(n,f,"precision"),function(){return o=t.apply(this,arguments),n.invert=o.invert&&e,r()}}function se(t){return oe(t,function(n,e){t.point(n*Ba,e*Ba)})}function le(t,n){return[t,n]}function ce(t,n){return[t>Ia?t-qa:t<-Ia?t+qa:t,n]}function fe(t,n,e){return t?n||e?En(pe(t),de(n,e)):pe(t):n||e?de(n,e):ce}function he(t){return function(n,e){return n+=t,[n>Ia?n-qa:n<-Ia?n+qa:n,e]}}function pe(t){var n=he(t);return n.invert=he(-t),n}function de(t,n){function e(t,n){var e=Math.cos(n),u=Math.cos(t)*e,s=Math.sin(t)*e,l=Math.sin(n),c=l*r+u*i;return[Math.atan2(s*o-c*a,u*r-l*i),nt(c*o+s*a)]}var r=Math.cos(t),i=Math.sin(t),o=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),u=Math.cos(t)*e,s=Math.sin(t)*e,l=Math.sin(n),c=l*o-s*a;return[Math.atan2(s*o+l*a,u*r+c*i),nt(c*r-u*i)]},e}function ve(t,n){var e=Math.cos(t),r=Math.sin(t);return function(i,o,a,u){var s=a*n;null!=i?(i=ge(e,i),o=ge(e,o),(a>0?i<o:i>o)&&(i+=a*qa)):(i=t+a*qa,o=t-.5*s);for(var l,c=i;a>0?c>o:c<o;c-=s)u.point((l=wn([e,-r*Math.cos(c),-r*Math.sin(c)]))[0],l[1])}}function ge(t,n){var e=gn(n);e[0]-=t,xn(e);var r=tt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(t,n,e){var r=sa.range(t,n-Da,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function ye(t,n,e){var r=sa.range(t,n-Da,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function $e(t){return t.source}function be(t){return t.target}function xe(t,n,e,r){var i=Math.cos(n),o=Math.sin(n),a=Math.cos(r),u=Math.sin(r),s=i*Math.cos(t),l=i*Math.sin(t),c=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(ot(r-n)+i*a*ot(e-t))),p=1/Math.sin(h),d=h?function(t){var n=Math.sin(t*=h)*p,e=Math.sin(h-t)*p,r=e*s+n*c,i=e*l+n*f,a=e*o+n*u;return[Math.atan2(i,r)*Ua,Math.atan2(a,Math.sqrt(r*r+i*i))*Ua]}:function(){return[t*Ua,n*Ua]};return d.distance=h,d}function we(){function t(t,i){var o=Math.sin(i*=Ba),a=Math.cos(i),u=ba((t*=Ba)-n),s=Math.cos(u);Xu+=Math.atan2(Math.sqrt((u=a*Math.sin(u))*u+(u=r*o-e*a*s)*u),e*o+r*a*s),n=t,e=o,r=a}var n,e,r;Ju.point=function(i,o){n=i*Ba,e=Math.sin(o*=Ba),r=Math.cos(o),Ju.point=t},Ju.lineEnd=function(){Ju.point=Ju.lineEnd=x}}function Ce(t,n){function e(n,e){var r=Math.cos(n),i=Math.cos(e),o=t(r*i);return[o*i*Math.sin(n),o*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),i=n(r),o=Math.sin(i),a=Math.cos(i);return[Math.atan2(t*o,r*a),Math.asin(r&&e*o/r)]},e}function Se(t,n){function e(t,n){a>0?n<-Va+Da&&(n=-Va+Da):n>Va-Da&&(n=Va-Da);var e=a/Math.pow(i(n),o);return[e*Math.sin(o*t),a-e*Math.cos(o*t)]}var r=Math.cos(t),i=function(t){return Math.tan(Ia/4+t/2)},o=t===n?Math.sin(t):Math.log(r/Math.cos(n))/Math.log(i(n)/i(t)),a=r*Math.pow(i(t),o)/o;return o?(e.invert=function(t,n){var e=a-n,r=K(o)*Math.sqrt(t*t+e*e);return[Math.atan2(t,e)/o,2*Math.atan(Math.pow(a/r,1/o))-Va]},e):Me}function _e(t,n){function e(t,n){var e=o-n;return[e*Math.sin(i*t),o-e*Math.cos(i*t)]}var r=Math.cos(t),i=t===n?Math.sin(t):(r-Math.cos(n))/(n-t),o=r/i+t;return ba(i)<Da?le:(e.invert=function(t,n){var e=o-n;return[Math.atan2(t,e)/i,o-K(i)*Math.sqrt(t*t+e*e)]},e)}function Me(t,n){return[t,Math.log(Math.tan(Ia/4+n/2))]}function ke(t){var n,e=ae(t),r=e.scale,i=e.translate,o=e.clipExtent;return e.scale=function(){var t=r.apply(e,arguments);return t===e?n?e.clipExtent(null):e:t},e.translate=function(){var t=i.apply(e,arguments);return t===e?n?e.clipExtent(null):e:t},e.clipExtent=function(t){var a=o.apply(e,arguments);if(a===e){if(n=null==t){var u=Ia*r(),s=i();o([[s[0]-u,s[1]-u],[s[0]+u,s[1]+u]])}}else n&&(a=null);return a},e.clipExtent(null)}function Ae(t,n){return[Math.log(Math.tan(Ia/4+n/2)),-t]}function Ee(t){return t[0]}function Pe(t){return t[1]}function Oe(t){for(var n=t.length,e=[0,1],r=2,i=2;i<n;i++){for(;r>1&&Q(t[e[r-2]],t[e[r-1]],t[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function Te(t,n){return t[0]-n[0]||t[1]-n[1]}function Le(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function je(t,n,e,r){var i=t[0],o=e[0],a=n[0]-i,u=r[0]-o,s=t[1],l=e[1],c=n[1]-s,f=r[1]-l,h=(u*(s-l)-f*(i-o))/(f*a-u*c);return[i+h*a,s+h*c]}function Ne(t){var n=t[0],e=t[t.length-1];return!(n[0]-e[0]||n[1]-e[1])}function Re(){rr(this),this.edge=this.site=this.circle=null}function De(t){var n=ls.pop()||new Re;return n.site=t,n}function Fe(t){Ge(t),as.remove(t),ls.push(t),rr(t)}function Ie(t){var n=t.circle,e=n.x,r=n.cy,i={x:e,y:r},o=t.P,a=t.N,u=[t];Fe(t);for(var s=o;s.circle&&ba(e-s.circle.x)<Da&&ba(r-s.circle.cy)<Da;)o=s.P,u.unshift(s),Fe(s),s=o;u.unshift(s),Ge(s);for(var l=a;l.circle&&ba(e-l.circle.x)<Da&&ba(r-l.circle.cy)<Da;)a=l.N,u.push(l),Fe(l),l=a;u.push(l),Ge(l);var c,f=u.length;for(c=1;c<f;++c)l=u[c],s=u[c-1],tr(l.edge,s.site,l.site,i);s=u[0],l=u[f-1],l.edge=Ke(s.site,l.site,null,i),Ye(s),Ye(l)}function qe(t){for(var n,e,r,i,o=t.x,a=t.y,u=as._;u;)if(r=ze(u,a)-o,r>Da)u=u.L;else{if(i=o-Ve(u,a),!(i>Da)){r>-Da?(n=u.P,e=u):i>-Da?(n=u,e=u.N):n=e=u;break}if(!u.R){n=u;break}u=u.R}var s=De(t);if(as.insert(n,s),n||e){if(n===e)return Ge(n),e=De(n.site),as.insert(s,e),s.edge=e.edge=Ke(n.site,s.site),Ye(n),void Ye(e);if(!e)return void(s.edge=Ke(n.site,s.site));Ge(n),Ge(e);var l=n.site,c=l.x,f=l.y,h=t.x-c,p=t.y-f,d=e.site,v=d.x-c,g=d.y-f,m=2*(h*g-p*v),y=h*h+p*p,$=v*v+g*g,b={x:(g*y-p*$)/m+c,y:(h*$-v*y)/m+f};tr(e.edge,l,d,b),s.edge=Ke(l,t,null,b),e.edge=Ke(t,d,null,b),Ye(n),Ye(e)}}function ze(t,n){var e=t.site,r=e.x,i=e.y,o=i-n;if(!o)return r;var a=t.P;if(!a)return-(1/0);e=a.site;var u=e.x,s=e.y,l=s-n;if(!l)return u;var c=u-r,f=1/o-1/l,h=c/l;return f?(-h+Math.sqrt(h*h-2*f*(c*c/(-2*l)-s+l/2+i-o/2)))/f+r:(r+u)/2}function Ve(t,n){var e=t.N;if(e)return ze(e,n);var r=t.site;return r.y===n?r.x:1/0}function Be(t){this.site=t,this.edges=[]}function Ue(t){for(var n,e,r,i,o,a,u,s,l,c,f=t[0][0],h=t[1][0],p=t[0][1],d=t[1][1],v=os,g=v.length;g--;)if(o=v[g],o&&o.prepare())for(u=o.edges,s=u.length,a=0;a<s;)c=u[a].end(),r=c.x,i=c.y,l=u[++a%s].start(),n=l.x,e=l.y,(ba(r-n)>Da||ba(i-e)>Da)&&(u.splice(a,0,new nr(Qe(o.site,c,ba(r-f)<Da&&d-i>Da?{x:f,y:ba(n-f)<Da?e:d}:ba(i-d)<Da&&h-r>Da?{x:ba(e-d)<Da?n:h,y:d}:ba(r-h)<Da&&i-p>Da?{x:h,y:ba(n-h)<Da?e:p}:ba(i-p)<Da&&r-f>Da?{x:ba(e-p)<Da?n:f,y:p}:null),o.site,null)),++s)}function We(t,n){return n.angle-t.angle}function He(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Ye(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;if(r!==o){var a=i.x,u=i.y,s=r.x-a,l=r.y-u,c=o.x-a,f=o.y-u,h=2*(s*f-l*c);if(!(h>=-Fa)){var p=s*s+l*l,d=c*c+f*f,v=(f*p-l*d)/h,g=(s*d-c*p)/h,f=g+u,m=cs.pop()||new He;m.arc=t,m.site=i,m.x=v+a,m.y=f+Math.sqrt(v*v+g*g),m.cy=f,t.circle=m;for(var y=null,$=ss._;$;)if(m.y<$.y||m.y===$.y&&m.x<=$.x){if(!$.L){y=$.P;break}$=$.L}else{if(!$.R){y=$;break}$=$.R}ss.insert(y,m),y||(us=m)}}}}function Ge(t){var n=t.circle;n&&(n.P||(us=n.N),ss.remove(n),cs.push(n),rr(n),t.circle=null)}function Ze(t){for(var n,e=is,r=Bn(t[0][0],t[0][1],t[1][0],t[1][1]),i=e.length;i--;)n=e[i],(!Xe(n,t)||!r(n)||ba(n.a.x-n.b.x)<Da&&ba(n.a.y-n.b.y)<Da)&&(n.a=n.b=null,e.splice(i,1))}function Xe(t,n){var e=t.b;if(e)return!0;var r,i,o=t.a,a=n[0][0],u=n[1][0],s=n[0][1],l=n[1][1],c=t.l,f=t.r,h=c.x,p=c.y,d=f.x,v=f.y,g=(h+d)/2,m=(p+v)/2;if(v===p){if(g<a||g>=u)return;if(h>d){if(o){if(o.y>=l)return}else o={x:g,y:s};e={x:g,y:l}}else{if(o){if(o.y<s)return}else o={x:g,y:l};e={x:g,y:s}}}else if(r=(h-d)/(v-p),i=m-r*g,r<-1||r>1)if(h>d){if(o){if(o.y>=l)return}else o={x:(s-i)/r,y:s};e={x:(l-i)/r,y:l}}else{if(o){if(o.y<s)return}else o={x:(l-i)/r,y:l};e={x:(s-i)/r,y:s}}else if(p<v){if(o){if(o.x>=u)return}else o={x:a,y:r*a+i};e={x:u,y:r*u+i}}else{if(o){if(o.x<a)return}else o={x:u,y:r*u+i};e={x:a,y:r*a+i}}return t.a=o,t.b=e,!0}function Je(t,n){this.l=t,this.r=n,this.a=this.b=null}function Ke(t,n,e,r){var i=new Je(t,n);return is.push(i),e&&tr(i,t,n,e),r&&tr(i,n,t,r),os[t.i].edges.push(new nr(i,t,n)),os[n.i].edges.push(new nr(i,n,t)),i}function Qe(t,n,e){var r=new Je(t,null);return r.a=n,r.b=e,is.push(r),r}function tr(t,n,e,r){t.a||t.b?t.l===e?t.b=r:t.a=r:(t.a=r,t.l=n,t.r=e)}function nr(t,n,e){var r=t.a,i=t.b;this.edge=t,this.site=n,this.angle=e?Math.atan2(e.y-n.y,e.x-n.x):t.l===n?Math.atan2(i.x-r.x,r.y-i.y):Math.atan2(r.x-i.x,i.y-r.y)}function er(){this._=null}function rr(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function ir(t,n){var e=n,r=n.R,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function or(t,n){var e=n,r=n.L,i=e.U;i?i.L===e?i.L=r:i.R=r:t._=r,r.U=i,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function ar(t){for(;t.L;)t=t.L;return t}function ur(t,n){var e,r,i,o=t.sort(sr).pop();for(is=[],os=new Array(t.length),as=new er,ss=new er;;)if(i=us,o&&(!i||o.y<i.y||o.y===i.y&&o.x<i.x))o.x===e&&o.y===r||(os[o.i]=new Be(o),qe(o),e=o.x,r=o.y),o=t.pop();else{if(!i)break;Ie(i.arc)}n&&(Ze(n),Ue(n));var a={cells:os,edges:is};return as=ss=is=os=null,a}function sr(t,n){return n.y-t.y||n.x-t.x}function lr(t,n,e){return(t.x-e.x)*(n.y-t.y)-(t.x-n.x)*(e.y-t.y)}function cr(t){return t.x}function fr(t){return t.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function pr(t,n,e,r,i,o){if(!t(n,e,r,i,o)){var a=.5*(e+i),u=.5*(r+o),s=n.nodes;s[0]&&pr(t,s[0],e,r,a,u),s[1]&&pr(t,s[1],a,r,i,u),s[2]&&pr(t,s[2],e,u,a,o),s[3]&&pr(t,s[3],a,u,i,o)}}function dr(t,n,e,r,i,o,a){var u,s=1/0;return function l(t,c,f,h,p){if(!(c>o||f>a||h<r||p<i)){if(d=t.point){var d,v=n-t.x,g=e-t.y,m=v*v+g*g;if(m<s){var y=Math.sqrt(s=m);r=n-y,i=e-y,o=n+y,a=e+y,u=d}}for(var $=t.nodes,b=.5*(c+h),x=.5*(f+p),w=n>=b,C=e>=x,S=C<<1|w,_=S+4;S<_;++S)if(t=$[3&S])switch(3&S){case 0:l(t,c,f,b,x);break;case 1:l(t,b,f,h,x);break;case 2:l(t,c,x,b,p);break;case 3:l(t,b,x,h,p)}}}(t,r,i,o,a),u}function vr(t,n){t=sa.rgb(t),n=sa.rgb(n);var e=t.r,r=t.g,i=t.b,o=n.r-e,a=n.g-r,u=n.b-i;return function(t){return"#"+bt(Math.round(e+o*t))+bt(Math.round(r+a*t))+bt(Math.round(i+u*t))}}function gr(t,n){var e,r={},i={};for(e in t)e in n?r[e]=$r(t[e],n[e]):i[e]=t[e];for(e in n)e in t||(i[e]=n[e]);return function(t){for(e in r)i[e]=r[e](t);return i}}function mr(t,n){return t=+t,n=+n,function(e){return t*(1-e)+n*e}}function yr(t,n){var e,r,i,o=hs.lastIndex=ps.lastIndex=0,a=-1,u=[],s=[];for(t+="",n+="";(e=hs.exec(t))&&(r=ps.exec(n));)(i=r.index)>o&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,s.push({i:a,x:mr(e,r)})),o=ps.lastIndex;return o<n.length&&(i=n.slice(o),u[a]?u[a]+=i:u[++a]=i),u.length<2?s[0]?(n=s[0].x,function(t){return n(t)+""}):function(){return n}:(n=s.length,function(t){for(var e,r=0;r<n;++r)u[(e=s[r]).i]=e.x(t);return u.join("")})}function $r(t,n){for(var e,r=sa.interpolators.length;--r>=0&&!(e=sa.interpolators[r](t,n)););return e}function br(t,n){var e,r=[],i=[],o=t.length,a=n.length,u=Math.min(t.length,n.length);for(e=0;e<u;++e)r.push($r(t[e],n[e]));for(;e<o;++e)i[e]=t[e];for(;e<a;++e)i[e]=n[e];return function(t){for(e=0;e<u;++e)i[e]=r[e](t);return i}}function xr(t){return function(n){return n<=0?0:n>=1?1:t(n)}}function wr(t){return function(n){return 1-t(1-n)}}function Cr(t){return function(n){return.5*(n<.5?t(2*n):2-t(2-2*n))}}function Sr(t){return t*t}function _r(t){return t*t*t}function Mr(t){if(t<=0)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(t<.5?e:3*(t-n)+e-.75)}function kr(t){return function(n){return Math.pow(n,t)}}function Ar(t){return 1-Math.cos(t*Va)}function Er(t){return Math.pow(2,10*(t-1))}function Pr(t){return 1-Math.sqrt(1-t*t)}function Or(t,n){var e;return arguments.length<2&&(n=.45),arguments.length?e=n/qa*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,-10*r)*Math.sin((r-e)*qa/n)}}function Tr(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function Lr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function jr(t,n){t=sa.hcl(t),n=sa.hcl(n);var e=t.h,r=t.c,i=t.l,o=n.h-e,a=n.c-r,u=n.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?n.c:r),isNaN(o)?(o=0,e=isNaN(e)?n.h:e):o>180?o-=360:o<-180&&(o+=360),function(t){return ct(e+o*t,r+a*t,i+u*t)+""}}function Nr(t,n){t=sa.hsl(t),n=sa.hsl(n);var e=t.h,r=t.s,i=t.l,o=n.h-e,a=n.s-r,u=n.l-i;return isNaN(a)&&(a=0,r=isNaN(r)?n.s:r),isNaN(o)?(o=0,e=isNaN(e)?n.h:e):o>180?o-=360:o<-180&&(o+=360),function(t){return st(e+o*t,r+a*t,i+u*t)+""}}function Rr(t,n){t=sa.lab(t),n=sa.lab(n);var e=t.l,r=t.a,i=t.b,o=n.l-e,a=n.a-r,u=n.b-i;return function(t){return ht(e+o*t,r+a*t,i+u*t)+""}}function Dr(t,n){return n-=t,function(e){return Math.round(t+n*e)}}function Fr(t){var n=[t.a,t.b],e=[t.c,t.d],r=qr(n),i=Ir(n,e),o=qr(zr(e,n,-i))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Ua,this.translate=[t.e,t.f],this.scale=[r,o],this.skew=o?Math.atan2(i,o)*Ua:0}function Ir(t,n){return t[0]*n[0]+t[1]*n[1]}function qr(t){var n=Math.sqrt(Ir(t,t));return n&&(t[0]/=n,t[1]/=n),n}function zr(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function Vr(t){return t.length?t.pop()+",":""}function Br(t,n,e,r){if(t[0]!==n[0]||t[1]!==n[1]){var i=e.push("translate(",null,",",null,")");r.push({i:i-4,x:mr(t[0],n[0])},{i:i-2,x:mr(t[1],n[1])})}else(n[0]||n[1])&&e.push("translate("+n+")")}function Ur(t,n,e,r){t!==n?(t-n>180?n+=360:n-t>180&&(t+=360),r.push({i:e.push(Vr(e)+"rotate(",null,")")-2,x:mr(t,n)})):n&&e.push(Vr(e)+"rotate("+n+")")}function Wr(t,n,e,r){t!==n?r.push({i:e.push(Vr(e)+"skewX(",null,")")-2,x:mr(t,n)}):n&&e.push(Vr(e)+"skewX("+n+")")}function Hr(t,n,e,r){if(t[0]!==n[0]||t[1]!==n[1]){var i=e.push(Vr(e)+"scale(",null,",",null,")");r.push({i:i-4,x:mr(t[0],n[0])},{i:i-2,x:mr(t[1],n[1])})}else 1===n[0]&&1===n[1]||e.push(Vr(e)+"scale("+n+")")}function Yr(t,n){var e=[],r=[];return t=sa.transform(t),n=sa.transform(n),Br(t.translate,n.translate,e,r),Ur(t.rotate,n.rotate,e,r),Wr(t.skew,n.skew,e,r),Hr(t.scale,n.scale,e,r),t=n=null,function(t){for(var n,i=-1,o=r.length;++i<o;)e[(n=r[i]).i]=n.x(t);return e.join("")}}function Gr(t,n){return n=(n-=t=+t)||1/n,function(e){return(e-t)/n}}function Zr(t,n){return n=(n-=t=+t)||1/n,function(e){return Math.max(0,Math.min(1,(e-t)/n))}}function Xr(t){for(var n=t.source,e=t.target,r=Kr(n,e),i=[n];n!==r;)n=n.parent,i.push(n);for(var o=i.length;e!==r;)i.splice(o,0,e),e=e.parent;return i}function Jr(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Kr(t,n){if(t===n)return t;for(var e=Jr(t),r=Jr(n),i=e.pop(),o=r.pop(),a=null;i===o;)a=i,i=e.pop(),o=r.pop();return a}function Qr(t){t.fixed|=2}function ti(t){t.fixed&=-7}function ni(t){t.fixed|=4,t.px=t.x,t.py=t.y}function ei(t){t.fixed&=-5}function ri(t,n,e){var r=0,i=0;if(t.charge=0,!t.leaf)for(var o,a=t.nodes,u=a.length,s=-1;++s<u;)o=a[s],null!=o&&(ri(o,n,e),t.charge+=o.charge,r+=o.charge*o.cx,i+=o.charge*o.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,i+=l*t.point.y}t.cx=r/t.charge,t.cy=i/t.charge}function ii(t,n){return sa.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=ci,t}function oi(t,n){for(var e=[t];null!=(t=e.pop());)if(n(t),(i=t.children)&&(r=i.length))for(var r,i;--r>=0;)e.push(i[r])}function ai(t,n){for(var e=[t],r=[];null!=(t=e.pop());)if(r.push(t),(o=t.children)&&(i=o.length))for(var i,o,a=-1;++a<i;)e.push(o[a]);for(;null!=(t=r.pop());)n(t)}function ui(t){return t.children}function si(t){return t.value}function li(t,n){return n.value-t.value}function ci(t){return sa.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function fi(t){return t.x}function hi(t){return t.y}function pi(t,n,e){t.y0=n,t.y=e}function di(t){return sa.range(t.length)}function vi(t){for(var n=-1,e=t[0].length,r=[];++n<e;)r[n]=0;return r}function gi(t){for(var n,e=1,r=0,i=t[0][1],o=t.length;e<o;++e)(n=t[e][1])>i&&(r=e,i=n);return r}function mi(t){return t.reduce(yi,0)}function yi(t,n){return t+n[1]}function $i(t,n){return bi(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function bi(t,n){for(var e=-1,r=+t[0],i=(t[1]-r)/n,o=[];++e<=n;)o[e]=i*e+r;return o}function xi(t){return[sa.min(t),sa.max(t)]}function wi(t,n){return t.value-n.value}function Ci(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function Si(t,n){t._pack_next=n,n._pack_prev=t}function _i(t,n){var e=n.x-t.x,r=n.y-t.y,i=t.r+n.r;return.999*i*i>e*e+r*r}function Mi(t){function n(t){c=Math.min(t.x-t.r,c),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),p=Math.max(t.y+t.r,p)}if((e=t.children)&&(l=e.length)){var e,r,i,o,a,u,s,l,c=1/0,f=-(1/0),h=1/0,p=-(1/0);if(e.forEach(ki),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(i=e[1],i.x=i.r,i.y=0,n(i),l>2))for(o=e[2],Pi(r,i,o),n(o),Ci(r,o),r._pack_prev=o,Ci(o,i),i=r._pack_next,a=3;a<l;a++){Pi(r,i,o=e[a]);var d=0,v=1,g=1;for(u=i._pack_next;u!==i;u=u._pack_next,v++)if(_i(u,o)){d=1;break}if(1==d)for(s=r._pack_prev;s!==u._pack_prev&&!_i(s,o);s=s._pack_prev,g++);d?(v<g||v==g&&i.r<r.r?Si(r,i=u):Si(r=s,i),a--):(Ci(r,o),i=o,n(o))}var m=(c+f)/2,y=(h+p)/2,$=0;for(a=0;a<l;a++)o=e[a],o.x-=m,o.y-=y,$=Math.max($,o.r+Math.sqrt(o.x*o.x+o.y*o.y));t.r=$,e.forEach(Ai)}}function ki(t){t._pack_next=t._pack_prev=t}function Ai(t){delete t._pack_next,delete t._pack_prev}function Ei(t,n,e,r){var i=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,i)for(var o=-1,a=i.length;++o<a;)Ei(i[o],n,e,r)}function Pi(t,n,e){var r=t.r+e.r,i=n.x-t.x,o=n.y-t.y;if(r&&(i||o)){var a=n.r+e.r,u=i*i+o*o;a*=a,r*=r;var s=.5+(r-a)/(2*u),l=Math.sqrt(Math.max(0,2*a*(r+u)-(r-=u)*r-a*a))/(2*u);e.x=t.x+s*i+l*o,e.y=t.y+s*o-l*i}else e.x=t.x+r,e.y=t.y}function Oi(t,n){return t.parent==n.parent?1:2}function Ti(t){var n=t.children;return n.length?n[0]:t.t}function Li(t){var n,e=t.children;return(n=e.length)?e[n-1]:t.t}function ji(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}function Ni(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)n=i[o],n.z+=e,n.m+=e,e+=n.s+(r+=n.c)}function Ri(t,n,e){return t.a.parent===n.parent?t.a:e}function Di(t){return 1+sa.max(t,function(t){return t.y})}function Fi(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function Ii(t){var n=t.children;return n&&n.length?Ii(n[0]):t}function qi(t){var n,e=t.children;return e&&(n=e.length)?qi(e[n-1]):t}function zi(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Vi(t,n){var e=t.x+n[3],r=t.y+n[0],i=t.dx-n[1]-n[3],o=t.dy-n[0]-n[2];return i<0&&(e+=i/2,i=0),o<0&&(r+=o/2,o=0),{x:e,y:r,dx:i,dy:o}}function Bi(t){var n=t[0],e=t[t.length-1];return n<e?[n,e]:[e,n]}function Ui(t){return t.rangeExtent?t.rangeExtent():Bi(t.range())}function Wi(t,n,e,r){var i=e(t[0],t[1]),o=r(n[0],n[1]);return function(t){return o(i(t))}}function Hi(t,n){var e,r=0,i=t.length-1,o=t[r],a=t[i];return a<o&&(e=r,r=i,i=e,e=o,o=a,a=e),t[r]=n.floor(o),t[i]=n.ceil(a),t}function Yi(t){return t?{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}:Ss}function Gi(t,n,e,r){var i=[],o=[],a=0,u=Math.min(t.length,n.length)-1;for(t[u]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());++a<=u;)i.push(e(t[a-1],t[a])),o.push(r(n[a-1],n[a]));return function(n){var e=sa.bisect(t,n,1,u)-1;return o[e](i[e](n))}}function Zi(t,n,e,r){function i(){var i=Math.min(t.length,n.length)>2?Gi:Wi,s=r?Zr:Gr;return a=i(t,n,s,e),u=i(n,t,s,$r),o}function o(t){return a(t)}var a,u;return o.invert=function(t){return u(t)},o.domain=function(n){return arguments.length?(t=n.map(Number),i()):t},o.range=function(t){return arguments.length?(n=t,i()):n},o.rangeRound=function(t){return o.range(t).interpolate(Dr)},o.clamp=function(t){return arguments.length?(r=t,i()):r},o.interpolate=function(t){return arguments.length?(e=t,i()):e},o.ticks=function(n){return Qi(t,n)},o.tickFormat=function(n,e){return to(t,n,e)},o.nice=function(n){return Ji(t,n),i()},o.copy=function(){return Zi(t,n,e,r)},i()}function Xi(t,n){return sa.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Ji(t,n){return Hi(t,Yi(Ki(t,n)[2])),Hi(t,Yi(Ki(t,n)[2])),t}function Ki(t,n){null==n&&(n=10);var e=Bi(t),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),o=n/r*i;return o<=.15?i*=10:o<=.35?i*=5:o<=.75&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(t,n){return sa.range.apply(sa,Ki(t,n))}function to(t,n,e){var r=Ki(t,n);if(e){var i=hu.exec(e);if(i.shift(),"s"===i[8]){var o=sa.formatPrefix(Math.max(ba(r[0]),ba(r[1])));return i[7]||(i[7]="."+no(o.scale(r[2]))),i[8]="f",e=sa.format(i.join("")),function(t){return e(o.scale(t))+o.symbol}}i[7]||(i[7]="."+eo(i[8],r)),e=i.join("")}else e=",."+no(r[2])+"f";return sa.format(e)}function no(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}function eo(t,n){var e=no(n[2]);return t in _s?Math.abs(e-no(Math.max(ba(n[0]),ba(n[1]))))+ +("e"!==t):e-2*("%"===t)}function ro(t,n,e,r){function i(t){return(e?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(n)}function o(t){return e?Math.pow(n,t):-Math.pow(n,-t)}function a(n){return t(i(n))}return a.invert=function(n){return o(t.invert(n))},a.domain=function(n){return arguments.length?(e=n[0]>=0,t.domain((r=n.map(Number)).map(i)),a):r},a.base=function(e){return arguments.length?(n=+e,t.domain(r.map(i)),a):n},a.nice=function(){var n=Hi(r.map(i),e?Math:ks);return t.domain(n),r=n.map(o),a},a.ticks=function(){var t=Bi(r),a=[],u=t[0],s=t[1],l=Math.floor(i(u)),c=Math.ceil(i(s)),f=n%1?2:n;if(isFinite(c-l)){if(e){for(;l<c;l++)for(var h=1;h<f;h++)a.push(o(l)*h);a.push(o(l))}else for(a.push(o(l));l++<c;)for(var h=f-1;h>0;h--)a.push(o(l)*h);for(l=0;a[l]<u;l++);for(c=a.length;a[c-1]>s;c--);a=a.slice(l,c)}return a},a.tickFormat=function(t,e){if(!arguments.length)return Ms;arguments.length<2?e=Ms:"function"!=typeof e&&(e=sa.format(e));var r=Math.max(1,n*t/a.ticks().length);return function(t){var a=t/o(Math.round(i(t)));return a*n<n-.5&&(a*=n),a<=r?e(t):""}},a.copy=function(){return ro(t.copy(),n,e,r)},Xi(a,t)}function io(t,n,e){function r(n){return t(i(n))}var i=oo(n),o=oo(1/n);return r.invert=function(n){return o(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain((e=n.map(Number)).map(i)),r):e},r.ticks=function(t){return Qi(e,t)},r.tickFormat=function(t,n){return to(e,t,n)},r.nice=function(t){return r.domain(Ji(e,t))},
+r.exponent=function(a){return arguments.length?(i=oo(n=a),o=oo(1/n),t.domain(e.map(i)),r):n},r.copy=function(){return io(t.copy(),n,e)},Xi(r,t)}function oo(t){return function(n){return n<0?-Math.pow(-n,t):Math.pow(n,t)}}function ao(t,n){function e(e){return o[((i.get(e)||("range"===n.t?i.set(e,t.push(e)):NaN))-1)%o.length]}function r(n,e){return sa.range(t.length).map(function(t){return n+e*t})}var i,o,a;return e.domain=function(r){if(!arguments.length)return t;t=[],i=new l;for(var o,a=-1,u=r.length;++a<u;)i.has(o=r[a])||i.set(o,t.push(o));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(o=t,a=0,n={t:"range",a:arguments},e):o},e.rangePoints=function(i,u){arguments.length<2&&(u=0);var s=i[0],l=i[1],c=t.length<2?(s=(s+l)/2,0):(l-s)/(t.length-1+u);return o=r(s+c*u/2,c),a=0,n={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(i,u){arguments.length<2&&(u=0);var s=i[0],l=i[1],c=t.length<2?(s=l=Math.round((s+l)/2),0):(l-s)/(t.length-1+u)|0;return o=r(s+Math.round(c*u/2+(l-s-(t.length-1+u)*c)/2),c),a=0,n={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(i,u,s){arguments.length<2&&(u=0),arguments.length<3&&(s=u);var l=i[1]<i[0],c=i[l-0],f=i[1-l],h=(f-c)/(t.length-u+2*s);return o=r(c+h*s,h),l&&o.reverse(),a=h*(1-u),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(i,u,s){arguments.length<2&&(u=0),arguments.length<3&&(s=u);var l=i[1]<i[0],c=i[l-0],f=i[1-l],h=Math.floor((f-c)/(t.length-u+2*s));return o=r(c+Math.round((f-c-(t.length-u)*h)/2),h),l&&o.reverse(),a=Math.round(h*(1-u)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Bi(n.a[0])},e.copy=function(){return ao(t,n)},e.domain(t)}function uo(t,n){function o(){var e=0,r=n.length;for(u=[];++e<r;)u[e-1]=sa.quantile(t,e/r);return a}function a(t){if(!isNaN(t=+t))return n[sa.bisect(u,t)]}var u;return a.domain=function(n){return arguments.length?(t=n.map(r).filter(i).sort(e),o()):t},a.range=function(t){return arguments.length?(n=t,o()):n},a.quantiles=function(){return u},a.invertExtent=function(e){return e=n.indexOf(e),e<0?[NaN,NaN]:[e>0?u[e-1]:t[0],e<u.length?u[e]:t[t.length-1]]},a.copy=function(){return uo(t,n)},o()}function so(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(o*(n-t))))]}function i(){return o=e.length/(n-t),a=e.length-1,r}var o,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],i()):[t,n]},r.range=function(t){return arguments.length?(e=t,i()):e},r.invertExtent=function(n){return n=e.indexOf(n),n=n<0?NaN:n/o+t,[n,n+1/o]},r.copy=function(){return so(t,n,e)},i()}function lo(t,n){function e(e){if(e<=e)return n[sa.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.invertExtent=function(e){return e=n.indexOf(e),[t[e-1],t[e]]},e.copy=function(){return lo(t,n)},e}function co(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Qi(t,n)},n.tickFormat=function(n,e){return to(t,n,e)},n.copy=function(){return co(t)},n}function fo(){return 0}function ho(t){return t.innerRadius}function po(t){return t.outerRadius}function vo(t){return t.startAngle}function go(t){return t.endAngle}function mo(t){return t&&t.padAngle}function yo(t,n,e,r){return(t-e)*n-(n-r)*t>0?0:1}function $o(t,n,e,r,i){var o=t[0]-n[0],a=t[1]-n[1],u=(i?r:-r)/Math.sqrt(o*o+a*a),s=u*a,l=-u*o,c=t[0]+s,f=t[1]+l,h=n[0]+s,p=n[1]+l,d=(c+h)/2,v=(f+p)/2,g=h-c,m=p-f,y=g*g+m*m,$=e-r,b=c*p-h*f,x=(m<0?-1:1)*Math.sqrt(Math.max(0,$*$*y-b*b)),w=(b*m-g*x)/y,C=(-b*g-m*x)/y,S=(b*m+g*x)/y,_=(-b*g+m*x)/y,M=w-d,k=C-v,A=S-d,E=_-v;return M*M+k*k>A*A+E*E&&(w=S,C=_),[[w-s,C-l],[w*e/$,C*e/$]]}function bo(t){function n(n){function a(){l.push("M",o(t(c),u))}for(var s,l=[],c=[],f=-1,h=n.length,p=Mt(e),d=Mt(r);++f<h;)i.call(this,s=n[f],f)?c.push([+p.call(this,s,f),+d.call(this,s,f)]):c.length&&(a(),c=[]);return c.length&&a(),l.length?l.join(""):null}var e=Ee,r=Pe,i=Pn,o=xo,a=o.key,u=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(i=t,n):i},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?o=t:(o=Ls.get(t)||xo).key,n):a},n.tension=function(t){return arguments.length?(u=t,n):u},n}function xo(t){return t.length>1?t.join("L"):t+"Z"}function wo(t){return t.join("L")+"Z"}function Co(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("H",(r[0]+(r=t[n])[0])/2,"V",r[1]);return e>1&&i.push("H",r[0]),i.join("")}function So(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("V",(r=t[n])[1],"H",r[0]);return i.join("")}function _o(t){for(var n=0,e=t.length,r=t[0],i=[r[0],",",r[1]];++n<e;)i.push("H",(r=t[n])[0],"V",r[1]);return i.join("")}function Mo(t,n){return t.length<4?xo(t):t[1]+Eo(t.slice(1,-1),Po(t,n))}function ko(t,n){return t.length<3?wo(t):t[0]+Eo((t.push(t[0]),t),Po([t[t.length-2]].concat(t,[t[1]]),n))}function Ao(t,n){return t.length<3?xo(t):t[0]+Eo(t,Po(t,n))}function Eo(t,n){if(n.length<1||t.length!=n.length&&t.length!=n.length+2)return xo(t);var e=t.length!=n.length,r="",i=t[0],o=t[1],a=n[0],u=a,s=1;if(e&&(r+="Q"+(o[0]-2*a[0]/3)+","+(o[1]-2*a[1]/3)+","+o[0]+","+o[1],i=t[1],s=2),n.length>1){u=n[1],o=t[s],s++,r+="C"+(i[0]+a[0])+","+(i[1]+a[1])+","+(o[0]-u[0])+","+(o[1]-u[1])+","+o[0]+","+o[1];for(var l=2;l<n.length;l++,s++)o=t[s],u=n[l],r+="S"+(o[0]-u[0])+","+(o[1]-u[1])+","+o[0]+","+o[1]}if(e){var c=t[s];r+="Q"+(o[0]+2*u[0]/3)+","+(o[1]+2*u[1]/3)+","+c[0]+","+c[1]}return r}function Po(t,n){for(var e,r=[],i=(1-n)/2,o=t[0],a=t[1],u=1,s=t.length;++u<s;)e=o,o=a,a=t[u],r.push([i*(a[0]-e[0]),i*(a[1]-e[1])]);return r}function Oo(t){if(t.length<3)return xo(t);var n=1,e=t.length,r=t[0],i=r[0],o=r[1],a=[i,i,i,(r=t[1])[0]],u=[o,o,o,r[1]],s=[i,",",o,"L",No(Rs,a),",",No(Rs,u)];for(t.push(t[e-1]);++n<=e;)r=t[n],a.shift(),a.push(r[0]),u.shift(),u.push(r[1]),Ro(s,a,u);return t.pop(),s.push("L",r),s.join("")}function To(t){if(t.length<4)return xo(t);for(var n,e=[],r=-1,i=t.length,o=[0],a=[0];++r<3;)n=t[r],o.push(n[0]),a.push(n[1]);for(e.push(No(Rs,o)+","+No(Rs,a)),--r;++r<i;)n=t[r],o.shift(),o.push(n[0]),a.shift(),a.push(n[1]),Ro(e,o,a);return e.join("")}function Lo(t){for(var n,e,r=-1,i=t.length,o=i+4,a=[],u=[];++r<4;)e=t[r%i],a.push(e[0]),u.push(e[1]);for(n=[No(Rs,a),",",No(Rs,u)],--r;++r<o;)e=t[r%i],a.shift(),a.push(e[0]),u.shift(),u.push(e[1]),Ro(n,a,u);return n.join("")}function jo(t,n){var e=t.length-1;if(e)for(var r,i,o=t[0][0],a=t[0][1],u=t[e][0]-o,s=t[e][1]-a,l=-1;++l<=e;)r=t[l],i=l/e,r[0]=n*r[0]+(1-n)*(o+i*u),r[1]=n*r[1]+(1-n)*(a+i*s);return Oo(t)}function No(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ro(t,n,e){t.push("C",No(js,n),",",No(js,e),",",No(Ns,n),",",No(Ns,e),",",No(Rs,n),",",No(Rs,e))}function Do(t,n){return(n[1]-t[1])/(n[0]-t[0])}function Fo(t){for(var n=0,e=t.length-1,r=[],i=t[0],o=t[1],a=r[0]=Do(i,o);++n<e;)r[n]=(a+(a=Do(i=o,o=t[n+1])))/2;return r[n]=a,r}function Io(t){for(var n,e,r,i,o=[],a=Fo(t),u=-1,s=t.length-1;++u<s;)n=Do(t[u],t[u+1]),ba(n)<Da?a[u]=a[u+1]=0:(e=a[u]/n,r=a[u+1]/n,i=e*e+r*r,i>9&&(i=3*n/Math.sqrt(i),a[u]=i*e,a[u+1]=i*r));for(u=-1;++u<=s;)i=(t[Math.min(s,u+1)][0]-t[Math.max(0,u-1)][0])/(6*(1+a[u]*a[u])),o.push([i||0,a[u]*i||0]);return o}function qo(t){return t.length<3?xo(t):t[0]+Eo(t,Io(t))}function zo(t){for(var n,e,r,i=-1,o=t.length;++i<o;)n=t[i],e=n[0],r=n[1]-Va,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Vo(t){function n(n){function s(){v.push("M",u(t(m),f),c,l(t(g.reverse()),f),"Z")}for(var h,p,d,v=[],g=[],m=[],y=-1,$=n.length,b=Mt(e),x=Mt(i),w=e===r?function(){return p}:Mt(r),C=i===o?function(){return d}:Mt(o);++y<$;)a.call(this,h=n[y],y)?(g.push([p=+b.call(this,h,y),d=+x.call(this,h,y)]),m.push([+w.call(this,h,y),+C.call(this,h,y)])):g.length&&(s(),g=[],m=[]);return g.length&&s(),v.length?v.join(""):null}var e=Ee,r=Ee,i=0,o=Pe,a=Pn,u=xo,s=u.key,l=u,c="L",f=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(i=o=t,n):o},n.y0=function(t){return arguments.length?(i=t,n):i},n.y1=function(t){return arguments.length?(o=t,n):o},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(s="function"==typeof t?u=t:(u=Ls.get(t)||xo).key,l=u.reverse||u,c=u.closed?"M":"L",n):s},n.tension=function(t){return arguments.length?(f=t,n):f},n}function Bo(t){return t.radius}function Uo(t){return[t.x,t.y]}function Wo(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]-Va;return[e*Math.cos(r),e*Math.sin(r)]}}function Ho(){return 64}function Yo(){return"circle"}function Go(t){var n=Math.sqrt(t/Ia);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Zo(t){return function(){var n,e,r;(n=this[t])&&(r=n[e=n.active])&&(r.timer.c=null,r.timer.t=NaN,--n.count?delete n[e]:delete this[t],n.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Xo(t,n,e){return _a(t,Bs),t.namespace=n,t.id=e,t}function Jo(t,n,e,r){var i=t.id,o=t.namespace;return B(t,"function"==typeof e?function(t,a,u){t[o][i].tween.set(n,r(e.call(t,t.__data__,a,u)))}:(e=r(e),function(t){t[o][i].tween.set(n,e)}))}function Ko(t){return null==t&&(t=""),function(){this.textContent=t}}function Qo(t){return null==t?"__transition__":"__transition_"+t+"__"}function ta(t,n,e,r,i){function o(t){var n=v.delay;return c.t=n+s,n<=t?a(t-n):void(c.c=a)}function a(e){var i=d.active,o=d[i];o&&(o.timer.c=null,o.timer.t=NaN,--d.count,delete d[i],o.event&&o.event.interrupt.call(t,t.__data__,o.index));for(var a in d)if(+a<r){var l=d[a];l.timer.c=null,l.timer.t=NaN,--d.count,delete d[a]}c.c=u,Ot(function(){return c.c&&u(e||1)&&(c.c=null,c.t=NaN),1},0,s),d.active=r,v.event&&v.event.start.call(t,t.__data__,n),p=[],v.tween.forEach(function(e,r){(r=r.call(t,t.__data__,n))&&p.push(r)}),h=v.ease,f=v.duration}function u(i){for(var o=i/f,a=h(o),u=p.length;u>0;)p[--u].call(t,a);if(o>=1)return v.event&&v.event.end.call(t,t.__data__,n),--d.count?delete d[r]:delete t[e],1}var s,c,f,h,p,d=t[e]||(t[e]={active:0,count:0}),v=d[r];v||(s=i.time,c=Ot(o,0,s),v=d[r]={tween:new l,time:s,timer:c,delay:i.delay,duration:i.duration,ease:i.ease,index:n},i=null,++d.count)}function na(t,n,e){t.attr("transform",function(t){var r=n(t);return"translate("+(isFinite(r)?r:e(t))+",0)"})}function ea(t,n,e){t.attr("transform",function(t){var r=n(t);return"translate(0,"+(isFinite(r)?r:e(t))+")"})}function ra(t){return t.toISOString()}function ia(t,n,e){function r(n){return t(n)}function i(t,e){var r=t[1]-t[0],i=r/e,o=sa.bisect(Ks,i);return o==Ks.length?[n.year,Ki(t.map(function(t){return t/31536e6}),e)[2]]:o?n[i/Ks[o-1]<Ks[o]/i?o-1:o]:[nl,Ki(t,e)[2]]}return r.invert=function(n){return oa(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(oa)},r.nice=function(t,n){function e(e){return!isNaN(e)&&!t.range(e,oa(+e+1),n).length}var o=r.domain(),a=Bi(o),u=null==t?i(a,10):"number"==typeof t&&i(a,t);return u&&(t=u[0],n=u[1]),r.domain(Hi(o,n>1?{floor:function(n){for(;e(n=t.floor(n));)n=oa(n-1);return n},ceil:function(n){for(;e(n=t.ceil(n));)n=oa(+n+1);return n}}:t))},r.ticks=function(t,n){var e=Bi(r.domain()),o=null==t?i(e,10):"number"==typeof t?i(e,t):!t.range&&[{range:t},n];return o&&(t=o[0],n=o[1]),t.range(e[0],oa(+e[1]+1),n<1?1:n)},r.tickFormat=function(){return e},r.copy=function(){return ia(t.copy(),n,e)},Xi(r,t)}function oa(t){return new Date(t)}function aa(t){return JSON.parse(t.responseText)}function ua(t){var n=fa.createRange();return n.selectNode(fa.body),n.createContextualFragment(t.responseText)}var sa={version:"3.5.17"},la=[].slice,ca=function(t){return la.call(t)},fa=this.document;if(fa)try{ca(fa.documentElement.childNodes)[0].nodeType}catch(ha){ca=function(t){for(var n=t.length,e=new Array(n);n--;)e[n]=t[n];return e}}if(Date.now||(Date.now=function(){return+new Date}),fa)try{fa.createElement("DIV").style.setProperty("opacity",0,"")}catch(pa){var da=this.Element.prototype,va=da.setAttribute,ga=da.setAttributeNS,ma=this.CSSStyleDeclaration.prototype,ya=ma.setProperty;da.setAttribute=function(t,n){va.call(this,t,n+"")},da.setAttributeNS=function(t,n,e){ga.call(this,t,n,e+"")},ma.setProperty=function(t,n,e){ya.call(this,t,n+"",e)}}sa.ascending=e,sa.descending=function(t,n){return n<t?-1:n>t?1:n>=t?0:NaN},sa.min=function(t,n){var e,r,i=-1,o=t.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=t[i])&&r>=r){e=r;break}for(;++i<o;)null!=(r=t[i])&&e>r&&(e=r)}else{for(;++i<o;)if(null!=(r=n.call(t,t[i],i))&&r>=r){e=r;break}for(;++i<o;)null!=(r=n.call(t,t[i],i))&&e>r&&(e=r)}return e},sa.max=function(t,n){var e,r,i=-1,o=t.length;if(1===arguments.length){for(;++i<o;)if(null!=(r=t[i])&&r>=r){e=r;break}for(;++i<o;)null!=(r=t[i])&&r>e&&(e=r)}else{for(;++i<o;)if(null!=(r=n.call(t,t[i],i))&&r>=r){e=r;break}for(;++i<o;)null!=(r=n.call(t,t[i],i))&&r>e&&(e=r)}return e},sa.extent=function(t,n){var e,r,i,o=-1,a=t.length;if(1===arguments.length){for(;++o<a;)if(null!=(r=t[o])&&r>=r){e=i=r;break}for(;++o<a;)null!=(r=t[o])&&(e>r&&(e=r),i<r&&(i=r))}else{for(;++o<a;)if(null!=(r=n.call(t,t[o],o))&&r>=r){e=i=r;break}for(;++o<a;)null!=(r=n.call(t,t[o],o))&&(e>r&&(e=r),i<r&&(i=r))}return[e,i]},sa.sum=function(t,n){var e,r=0,o=t.length,a=-1;if(1===arguments.length)for(;++a<o;)i(e=+t[a])&&(r+=e);else for(;++a<o;)i(e=+n.call(t,t[a],a))&&(r+=e);return r},sa.mean=function(t,n){var e,o=0,a=t.length,u=-1,s=a;if(1===arguments.length)for(;++u<a;)i(e=r(t[u]))?o+=e:--s;else for(;++u<a;)i(e=r(n.call(t,t[u],u)))?o+=e:--s;if(s)return o/s},sa.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),i=+t[r-1],o=e-r;return o?i+o*(t[r]-i):i},sa.median=function(t,n){var o,a=[],u=t.length,s=-1;if(1===arguments.length)for(;++s<u;)i(o=r(t[s]))&&a.push(o);else for(;++s<u;)i(o=r(n.call(t,t[s],s)))&&a.push(o);if(a.length)return sa.quantile(a.sort(e),.5)},sa.variance=function(t,n){var e,o,a=t.length,u=0,s=0,l=-1,c=0;if(1===arguments.length)for(;++l<a;)i(e=r(t[l]))&&(o=e-u,u+=o/++c,s+=o*(e-u));else for(;++l<a;)i(e=r(n.call(t,t[l],l)))&&(o=e-u,u+=o/++c,s+=o*(e-u));if(c>1)return s/(c-1)},sa.deviation=function(){var t=sa.variance.apply(this,arguments);return t?Math.sqrt(t):t};var $a=o(e);sa.bisectLeft=$a.left,sa.bisect=sa.bisectRight=$a.right,sa.bisector=function(t){return o(1===t.length?function(n,r){return e(t(n),r)}:t)},sa.shuffle=function(t,n,e){(o=arguments.length)<3&&(e=t.length,o<2&&(n=0));for(var r,i,o=e-n;o;)i=Math.random()*o--|0,r=t[o+n],t[o+n]=t[i+n],t[i+n]=r;return t},sa.permute=function(t,n){for(var e=n.length,r=new Array(e);e--;)r[e]=t[n[e]];return r},sa.pairs=function(t){for(var n,e=0,r=t.length-1,i=t[0],o=new Array(r<0?0:r);e<r;)o[e]=[n=i,i=t[++e]];return o},sa.transpose=function(t){if(!(i=t.length))return[];for(var n=-1,e=sa.min(t,a),r=new Array(e);++n<e;)for(var i,o=-1,u=r[n]=new Array(i);++o<i;)u[o]=t[o][n];return r},sa.zip=function(){return sa.transpose(arguments)},sa.keys=function(t){var n=[];for(var e in t)n.push(e);return n},sa.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},sa.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},sa.merge=function(t){for(var n,e,r,i=t.length,o=-1,a=0;++o<i;)a+=t[o].length;for(e=new Array(a);--i>=0;)for(r=t[i],n=r.length;--n>=0;)e[--a]=r[n];return e};var ba=Math.abs;sa.range=function(t,n,e){if(arguments.length<3&&(e=1,arguments.length<2&&(n=t,t=0)),(n-t)/e===1/0)throw new Error("infinite range");var r,i=[],o=u(ba(e)),a=-1;if(t*=o,n*=o,e*=o,e<0)for(;(r=t+e*++a)>n;)i.push(r/o);else for(;(r=t+e*++a)<n;)i.push(r/o);return i},sa.map=function(t,n){var e=new l;if(t instanceof l)t.forEach(function(t,n){e.set(t,n)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(1===arguments.length)for(;++i<o;)e.set(i,t[i]);else for(;++i<o;)e.set(n.call(t,r=t[i],i),r)}else for(var a in t)e.set(a,t[a]);return e};var xa="__proto__",wa="\0";s(l,{has:h,get:function(t){return this._[c(t)]},set:function(t,n){return this._[c(t)]=n},remove:p,keys:d,values:function(){var t=[];for(var n in this._)t.push(this._[n]);return t},entries:function(){var t=[];for(var n in this._)t.push({key:f(n),value:this._[n]});return t},size:v,empty:g,forEach:function(t){for(var n in this._)t.call(this,f(n),this._[n])}}),sa.nest=function(){function t(n,a,u){if(u>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,c,f,h,p=-1,d=a.length,v=o[u++],g=new l;++p<d;)(h=g.get(s=v(c=a[p])))?h.push(c):g.set(s,[c]);return n?(c=n(),f=function(e,r){c.set(e,t(n,r,u))}):(c={},f=function(e,r){c[e]=t(n,r,u)}),g.forEach(f),c}function n(t,e){if(e>=o.length)return t;var r=[],i=a[e++];return t.forEach(function(t,i){r.push({key:t,values:n(i,e)})}),i?r.sort(function(t,n){return i(t.key,n.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(n,e){return t(e,n,0)},i.entries=function(e){return n(t(sa.map,e,0),0)},i.key=function(t){return o.push(t),i},i.sortKeys=function(t){return a[o.length-1]=t,i},i.sortValues=function(t){return e=t,i},i.rollup=function(t){return r=t,i},i},sa.set=function(t){var n=new m;if(t)for(var e=0,r=t.length;e<r;++e)n.add(t[e]);return n},s(m,{has:h,add:function(t){return this._[c(t+="")]=!0,t},remove:p,values:d,size:v,empty:g,forEach:function(t){for(var n in this._)t.call(this,f(n))}}),sa.behavior={},sa.rebind=function(t,n){for(var e,r=1,i=arguments.length;++r<i;)t[e=arguments[r]]=$(t,n,n[e]);return t};var Ca=["webkit","ms","moz","Moz","o","O"];sa.dispatch=function(){for(var t=new w,n=-1,e=arguments.length;++n<e;)t[arguments[n]]=C(t);return t},w.prototype.on=function(t,n){var e=t.indexOf("."),r="";if(e>=0&&(r=t.slice(e+1),t=t.slice(0,e)),t)return arguments.length<2?this[t].on(r):this[t].on(r,n);if(2===arguments.length){if(null==n)for(t in this)this.hasOwnProperty(t)&&this[t].on(r,null);return this}},sa.event=null,sa.requote=function(t){return t.replace(Sa,"\\$&")};var Sa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,_a={}.__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]},Ma=function(t,n){return n.querySelector(t)},ka=function(t,n){return n.querySelectorAll(t)},Aa=function(t,n){var e=t.matches||t[b(t,"matchesSelector")];return(Aa=function(t,n){return e.call(t,n)})(t,n)};"function"==typeof Sizzle&&(Ma=function(t,n){return Sizzle(t,n)[0]||null},ka=Sizzle,Aa=Sizzle.matchesSelector),sa.selection=function(){return sa.select(fa.documentElement)};var Ea=sa.selection.prototype=[];Ea.select=function(t){var n,e,r,i,o=[];t=A(t);for(var a=-1,u=this.length;++a<u;){o.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var s=-1,l=r.length;++s<l;)(i=r[s])?(n.push(e=t.call(i,i.__data__,s,a)),e&&"__data__"in i&&(e.__data__=i.__data__)):n.push(null)}return k(o)},Ea.selectAll=function(t){var n,e,r=[];t=E(t);for(var i=-1,o=this.length;++i<o;)for(var a=this[i],u=-1,s=a.length;++u<s;)(e=a[u])&&(r.push(n=ca(t.call(e,e.__data__,u,i))),n.parentNode=e);return k(r)};var Pa="http://www.w3.org/1999/xhtml",Oa={svg:"http://www.w3.org/2000/svg",xhtml:Pa,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};sa.ns={prefix:Oa,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Oa.hasOwnProperty(e)?{space:Oa[e],local:t}:t}},Ea.attr=function(t,n){if(arguments.length<2){if("string"==typeof t){var e=this.node();return t=sa.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(P(n,t[n]));return this}return this.each(P(t,n))},Ea.classed=function(t,n){if(arguments.length<2){if("string"==typeof t){var e=this.node(),r=(t=L(t)).length,i=-1;if(n=e.classList){for(;++i<r;)if(!n.contains(t[i]))return!1}else for(n=e.getAttribute("class");++i<r;)if(!T(t[i]).test(n))return!1;return!0}for(n in t)this.each(j(n,t[n]));return this}return this.each(j(t,n))},Ea.style=function(t,e,r){var i=arguments.length;if(i<3){if("string"!=typeof t){i<2&&(e="");for(r in t)this.each(R(r,t[r],e));return this}if(i<2){var o=this.node();return n(o).getComputedStyle(o,null).getPropertyValue(t)}r=""}return this.each(R(t,e,r))},Ea.property=function(t,n){if(arguments.length<2){if("string"==typeof t)return this.node()[t];for(n in t)this.each(D(n,t[n]));return this}return this.each(D(t,n))},Ea.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Ea.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Ea.append=function(t){return t=F(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Ea.insert=function(t,n){return t=F(t),n=A(n),this.select(function(){return this.insertBefore(t.apply(this,arguments),n.apply(this,arguments)||null)})},Ea.remove=function(){return this.each(I)},Ea.data=function(t,n){function e(t,e){var r,i,o,a=t.length,f=e.length,h=Math.min(a,f),p=new Array(f),d=new Array(f),v=new Array(a);if(n){var g,m=new l,y=new Array(a);for(r=-1;++r<a;)(i=t[r])&&(m.has(g=n.call(i,i.__data__,r))?v[r]=i:m.set(g,i),y[r]=g);for(r=-1;++r<f;)(i=m.get(g=n.call(e,o=e[r],r)))?i!==!0&&(p[r]=i,i.__data__=o):d[r]=q(o),m.set(g,!0);for(r=-1;++r<a;)r in y&&m.get(y[r])!==!0&&(v[r]=t[r])}else{for(r=-1;++r<h;)i=t[r],o=e[r],i?(i.__data__=o,p[r]=i):d[r]=q(o);for(;r<f;++r)d[r]=q(e[r]);for(;r<a;++r)v[r]=t[r]}d.update=p,d.parentNode=p.parentNode=v.parentNode=t.parentNode,u.push(d),s.push(p),c.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(t=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(t[o]=i.__data__);return t}var u=U([]),s=k([]),c=k([]);if("function"==typeof t)for(;++o<a;)e(r=this[o],t.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],t);return s.enter=function(){return u},s.exit=function(){return c},s},Ea.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Ea.filter=function(t){var n,e,r,i=[];"function"!=typeof t&&(t=z(t));for(var o=0,a=this.length;o<a;o++){i.push(n=[]),n.parentNode=(e=this[o]).parentNode;for(var u=0,s=e.length;u<s;u++)(r=e[u])&&t.call(r,r.__data__,u,o)&&n.push(r)}return k(i)},Ea.order=function(){for(var t=-1,n=this.length;++t<n;)for(var e,r=this[t],i=r.length-1,o=r[i];--i>=0;)(e=r[i])&&(o&&o!==e.nextSibling&&o.parentNode.insertBefore(e,o),o=e);return this},Ea.sort=function(t){t=V.apply(this,arguments);for(var n=-1,e=this.length;++n<e;)this[n].sort(t);return this.order()},Ea.each=function(t){return B(this,function(n,e,r){t.call(n,n.__data__,e,r)})},Ea.call=function(t){var n=ca(arguments);return t.apply(n[0]=this,n),this},Ea.empty=function(){return!this.node()},Ea.node=function(){for(var t=0,n=this.length;t<n;t++)for(var e=this[t],r=0,i=e.length;r<i;r++){var o=e[r];if(o)return o}return null},Ea.size=function(){var t=0;return B(this,function(){++t}),t};var Ta=[];sa.selection.enter=U,sa.selection.enter.prototype=Ta,Ta.append=Ea.append,Ta.empty=Ea.empty,Ta.node=Ea.node,Ta.call=Ea.call,Ta.size=Ea.size,Ta.select=function(t){for(var n,e,r,i,o,a=[],u=-1,s=this.length;++u<s;){r=(i=this[u]).update,a.push(n=[]),n.parentNode=i.parentNode;for(var l=-1,c=i.length;++l<c;)(o=i[l])?(n.push(r[l]=e=t.call(i.parentNode,o.__data__,l,u)),e.__data__=o.__data__):n.push(null)}return k(a)},Ta.insert=function(t,n){return arguments.length<2&&(n=W(this)),Ea.insert.call(this,t,n)},sa.select=function(n){var e;return"string"==typeof n?(e=[Ma(n,fa)],e.parentNode=fa.documentElement):(e=[n],e.parentNode=t(n)),k([e])},sa.selectAll=function(t){var n;return"string"==typeof t?(n=ca(ka(t,fa)),n.parentNode=fa.documentElement):(n=ca(t),n.parentNode=null),k([n])},Ea.on=function(t,n,e){var r=arguments.length;if(r<3){if("string"!=typeof t){r<2&&(n=!1);for(e in t)this.each(H(e,t[e],n));return this}if(r<2)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(H(t,n,e))};var La=sa.map({mouseenter:"mouseover",mouseleave:"mouseout"});fa&&La.forEach(function(t){"on"+t in fa&&La.remove(t)});var ja,Na=0;sa.mouse=function(t){return X(t,_())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;sa.touch=function(t,n,e){if(arguments.length<3&&(e=n,n=_().changedTouches),n)for(var r,i=0,o=n.length;i<o;++i)if((r=n[i]).identifier===e)return X(t,r)},sa.behavior.drag=function(){function t(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function e(t,n,e,o,a){return function(){function u(){var t,e,r=n(h,v);r&&(t=r[0]-$[0],e=r[1]-$[1],d|=t|e,$=r,p({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:t,dy:e}))}function s(){n(h,v)&&(m.on(o+g,null).on(a+g,null),y(d),p({type:"dragend"}))}var l,c=this,f=sa.event.target.correspondingElement||sa.event.target,h=c.parentNode,p=r.of(c,arguments),d=0,v=t(),g=".drag"+(null==v?"":"-"+v),m=sa.select(e(f)).on(o+g,u).on(a+g,s),y=Z(f),$=n(h,v);i?(l=i.apply(c,arguments),l=[l.x-$[0],l.y-$[1]]):l=[0,0],p({type:"dragstart"})}}var r=M(t,"drag","dragstart","dragend"),i=null,o=e(x,sa.mouse,n,"mousemove","mouseup"),a=e(J,sa.touch,y,"touchmove","touchend");return t.origin=function(n){return arguments.length?(i=n,t):i},sa.rebind(t,r,"on")},sa.touches=function(t,n){return arguments.length<2&&(n=_().touches),n?ca(n).map(function(n){var e=X(t,n);return e.identifier=n.identifier,e}):[]};var Da=1e-6,Fa=Da*Da,Ia=Math.PI,qa=2*Ia,za=qa-Da,Va=Ia/2,Ba=Ia/180,Ua=180/Ia,Wa=Math.SQRT2,Ha=2,Ya=4;sa.interpolateZoom=function(t,n){var e,r,i=t[0],o=t[1],a=t[2],u=n[0],s=n[1],l=n[2],c=u-i,f=s-o,h=c*c+f*f;if(h<Fa)r=Math.log(l/a)/Wa,e=function(t){return[i+t*c,o+t*f,a*Math.exp(Wa*t*r)]};else{var p=Math.sqrt(h),d=(l*l-a*a+Ya*h)/(2*a*Ha*p),v=(l*l-a*a-Ya*h)/(2*l*Ha*p),g=Math.log(Math.sqrt(d*d+1)-d),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-g)/Wa,e=function(t){var n=t*r,e=rt(g),u=a/(Ha*p)*(e*it(Wa*n+g)-et(g));return[i+u*c,o+u*f,a*e/rt(Wa*n+g)]}}return e.duration=1e3*r,e},sa.behavior.zoom=function(){function t(t){t.on(O,f).on(Za+".zoom",p).on("dblclick.zoom",d).on(j,h)}function e(t){return[(t[0]-_.x)/_.k,(t[1]-_.y)/_.k]}function r(t){return[t[0]*_.k+_.x,t[1]*_.k+_.y]}function i(t){_.k=Math.max(A[0],Math.min(A[1],t))}function o(t,n){n=r(n),_.x+=t[0]-n[0],_.y+=t[1]-n[1]}function a(n,e,r,a){n.__chart__={x:_.x,y:_.y,k:_.k},i(Math.pow(2,a)),o(g=e,r),n=sa.select(n),E>0&&(n=n.transition().duration(E)),n.call(t.event)}function u(){x&&x.domain(b.range().map(function(t){return(t-_.x)/_.k}).map(b.invert)),C&&C.domain(w.range().map(function(t){return(t-_.y)/_.k}).map(w.invert))}function s(t){P++||t({type:"zoomstart"})}function l(t){u(),t({type:"zoom",scale:_.k,translate:[_.x,_.y]})}function c(t){--P||(t({type:"zoomend"}),g=null)}function f(){function t(){u=1,o(sa.mouse(i),h),l(a)}function r(){f.on(T,null).on(L,null),p(u),c(a)}var i=this,a=N.of(i,arguments),u=0,f=sa.select(n(i)).on(T,t).on(L,r),h=e(sa.mouse(i)),p=Z(i);Vs.call(i),s(a)}function h(){function t(){var t=sa.touches(d);return p=_.k,t.forEach(function(t){t.identifier in g&&(g[t.identifier]=e(t))}),t}function n(){var n=sa.event.target;sa.select(n).on(b,r).on(x,u),w.push(n);for(var e=sa.event.changedTouches,i=0,o=e.length;i<o;++i)g[e[i].identifier]=null;var s=t(),l=Date.now();if(1===s.length){if(l-$<500){var c=s[0];a(d,c,g[c.identifier],Math.floor(Math.log(_.k)/Math.LN2)+1),S()}$=l}else if(s.length>1){var c=s[0],f=s[1],h=c[0]-f[0],p=c[1]-f[1];m=h*h+p*p}}function r(){var t,n,e,r,a=sa.touches(d);Vs.call(d);for(var u=0,s=a.length;u<s;++u,r=null)if(e=a[u],r=g[e.identifier]){if(n)break;t=e,n=r}if(r){var c=(c=e[0]-t[0])*c+(c=e[1]-t[1])*c,f=m&&Math.sqrt(c/m);t=[(t[0]+e[0])/2,(t[1]+e[1])/2],n=[(n[0]+r[0])/2,(n[1]+r[1])/2],i(f*p)}$=null,o(t,n),l(v)}function u(){if(sa.event.touches.length){for(var n=sa.event.changedTouches,e=0,r=n.length;e<r;++e)delete g[n[e].identifier];for(var i in g)return void t()}sa.selectAll(w).on(y,null),C.on(O,f).on(j,h),M(),c(v)}var p,d=this,v=N.of(d,arguments),g={},m=0,y=".zoom-"+sa.event.changedTouches[0].identifier,b="touchmove"+y,x="touchend"+y,w=[],C=sa.select(d),M=Z(d);n(),s(v),C.on(O,null).on(j,n)}function p(){var t=N.of(this,arguments);y?clearTimeout(y):(Vs.call(this),v=e(g=m||sa.mouse(this)),s(t)),y=setTimeout(function(){y=null,c(t)},50),S(),i(Math.pow(2,.002*Ga())*_.k),o(g,v),l(t)}function d(){var t=sa.mouse(this),n=Math.log(_.k)/Math.LN2;a(this,t,e(t),sa.event.shiftKey?Math.ceil(n)-1:Math.floor(n)+1)}var v,g,m,y,$,b,x,w,C,_={x:0,y:0,k:1},k=[960,500],A=Xa,E=250,P=0,O="mousedown.zoom",T="mousemove.zoom",L="mouseup.zoom",j="touchstart.zoom",N=M(t,"zoomstart","zoom","zoomend");return Za||(Za="onwheel"in fa?(Ga=function(){return-sa.event.deltaY*(sa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fa?(Ga=function(){return sa.event.wheelDelta},"mousewheel"):(Ga=function(){return-sa.event.detail},"MozMousePixelScroll")),t.event=function(t){t.each(function(){var t=N.of(this,arguments),n=_;qs?sa.select(this).transition().each("start.zoom",function(){_=this.__chart__||{x:0,y:0,k:1},s(t)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],i=g?g[0]:e/2,o=g?g[1]:r/2,a=sa.interpolateZoom([(i-_.x)/_.k,(o-_.y)/_.k,e/_.k],[(i-n.x)/n.k,(o-n.y)/n.k,e/n.k]);return function(n){var r=a(n),u=e/r[2];this.__chart__=_={x:i-r[0]*u,y:o-r[1]*u,k:u},l(t)}}).each("interrupt.zoom",function(){c(t)}).each("end.zoom",function(){c(t)}):(this.__chart__=_,s(t),l(t),c(t))})},t.translate=function(n){return arguments.length?(_={x:+n[0],y:+n[1],k:_.k},u(),t):[_.x,_.y]},t.scale=function(n){return arguments.length?(_={x:_.x,y:_.y,k:null},i(+n),u(),t):_.k},t.scaleExtent=function(n){return arguments.length?(A=null==n?Xa:[+n[0],+n[1]],t):A},t.center=function(n){return arguments.length?(m=n&&[+n[0],+n[1]],t):m},t.size=function(n){return arguments.length?(k=n&&[+n[0],+n[1]],t):k},t.duration=function(n){return arguments.length?(E=+n,t):E},t.x=function(n){return arguments.length?(x=n,b=n.copy(),_={x:0,y:0,k:1},t):x},t.y=function(n){return arguments.length?(C=n,w=n.copy(),_={x:0,y:0,k:1},t):C},sa.rebind(t,N,"on")};var Ga,Za,Xa=[0,1/0];sa.color=at,at.prototype.toString=function(){return this.rgb()+""},sa.hsl=ut;var Ja=ut.prototype=new at;Ja.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new ut(this.h,this.s,this.l/t)},Ja.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new ut(this.h,this.s,t*this.l)},Ja.rgb=function(){return st(this.h,this.s,this.l)},sa.hcl=lt;var Ka=lt.prototype=new at;Ka.brighter=function(t){return new lt(this.h,this.c,Math.min(100,this.l+Qa*(arguments.length?t:1)))},Ka.darker=function(t){return new lt(this.h,this.c,Math.max(0,this.l-Qa*(arguments.length?t:1)))},Ka.rgb=function(){return ct(this.h,this.c,this.l).rgb()},sa.lab=ft;var Qa=18,tu=.95047,nu=1,eu=1.08883,ru=ft.prototype=new at;ru.brighter=function(t){return new ft(Math.min(100,this.l+Qa*(arguments.length?t:1)),this.a,this.b)},ru.darker=function(t){return new ft(Math.max(0,this.l-Qa*(arguments.length?t:1)),this.a,this.b)},ru.rgb=function(){return ht(this.l,this.a,this.b)},sa.rgb=mt;var iu=mt.prototype=new at;iu.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,i=30;return n||e||r?(n&&n<i&&(n=i),e&&e<i&&(e=i),r&&r<i&&(r=i),new mt(Math.min(255,n/t),Math.min(255,e/t),Math.min(255,r/t))):new mt(i,i,i)},iu.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new mt(t*this.r,t*this.g,t*this.b)},iu.hsl=function(){return wt(this.r,this.g,this.b)},iu.toString=function(){return"#"+bt(this.r)+bt(this.g)+bt(this.b)};var ou=sa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,
+darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ou.forEach(function(t,n){ou.set(t,yt(n))}),sa.functor=Mt,sa.xhr=kt(y),sa.dsv=function(t,n){function e(t,e,o){arguments.length<3&&(o=e,e=null);var a=At(t,n,null==e?r:i(e),o);return a.row=function(t){return arguments.length?a.response(null==(e=t)?r:i(t)):e},a}function r(t){return e.parse(t.responseText)}function i(t){return function(n){return e.parse(n.responseText,t)}}function o(n){return n.map(a).join(t)}function a(t){return u.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var u=new RegExp('["'+t+"\n]"),s=t.charCodeAt(0);return e.parse=function(t,n){var r;return e.parseRows(t,function(t,e){if(r)return r(t,e-1);var i=new Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}");r=n?function(t,e){return n(i(t),e)}:i})},e.parseRows=function(t,n){function e(){if(c>=l)return a;if(i)return i=!1,o;var n=c;if(34===t.charCodeAt(n)){for(var e=n;e++<l;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}c=e+2;var r=t.charCodeAt(e+1);return 13===r?(i=!0,10===t.charCodeAt(e+2)&&++c):10===r&&(i=!0),t.slice(n+1,e).replace(/""/g,'"')}for(;c<l;){var r=t.charCodeAt(c++),u=1;if(10===r)i=!0;else if(13===r)i=!0,10===t.charCodeAt(c)&&(++c,++u);else if(r!==s)continue;return t.slice(n,c-u)}return t.slice(n)}for(var r,i,o={},a={},u=[],l=t.length,c=0,f=0;(r=e())!==a;){for(var h=[];r!==o&&r!==a;)h.push(r),r=e();n&&null==(h=n(h,f++))||u.push(h)}return u},e.format=function(n){if(Array.isArray(n[0]))return e.formatRows(n);var r=new m,i=[];return n.forEach(function(t){for(var n in t)r.has(n)||i.push(r.add(n))}),[i.map(a).join(t)].concat(n.map(function(n){return i.map(function(t){return a(n[t])}).join(t)})).join("\n")},e.formatRows=function(t){return t.map(o).join("\n")},e},sa.csv=sa.dsv(",","text/csv"),sa.tsv=sa.dsv("\t","text/tab-separated-values");var au,uu,su,lu,cu=this[b(this,"requestAnimationFrame")]||function(t){setTimeout(t,17)};sa.timer=function(){Ot.apply(this,arguments)},sa.timer.flush=function(){Lt(),jt()},sa.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)};var fu=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(Rt);sa.formatPrefix=function(t,n){var e=0;return(t=+t)&&(t<0&&(t*=-1),n&&(t=sa.round(t,Nt(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),fu[8+e/3]};var hu=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pu=sa.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return(t=sa.round(t,Nt(t,n))).toFixed(Math.max(0,Math.min(20,Nt(t*(1+1e-15),n))))}}),du=sa.time={},vu=Date;It.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){gu.setUTCDate.apply(this._,arguments)},setDay:function(){gu.setUTCDay.apply(this._,arguments)},setFullYear:function(){gu.setUTCFullYear.apply(this._,arguments)},setHours:function(){gu.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){gu.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){gu.setUTCMinutes.apply(this._,arguments)},setMonth:function(){gu.setUTCMonth.apply(this._,arguments)},setSeconds:function(){gu.setUTCSeconds.apply(this._,arguments)},setTime:function(){gu.setTime.apply(this._,arguments)}};var gu=Date.prototype;du.year=qt(function(t){return t=du.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),du.years=du.year.range,du.years.utc=du.year.utc.range,du.day=qt(function(t){var n=new vu(2e3,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),du.days=du.day.range,du.days.utc=du.day.utc.range,du.dayOfYear=function(t){var n=du.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(t,n){n=7-n;var e=du[t]=qt(function(t){return(t=du.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=du.year(t).getDay();return Math.floor((du.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});du[t+"s"]=e.range,du[t+"s"].utc=e.utc.range,du[t+"OfYear"]=function(t){var e=du.year(t).getDay();return Math.floor((du.dayOfYear(t)+(e+n)%7)/7)}}),du.week=du.sunday,du.weeks=du.sunday.range,du.weeks.utc=du.sunday.utc.range,du.weekOfYear=du.sundayOfYear;var mu={"-":"",_:" ",0:"0"},yu=/^\s*\d+/,$u=/^%/;sa.locale=function(t){return{numberFormat:Dt(t),timeFormat:Vt(t)}};var bu=sa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});sa.format=bu.numberFormat,sa.geo={},cn.prototype={s:0,t:0,add:function(t){fn(t,this.t,xu),fn(xu.s,this.s,this),this.s?this.t+=xu.t:this.s=xu.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xu=new cn;sa.geo.stream=function(t,n){t&&wu.hasOwnProperty(t.type)?wu[t.type](t,n):hn(t,n)};var wu={Feature:function(t,n){hn(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r<i;)hn(e[r].geometry,n)}},Cu={Sphere:function(t,n){n.sphere()},Point:function(t,n){t=t.coordinates,n.point(t[0],t[1],t[2])},MultiPoint:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)t=e[r],n.point(t[0],t[1],t[2])},LineString:function(t,n){pn(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)pn(e[r],n,0)},Polygon:function(t,n){dn(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,i=e.length;++r<i;)dn(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,i=e.length;++r<i;)hn(e[r],n)}};sa.geo.area=function(t){return Su=0,sa.geo.stream(t,Mu),Su};var Su,_u=new cn,Mu={sphere:function(){Su+=4*Ia},point:x,lineStart:x,lineEnd:x,polygonStart:function(){_u.reset(),Mu.lineStart=vn},polygonEnd:function(){var t=2*_u;Su+=t<0?4*Ia+t:t,Mu.lineStart=Mu.lineEnd=Mu.point=x}};sa.geo.bounds=function(){function t(t,n){$.push(b=[c=t,h=t]),n<f&&(f=n),n>p&&(p=n)}function n(n,e){var r=gn([n*Ba,e*Ba]);if(m){var i=yn(m,r),o=[i[1],-i[0],0],a=yn(o,i);xn(a),a=wn(a);var s=n-d,l=s>0?1:-1,v=a[0]*Ua*l,g=ba(s)>180;if(g^(l*d<v&&v<l*n)){var y=a[1]*Ua;y>p&&(p=y)}else if(v=(v+360)%360-180,g^(l*d<v&&v<l*n)){var y=-a[1]*Ua;y<f&&(f=y)}else e<f&&(f=e),e>p&&(p=e);g?n<d?u(c,n)>u(c,h)&&(h=n):u(n,h)>u(c,h)&&(c=n):h>=c?(n<c&&(c=n),n>h&&(h=n)):n>d?u(c,n)>u(c,h)&&(h=n):u(n,h)>u(c,h)&&(c=n)}else t(n,e);m=r,d=n}function e(){x.point=n}function r(){b[0]=c,b[1]=h,x.point=t,m=null}function i(t,e){if(m){var r=t-d;y+=ba(r)>180?r+(r>0?360:-360):r}else v=t,g=e;Mu.point(t,e),n(t,e)}function o(){Mu.lineStart()}function a(){i(v,g),Mu.lineEnd(),ba(y)>Da&&(c=-(h=180)),b[0]=c,b[1]=h,m=null}function u(t,n){return(n-=t)<0?n+360:n}function s(t,n){return t[0]-n[0]}function l(t,n){return n[0]<=n[1]?n[0]<=t&&t<=n[1]:t<n[0]||n[1]<t}var c,f,h,p,d,v,g,m,y,$,b,x={point:t,lineStart:e,lineEnd:r,polygonStart:function(){x.point=i,x.lineStart=o,x.lineEnd=a,y=0,Mu.polygonStart()},polygonEnd:function(){Mu.polygonEnd(),x.point=t,x.lineStart=e,x.lineEnd=r,_u<0?(c=-(h=180),f=-(p=90)):y>Da?p=90:y<-Da&&(f=-90),b[0]=c,b[1]=h}};return function(t){p=h=-(c=f=1/0),$=[],sa.geo.stream(t,x);var n=$.length;if(n){$.sort(s);for(var e,r=1,i=$[0],o=[i];r<n;++r)e=$[r],l(e[0],i)||l(e[1],i)?(u(i[0],e[1])>u(i[0],i[1])&&(i[1]=e[1]),u(e[0],i[1])>u(i[0],i[1])&&(i[0]=e[0])):o.push(i=e);for(var a,e,d=-(1/0),n=o.length-1,r=0,i=o[n];r<=n;i=e,++r)e=o[r],(a=u(i[1],e[0]))>d&&(d=a,c=e[0],h=i[1])}return $=b=null,c===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[c,f],[h,p]]}}(),sa.geo.centroid=function(t){ku=Au=Eu=Pu=Ou=Tu=Lu=ju=Nu=Ru=Du=0,sa.geo.stream(t,Fu);var n=Nu,e=Ru,r=Du,i=n*n+e*e+r*r;return i<Fa&&(n=Tu,e=Lu,r=ju,Au<Da&&(n=Eu,e=Pu,r=Ou),i=n*n+e*e+r*r,i<Fa)?[NaN,NaN]:[Math.atan2(e,n)*Ua,nt(r/Math.sqrt(i))*Ua]};var ku,Au,Eu,Pu,Ou,Tu,Lu,ju,Nu,Ru,Du,Fu={sphere:x,point:Sn,lineStart:Mn,lineEnd:kn,polygonStart:function(){Fu.lineStart=An},polygonEnd:function(){Fu.lineStart=Mn}},Iu=jn(Pn,Fn,qn,[-Ia,-Ia/2]),qu=1e9;sa.geo.clipExtent=function(){var t,n,e,r,i,o,a={stream:function(t){return i&&(i.valid=!1),i=o(t),i.valid=!0,i},extent:function(u){return arguments.length?(o=Un(t=+u[0][0],n=+u[0][1],e=+u[1][0],r=+u[1][1]),i&&(i.valid=!1,i=null),a):[[t,n],[e,r]]}};return a.extent([[0,0],[960,500]])},(sa.geo.conicEqualArea=function(){return Wn(Hn)}).raw=Hn,sa.geo.albers=function(){return sa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},sa.geo.albersUsa=function(){function t(t){var o=t[0],a=t[1];return n=null,e(o,a),n||(r(o,a),n)||i(o,a),n}var n,e,r,i,o=sa.geo.albers(),a=sa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),u=sa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),s={point:function(t,e){n=[t,e]}};return t.invert=function(t){var n=o.scale(),e=o.translate(),r=(t[0]-e[0])/n,i=(t[1]-e[1])/n;return(i>=.12&&i<.234&&r>=-.425&&r<-.214?a:i>=.166&&i<.234&&r>=-.214&&r<-.115?u:o).invert(t)},t.stream=function(t){var n=o.stream(t),e=a.stream(t),r=u.stream(t);return{point:function(t,i){n.point(t,i),e.point(t,i),r.point(t,i)},sphere:function(){n.sphere(),e.sphere(),r.sphere()},lineStart:function(){n.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){n.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){n.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){n.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},t.precision=function(n){return arguments.length?(o.precision(n),a.precision(n),u.precision(n),t):o.precision()},t.scale=function(n){return arguments.length?(o.scale(n),a.scale(.35*n),u.scale(n),t.translate(o.translate())):o.scale()},t.translate=function(n){if(!arguments.length)return o.translate();var l=o.scale(),c=+n[0],f=+n[1];return e=o.translate(n).clipExtent([[c-.455*l,f-.238*l],[c+.455*l,f+.238*l]]).stream(s).point,r=a.translate([c-.307*l,f+.201*l]).clipExtent([[c-.425*l+Da,f+.12*l+Da],[c-.214*l-Da,f+.234*l-Da]]).stream(s).point,i=u.translate([c-.205*l,f+.212*l]).clipExtent([[c-.214*l+Da,f+.166*l+Da],[c-.115*l-Da,f+.234*l-Da]]).stream(s).point,t},t.scale(1070)};var zu,Vu,Bu,Uu,Wu,Hu,Yu={point:x,lineStart:x,lineEnd:x,polygonStart:function(){Vu=0,Yu.lineStart=Yn},polygonEnd:function(){Yu.lineStart=Yu.lineEnd=Yu.point=x,zu+=ba(Vu/2)}},Gu={point:Gn,lineStart:x,lineEnd:x,polygonStart:x,polygonEnd:x},Zu={point:Jn,lineStart:Kn,lineEnd:Qn,polygonStart:function(){Zu.lineStart=te},polygonEnd:function(){Zu.point=Jn,Zu.lineStart=Kn,Zu.lineEnd=Qn}};sa.geo.path=function(){function t(t){return t&&("function"==typeof u&&o.pointRadius(+u.apply(this,arguments)),a&&a.valid||(a=i(o)),sa.geo.stream(t,a)),o.result()}function n(){return a=null,t}var e,r,i,o,a,u=4.5;return t.area=function(t){return zu=0,sa.geo.stream(t,i(Yu)),zu},t.centroid=function(t){return Eu=Pu=Ou=Tu=Lu=ju=Nu=Ru=Du=0,sa.geo.stream(t,i(Zu)),Du?[Nu/Du,Ru/Du]:ju?[Tu/ju,Lu/ju]:Ou?[Eu/Ou,Pu/Ou]:[NaN,NaN]},t.bounds=function(t){return Wu=Hu=-(Bu=Uu=1/0),sa.geo.stream(t,i(Gu)),[[Bu,Uu],[Wu,Hu]]},t.projection=function(t){return arguments.length?(i=(e=t)?t.stream||re(t):y,n()):e},t.context=function(t){return arguments.length?(o=null==(r=t)?new Zn:new ne(t),"function"!=typeof u&&o.pointRadius(u),n()):r},t.pointRadius=function(n){return arguments.length?(u="function"==typeof n?n:(o.pointRadius(+n),+n),t):u},t.projection(sa.geo.albersUsa()).context(null)},sa.geo.transform=function(t){return{stream:function(n){var e=new ie(n);for(var r in t)e[r]=t[r];return e}}},ie.prototype={point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},sa.geo.projection=ae,sa.geo.projectionMutator=ue,(sa.geo.equirectangular=function(){return ae(le)}).raw=le.invert=le,sa.geo.rotation=function(t){function n(n){return n=t(n[0]*Ba,n[1]*Ba),n[0]*=Ua,n[1]*=Ua,n}return t=fe(t[0]%360*Ba,t[1]*Ba,t.length>2?t[2]*Ba:0),n.invert=function(n){return n=t.invert(n[0]*Ba,n[1]*Ba),n[0]*=Ua,n[1]*=Ua,n},n},ce.invert=le,sa.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=fe(-t[0]*Ba,-t[1]*Ba,0).invert,i=[];return e(null,null,1,{point:function(t,e){i.push(t=n(t,e)),t[0]*=Ua,t[1]*=Ua}}),{type:"Polygon",coordinates:[i]}}var n,e,r=[0,0],i=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=ve((n=+r)*Ba,i*Ba),t):n},t.precision=function(r){return arguments.length?(e=ve(n*Ba,(i=+r)*Ba),t):i},t.angle(90)},sa.geo.distance=function(t,n){var e,r=(n[0]-t[0])*Ba,i=t[1]*Ba,o=n[1]*Ba,a=Math.sin(r),u=Math.cos(r),s=Math.sin(i),l=Math.cos(i),c=Math.sin(o),f=Math.cos(o);return Math.atan2(Math.sqrt((e=f*a)*e+(e=l*c-s*f*u)*e),s*c+l*f*u)},sa.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return sa.range(Math.ceil(o/g)*g,i,g).map(h).concat(sa.range(Math.ceil(l/m)*m,s,m).map(p)).concat(sa.range(Math.ceil(r/d)*d,e,d).filter(function(t){return ba(t%g)>Da}).map(c)).concat(sa.range(Math.ceil(u/v)*v,a,v).filter(function(t){return ba(t%m)>Da}).map(f))}var e,r,i,o,a,u,s,l,c,f,h,p,d=10,v=d,g=90,m=360,y=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(p(s).slice(1),h(i).reverse().slice(1),p(l).reverse().slice(1))]}},t.extent=function(n){return arguments.length?t.majorExtent(n).minorExtent(n):t.minorExtent()},t.majorExtent=function(n){return arguments.length?(o=+n[0][0],i=+n[1][0],l=+n[0][1],s=+n[1][1],o>i&&(n=o,o=i,i=n),l>s&&(n=l,l=s,s=n),t.precision(y)):[[o,l],[i,s]]},t.minorExtent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],u=+n[0][1],a=+n[1][1],r>e&&(n=r,r=e,e=n),u>a&&(n=u,u=a,a=n),t.precision(y)):[[r,u],[e,a]]},t.step=function(n){return arguments.length?t.majorStep(n).minorStep(n):t.minorStep()},t.majorStep=function(n){return arguments.length?(g=+n[0],m=+n[1],t):[g,m]},t.minorStep=function(n){return arguments.length?(d=+n[0],v=+n[1],t):[d,v]},t.precision=function(n){return arguments.length?(y=+n,c=me(u,a,90),f=ye(r,e,y),h=me(l,s,90),p=ye(o,i,y),t):y},t.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},sa.geo.greatArc=function(){function t(){return{type:"LineString",coordinates:[n||r.apply(this,arguments),e||i.apply(this,arguments)]}}var n,e,r=$e,i=be;return t.distance=function(){return sa.geo.distance(n||r.apply(this,arguments),e||i.apply(this,arguments))},t.source=function(e){return arguments.length?(r=e,n="function"==typeof e?null:e,t):r},t.target=function(n){return arguments.length?(i=n,e="function"==typeof n?null:n,t):i},t.precision=function(){return arguments.length?t:0},t},sa.geo.interpolate=function(t,n){return xe(t[0]*Ba,t[1]*Ba,n[0]*Ba,n[1]*Ba)},sa.geo.length=function(t){return Xu=0,sa.geo.stream(t,Ju),Xu};var Xu,Ju={sphere:x,point:x,lineStart:we,lineEnd:x,polygonStart:x,polygonEnd:x},Ku=Ce(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(sa.geo.azimuthalEqualArea=function(){return ae(Ku)}).raw=Ku;var Qu=Ce(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},y);(sa.geo.azimuthalEquidistant=function(){return ae(Qu)}).raw=Qu,(sa.geo.conicConformal=function(){return Wn(Se)}).raw=Se,(sa.geo.conicEquidistant=function(){return Wn(_e)}).raw=_e;var ts=Ce(function(t){return 1/t},Math.atan);(sa.geo.gnomonic=function(){return ae(ts)}).raw=ts,Me.invert=function(t,n){return[t,2*Math.atan(Math.exp(n))-Va]},(sa.geo.mercator=function(){return ke(Me)}).raw=Me;var ns=Ce(function(){return 1},Math.asin);(sa.geo.orthographic=function(){return ae(ns)}).raw=ns;var es=Ce(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(sa.geo.stereographic=function(){return ae(es)}).raw=es,Ae.invert=function(t,n){return[-n,2*Math.atan(Math.exp(t))-Va]},(sa.geo.transverseMercator=function(){var t=ke(Ae),n=t.center,e=t.rotate;return t.center=function(t){return t?n([-t[1],t[0]]):(t=n(),[t[1],-t[0]])},t.rotate=function(t){return t?e([t[0],t[1],t.length>2?t[2]+90:90]):(t=e(),[t[0],t[1],t[2]-90])},e([0,0,90])}).raw=Ae,sa.geom={},sa.geom.hull=function(t){function n(t){if(t.length<3)return[];var n,i=Mt(e),o=Mt(r),a=t.length,u=[],s=[];for(n=0;n<a;n++)u.push([+i.call(this,t[n],n),+o.call(this,t[n],n),n]);for(u.sort(Te),n=0;n<a;n++)s.push([u[n][0],-u[n][1]]);var l=Oe(u),c=Oe(s),f=c[0]===l[0],h=c[c.length-1]===l[l.length-1],p=[];for(n=l.length-1;n>=0;--n)p.push(t[u[l[n]][2]]);for(n=+f;n<c.length-h;++n)p.push(t[u[c[n]][2]]);return p}var e=Ee,r=Pe;return arguments.length?n(t):(n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n)},sa.geom.polygon=function(t){return _a(t,rs),t};var rs=sa.geom.polygon.prototype=[];rs.area=function(){for(var t,n=-1,e=this.length,r=this[e-1],i=0;++n<e;)t=r,r=this[n],i+=t[1]*r[0]-t[0]*r[1];return.5*i},rs.centroid=function(t){var n,e,r=-1,i=this.length,o=0,a=0,u=this[i-1];for(arguments.length||(t=-1/(6*this.area()));++r<i;)n=u,u=this[r],e=n[0]*u[1]-u[0]*n[1],o+=(n[0]+u[0])*e,a+=(n[1]+u[1])*e;return[o*t,a*t]},rs.clip=function(t){for(var n,e,r,i,o,a,u=Ne(t),s=-1,l=this.length-Ne(this),c=this[l-1];++s<l;){for(n=t.slice(),t.length=0,i=this[s],o=n[(r=n.length-u)-1],e=-1;++e<r;)a=n[e],Le(a,c,i)?(Le(o,c,i)||t.push(je(o,a,c,i)),t.push(a)):Le(o,c,i)&&t.push(je(o,a,c,i)),o=a;u&&t.push(t[0]),c=i}return t};var is,os,as,us,ss,ls=[],cs=[];Be.prototype.prepare=function(){for(var t,n=this.edges,e=n.length;e--;)t=n[e].edge,t.b&&t.a||n.splice(e,1);return n.sort(We),n.length},nr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=ar(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)r=e.U,e===r.L?(i=r.R,i&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(ir(this,e),t=e,e=t.U),e.C=!1,r.C=!0,or(this,r))):(i=r.L,i&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&(or(this,e),t=e,e=t.U),e.C=!1,r.C=!0,ir(this,r))),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,a=t.R;if(e=o?a?ar(a):o:a,i?i.L===t?i.L=e:i.R=e:this._=e,o&&a?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==a?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=a,a.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r){if(t&&t.C)return void(t.C=!1);do{if(t===this._)break;if(t===i.L){if(n=i.R,n.C&&(n.C=!1,i.C=!0,ir(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,or(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,ir(this,i),t=this._;break}}else if(n=i.L,n.C&&(n.C=!1,i.C=!0,or(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,ir(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,or(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}},sa.geom.voronoi=function(t){function n(t){var n=new Array(t.length),r=u[0][0],i=u[0][1],o=u[1][0],a=u[1][1];return ur(e(t),u).cells.forEach(function(e,u){var s=e.edges,l=e.site,c=n[u]=s.length?s.map(function(t){var n=t.start();return[n.x,n.y]}):l.x>=r&&l.x<=o&&l.y>=i&&l.y<=a?[[r,a],[o,a],[o,i],[r,i]]:[];c.point=t[u]}),n}function e(t){return t.map(function(t,n){return{x:Math.round(o(t,n)/Da)*Da,y:Math.round(a(t,n)/Da)*Da,i:n}})}var r=Ee,i=Pe,o=r,a=i,u=fs;return t?n(t):(n.links=function(t){return ur(e(t)).edges.filter(function(t){return t.l&&t.r}).map(function(n){return{source:t[n.l.i],target:t[n.r.i]}})},n.triangles=function(t){var n=[];return ur(e(t)).cells.forEach(function(e,r){for(var i,o,a=e.site,u=e.edges.sort(We),s=-1,l=u.length,c=u[l-1].edge,f=c.l===a?c.r:c.l;++s<l;)i=c,o=f,c=u[s].edge,f=c.l===a?c.r:c.l,r<o.i&&r<f.i&&lr(a,o,f)<0&&n.push([t[r],t[o.i],t[f.i]])}),n},n.x=function(t){return arguments.length?(o=Mt(r=t),n):r},n.y=function(t){return arguments.length?(a=Mt(i=t),n):i},n.clipExtent=function(t){return arguments.length?(u=null==t?fs:t,n):u===fs?null:u},n.size=function(t){return arguments.length?n.clipExtent(t&&[[0,0],t]):u===fs?null:u&&u[1]},n)};var fs=[[-1e6,-1e6],[1e6,1e6]];sa.geom.delaunay=function(t){return sa.geom.voronoi().triangles(t)},sa.geom.quadtree=function(t,n,e,r,i){function o(t){function o(t,n,e,r,i,o,a,u){if(!isNaN(e)&&!isNaN(r))if(t.leaf){var s=t.x,c=t.y;if(null!=s)if(ba(s-e)+ba(c-r)<.01)l(t,n,e,r,i,o,a,u);else{var f=t.point;t.x=t.y=t.point=null,l(t,f,s,c,i,o,a,u),l(t,n,e,r,i,o,a,u)}else t.x=e,t.y=r,t.point=n}else l(t,n,e,r,i,o,a,u)}function l(t,n,e,r,i,a,u,s){var l=.5*(i+u),c=.5*(a+s),f=e>=l,h=r>=c,p=h<<1|f;t.leaf=!1,t=t.nodes[p]||(t.nodes[p]=hr()),f?i=l:u=l,h?a=c:s=c,o(t,n,e,r,i,a,u,s)}var c,f,h,p,d,v,g,m,y,$=Mt(u),b=Mt(s);if(null!=n)v=n,g=e,m=r,y=i;else if(m=y=-(v=g=1/0),f=[],h=[],d=t.length,a)for(p=0;p<d;++p)c=t[p],c.x<v&&(v=c.x),c.y<g&&(g=c.y),c.x>m&&(m=c.x),c.y>y&&(y=c.y),f.push(c.x),h.push(c.y);else for(p=0;p<d;++p){var x=+$(c=t[p],p),w=+b(c,p);x<v&&(v=x),w<g&&(g=w),x>m&&(m=x),w>y&&(y=w),f.push(x),h.push(w)}var C=m-v,S=y-g;C>S?y=g+C:m=v+S;var _=hr();if(_.add=function(t){o(_,t,+$(t,++p),+b(t,p),v,g,m,y)},_.visit=function(t){pr(t,_,v,g,m,y)},_.find=function(t){return dr(_,t[0],t[1],v,g,m,y)},p=-1,null==n){for(;++p<d;)o(_,t[p],f[p],h[p],v,g,m,y);--p}else t.forEach(_.add);return f=h=t=c=null,_}var a,u=Ee,s=Pe;return(a=arguments.length)?(u=cr,s=fr,3===a&&(i=e,r=n,e=n=0),o(t)):(o.x=function(t){return arguments.length?(u=t,o):u},o.y=function(t){return arguments.length?(s=t,o):s},o.extent=function(t){return arguments.length?(null==t?n=e=r=i=null:(n=+t[0][0],e=+t[0][1],r=+t[1][0],i=+t[1][1]),o):null==n?null:[[n,e],[r,i]]},o.size=function(t){return arguments.length?(null==t?n=e=r=i=null:(n=e=0,r=+t[0],i=+t[1]),o):null==n?null:[r-n,i-e]},o)},sa.interpolateRgb=vr,sa.interpolateObject=gr,sa.interpolateNumber=mr,sa.interpolateString=yr;var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,ps=new RegExp(hs.source,"g");sa.interpolate=$r,sa.interpolators=[function(t,n){var e=typeof n;return("string"===e?ou.has(n.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(n)?vr:yr:n instanceof at?vr:Array.isArray(n)?br:"object"===e&&isNaN(n)?gr:mr)(t,n)}],sa.interpolateArray=br;var ds=function(){return y},vs=sa.map({linear:ds,poly:kr,quad:function(){return Sr},cubic:function(){return _r},sin:function(){return Ar},exp:function(){return Er},circle:function(){return Pr},elastic:Or,back:Tr,bounce:function(){return Lr}}),gs=sa.map({"in":y,out:wr,"in-out":Cr,"out-in":function(t){return Cr(wr(t))}});sa.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.slice(0,n):t,r=n>=0?t.slice(n+1):"in";return e=vs.get(e)||ds,r=gs.get(r)||y,xr(r(e.apply(null,la.call(arguments,1))))},sa.interpolateHcl=jr,sa.interpolateHsl=Nr,sa.interpolateLab=Rr,sa.interpolateRound=Dr,sa.transform=function(t){var n=fa.createElementNS(sa.ns.prefix.svg,"g");return(sa.transform=function(t){if(null!=t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate()}return new Fr(e?e.matrix:ms)})(t)},Fr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ms={a:1,b:0,c:0,d:1,e:0,f:0};sa.interpolateTransform=Yr,sa.layout={},sa.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;++e<r;)n.push(Xr(t[e]));return n}},sa.layout.chord=function(){function t(){var t,l,f,h,p,d={},v=[],g=sa.range(o),m=[];for(e=[],r=[],t=0,h=-1;++h<o;){for(l=0,p=-1;++p<o;)l+=i[h][p];v.push(l),m.push(sa.range(o)),t+=l}for(a&&g.sort(function(t,n){return a(v[t],v[n])}),u&&m.forEach(function(t,n){t.sort(function(t,e){return u(i[n][t],i[n][e])})}),t=(qa-c*o)/t,l=0,h=-1;++h<o;){for(f=l,p=-1;++p<o;){var y=g[h],$=m[y][p],b=i[y][$],x=l,w=l+=b*t;d[y+"-"+$]={index:y,subindex:$,startAngle:x,endAngle:w,value:b}}r[y]={index:y,startAngle:f,endAngle:l,value:v[y]},l+=c}for(h=-1;++h<o;)for(p=h-1;++p<o;){var C=d[h+"-"+p],S=d[p+"-"+h];(C.value||S.value)&&e.push(C.value<S.value?{source:S,target:C}:{source:C,target:S})}s&&n()}function n(){e.sort(function(t,n){return s((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,i,o,a,u,s,l={},c=0;return l.matrix=function(t){return arguments.length?(o=(i=t)&&i.length,e=r=null,l):i},l.padding=function(t){return arguments.length?(c=t,e=r=null,l):c},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(u=t,e=null,l):u},l.sortChords=function(t){return arguments.length?(s=t,e&&n(),l):s},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},sa.layout.force=function(){function t(t){return function(n,e,r,i){if(n.point!==t){var o=n.cx-t.x,a=n.cy-t.y,u=i-e,s=o*o+a*a;if(u*u/m<s){if(s<v){var l=n.charge/s;t.px-=o*l,t.py-=a*l}return!0}if(n.point&&s&&s<v){var l=n.pointCharge/s;t.px-=o*l,t.py-=a*l}}return!n.charge}}function n(t){t.px=sa.event.x,t.py=sa.event.y,s.resume()}var e,r,i,o,a,u,s={},l=sa.dispatch("start","tick","end"),c=[1,1],f=.9,h=ys,p=$s,d=-30,v=bs,g=.1,m=.64,$=[],b=[];return s.tick=function(){if((i*=.99)<.005)return e=null,l.end({type:"end",alpha:i=0}),!0;var n,r,s,h,p,v,m,y,x,w=$.length,C=b.length;for(r=0;r<C;++r)s=b[r],h=s.source,p=s.target,y=p.x-h.x,x=p.y-h.y,(v=y*y+x*x)&&(v=i*a[r]*((v=Math.sqrt(v))-o[r])/v,y*=v,x*=v,p.x-=y*(m=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=x*m,h.x+=y*(m=1-m),h.y+=x*m);if((m=i*g)&&(y=c[0]/2,x=c[1]/2,r=-1,m))for(;++r<w;)s=$[r],s.x+=(y-s.x)*m,s.y+=(x-s.y)*m;if(d)for(ri(n=sa.geom.quadtree($),i,u),r=-1;++r<w;)(s=$[r]).fixed||n.visit(t(s));for(r=-1;++r<w;)s=$[r],s.fixed?(s.x=s.px,s.y=s.py):(s.x-=(s.px-(s.px=s.x))*f,s.y-=(s.py-(s.py=s.y))*f);l.tick({type:"tick",alpha:i})},s.nodes=function(t){return arguments.length?($=t,s):$},s.links=function(t){return arguments.length?(b=t,s):b},s.size=function(t){return arguments.length?(c=t,s):c},s.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,s):h},s.distance=s.linkDistance,s.linkStrength=function(t){return arguments.length?(p="function"==typeof t?t:+t,s):p},s.friction=function(t){return arguments.length?(f=+t,s):f},s.charge=function(t){return arguments.length?(d="function"==typeof t?t:+t,s):d},s.chargeDistance=function(t){return arguments.length?(v=t*t,s):Math.sqrt(v)},s.gravity=function(t){return arguments.length?(g=+t,s):g},s.theta=function(t){return arguments.length?(m=t*t,s):Math.sqrt(m)},s.alpha=function(t){return arguments.length?(t=+t,i?t>0?i=t:(e.c=null,e.t=NaN,e=null,l.end({type:"end",alpha:i=0})):t>0&&(l.start({type:"start",alpha:i=t}),e=Ot(s.tick)),s):i},s.start=function(){function t(t,r){if(!e){for(e=new Array(i),s=0;s<i;++s)e[s]=[];for(s=0;s<l;++s){var o=b[s];e[o.source.index].push(o.target),e[o.target.index].push(o.source)}}for(var a,u=e[n],s=-1,c=u.length;++s<c;)if(!isNaN(a=u[s][t]))return a;return Math.random()*r}var n,e,r,i=$.length,l=b.length,f=c[0],v=c[1];for(n=0;n<i;++n)(r=$[n]).index=n,r.weight=0;for(n=0;n<l;++n)r=b[n],"number"==typeof r.source&&(r.source=$[r.source]),"number"==typeof r.target&&(r.target=$[r.target]),++r.source.weight,++r.target.weight;for(n=0;n<i;++n)r=$[n],isNaN(r.x)&&(r.x=t("x",f)),isNaN(r.y)&&(r.y=t("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(o=[],"function"==typeof h)for(n=0;n<l;++n)o[n]=+h.call(this,b[n],n);else for(n=0;n<l;++n)o[n]=h;if(a=[],"function"==typeof p)for(n=0;n<l;++n)a[n]=+p.call(this,b[n],n);else for(n=0;n<l;++n)a[n]=p;if(u=[],"function"==typeof d)for(n=0;n<i;++n)u[n]=+d.call(this,$[n],n);else for(n=0;n<i;++n)u[n]=d;return s.resume()},s.resume=function(){return s.alpha(.1)},s.stop=function(){return s.alpha(0)},s.drag=function(){return r||(r=sa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",n).on("dragend.force",ti)),arguments.length?void this.on("mouseover.force",ni).on("mouseout.force",ei).call(r):r},sa.rebind(s,l,"on")};var ys=20,$s=1,bs=1/0;sa.layout.hierarchy=function(){function t(i){var o,a=[i],u=[];for(i.depth=0;null!=(o=a.pop());)if(u.push(o),(l=e.call(t,o,o.depth))&&(s=l.length)){for(var s,l,c;--s>=0;)a.push(c=l[s]),c.parent=o,c.depth=o.depth+1;r&&(o.value=0),o.children=l}else r&&(o.value=+r.call(t,o,o.depth)||0),delete o.children;return ai(i,function(t){var e,i;n&&(e=t.children)&&e.sort(n),r&&(i=t.parent)&&(i.value+=t.value)}),u}var n=li,e=ui,r=si;return t.sort=function(e){return arguments.length?(n=e,t):n},t.children=function(n){return arguments.length?(e=n,t):e},t.value=function(n){return arguments.length?(r=n,t):r},t.revalue=function(n){return r&&(oi(n,function(t){t.children&&(t.value=0)}),ai(n,function(n){var e;n.children||(n.value=+r.call(t,n,n.depth)||0),(e=n.parent)&&(e.value+=n.value);
+})),n},t},sa.layout.partition=function(){function t(n,e,r,i){var o=n.children;if(n.x=e,n.y=n.depth*i,n.dx=r,n.dy=i,o&&(a=o.length)){var a,u,s,l=-1;for(r=n.value?r/n.value:0;++l<a;)t(u=o[l],e,s=u.value*r,i),e+=s}}function n(t){var e=t.children,r=0;if(e&&(i=e.length))for(var i,o=-1;++o<i;)r=Math.max(r,n(e[o]));return 1+r}function e(e,o){var a=r.call(this,e,o);return t(a[0],0,i[0],i[1]/n(a[0])),a}var r=sa.layout.hierarchy(),i=[1,1];return e.size=function(t){return arguments.length?(i=t,e):i},ii(e,r)},sa.layout.pie=function(){function t(a){var u,s=a.length,l=a.map(function(e,r){return+n.call(t,e,r)}),c=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof i?i.apply(this,arguments):i)-c,h=Math.min(Math.abs(f)/s,+("function"==typeof o?o.apply(this,arguments):o)),p=h*(f<0?-1:1),d=sa.sum(l),v=d?(f-s*p)/d:0,g=sa.range(s),m=[];return null!=e&&g.sort(e===xs?function(t,n){return l[n]-l[t]}:function(t,n){return e(a[t],a[n])}),g.forEach(function(t){m[t]={data:a[t],value:u=l[t],startAngle:c,endAngle:c+=u*v+p,padAngle:h}}),m}var n=Number,e=xs,r=0,i=qa,o=0;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(i=n,t):i},t.padAngle=function(n){return arguments.length?(o=n,t):o},t};var xs={};sa.layout.stack=function(){function t(u,s){if(!(h=u.length))return u;var l=u.map(function(e,r){return n.call(t,e,r)}),c=l.map(function(n){return n.map(function(n,e){return[o.call(t,n,e),a.call(t,n,e)]})}),f=e.call(t,c,s);l=sa.permute(l,f),c=sa.permute(c,f);var h,p,d,v,g=r.call(t,c,s),m=l[0].length;for(d=0;d<m;++d)for(i.call(t,l[0][d],v=g[d],c[0][d][1]),p=1;p<h;++p)i.call(t,l[p][d],v+=c[p-1][d][1],c[p][d][1]);return u}var n=y,e=di,r=vi,i=pi,o=fi,a=hi;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:ws.get(n)||di,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:Cs.get(n)||vi,t):r},t.x=function(n){return arguments.length?(o=n,t):o},t.y=function(n){return arguments.length?(a=n,t):a},t.out=function(n){return arguments.length?(i=n,t):i},t};var ws=sa.map({"inside-out":function(t){var n,e,r=t.length,i=t.map(gi),o=t.map(mi),a=sa.range(r).sort(function(t,n){return i[t]-i[n]}),u=0,s=0,l=[],c=[];for(n=0;n<r;++n)e=a[n],u<s?(u+=o[e],l.push(e)):(s+=o[e],c.push(e));return c.reverse().concat(l)},reverse:function(t){return sa.range(t.length).reverse()},"default":di}),Cs=sa.map({silhouette:function(t){var n,e,r,i=t.length,o=t[0].length,a=[],u=0,s=[];for(e=0;e<o;++e){for(n=0,r=0;n<i;n++)r+=t[n][e][1];r>u&&(u=r),a.push(r)}for(e=0;e<o;++e)s[e]=(u-a[e])/2;return s},wiggle:function(t){var n,e,r,i,o,a,u,s,l,c=t.length,f=t[0],h=f.length,p=[];for(p[0]=s=l=0,e=1;e<h;++e){for(n=0,i=0;n<c;++n)i+=t[n][e][1];for(n=0,o=0,u=f[e][0]-f[e-1][0];n<c;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*u);r<n;++r)a+=(t[r][e][1]-t[r][e-1][1])/u;o+=a*t[n][e][1]}p[e]=s-=i?o/i*u:0,s<l&&(l=s)}for(e=0;e<h;++e)p[e]-=l;return p},expand:function(t){var n,e,r,i=t.length,o=t[0].length,a=1/i,u=[];for(e=0;e<o;++e){for(n=0,r=0;n<i;n++)r+=t[n][e][1];if(r)for(n=0;n<i;n++)t[n][e][1]/=r;else for(n=0;n<i;n++)t[n][e][1]=a}for(e=0;e<o;++e)u[e]=0;return u},zero:vi});sa.layout.histogram=function(){function t(t,o){for(var a,u,s=[],l=t.map(e,this),c=r.call(this,l,o),f=i.call(this,c,l,o),o=-1,h=l.length,p=f.length-1,d=n?1:1/h;++o<p;)a=s[o]=[],a.dx=f[o+1]-(a.x=f[o]),a.y=0;if(p>0)for(o=-1;++o<h;)u=l[o],u>=c[0]&&u<=c[1]&&(a=s[sa.bisect(f,u,1,p)-1],a.y+=d,a.push(t[o]));return s}var n=!0,e=Number,r=xi,i=$i;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=Mt(n),t):r},t.bins=function(n){return arguments.length?(i="number"==typeof n?function(t){return bi(t,n)}:Mt(n),t):i},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},sa.layout.pack=function(){function t(t,o){var a=e.call(this,t,o),u=a[0],s=i[0],l=i[1],c=null==n?Math.sqrt:"function"==typeof n?n:function(){return n};if(u.x=u.y=0,ai(u,function(t){t.r=+c(t.value)}),ai(u,Mi),r){var f=r*(n?1:Math.max(2*u.r/s,2*u.r/l))/2;ai(u,function(t){t.r+=f}),ai(u,Mi),ai(u,function(t){t.r-=f})}return Ei(u,s/2,l/2,n?1:1/Math.max(2*u.r/s,2*u.r/l)),a}var n,e=sa.layout.hierarchy().sort(wi),r=0,i=[1,1];return t.size=function(n){return arguments.length?(i=n,t):i},t.radius=function(e){return arguments.length?(n=null==e||"function"==typeof e?e:+e,t):n},t.padding=function(n){return arguments.length?(r=+n,t):r},ii(t,e)},sa.layout.tree=function(){function t(t,i){var c=a.call(this,t,i),f=c[0],h=n(f);if(ai(h,e),h.parent.m=-h.z,oi(h,r),l)oi(f,o);else{var p=f,d=f,v=f;oi(f,function(t){t.x<p.x&&(p=t),t.x>d.x&&(d=t),t.depth>v.depth&&(v=t)});var g=u(p,d)/2-p.x,m=s[0]/(d.x+u(d,p)/2+g),y=s[1]/(v.depth||1);oi(f,function(t){t.x=(t.x+g)*m,t.y=t.depth*y})}return c}function n(t){for(var n,e={A:null,children:[t]},r=[e];null!=(n=r.pop());)for(var i,o=n.children,a=0,u=o.length;a<u;++a)r.push((o[a]=i={_:o[a],parent:n,children:(i=o[a].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=i);return e.children[0]}function e(t){var n=t.children,e=t.parent.children,r=t.i?e[t.i-1]:null;if(n.length){Ni(t);var o=(n[0].z+n[n.length-1].z)/2;r?(t.z=r.z+u(t._,r._),t.m=t.z-o):t.z=o}else r&&(t.z=r.z+u(t._,r._));t.parent.A=i(t,r,t.parent.A||e[0])}function r(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function i(t,n,e){if(n){for(var r,i=t,o=t,a=n,s=i.parent.children[0],l=i.m,c=o.m,f=a.m,h=s.m;a=Li(a),i=Ti(i),a&&i;)s=Ti(s),o=Li(o),o.a=t,r=a.z+f-i.z-l+u(a._,i._),r>0&&(ji(Ri(a,t,e),t,r),l+=r,c+=r),f+=a.m,l+=i.m,h+=s.m,c+=o.m;a&&!Li(o)&&(o.t=a,o.m+=f-c),i&&!Ti(s)&&(s.t=i,s.m+=l-h,e=t)}return e}function o(t){t.x*=s[0],t.y=t.depth*s[1]}var a=sa.layout.hierarchy().sort(null).value(null),u=Oi,s=[1,1],l=null;return t.separation=function(n){return arguments.length?(u=n,t):u},t.size=function(n){return arguments.length?(l=null==(s=n)?o:null,t):l?null:s},t.nodeSize=function(n){return arguments.length?(l=null==(s=n)?null:o,t):l?s:null},ii(t,a)},sa.layout.cluster=function(){function t(t,o){var a,u=n.call(this,t,o),s=u[0],l=0;ai(s,function(t){var n=t.children;n&&n.length?(t.x=Fi(n),t.y=Di(n)):(t.x=a?l+=e(t,a):0,t.y=0,a=t)});var c=Ii(s),f=qi(s),h=c.x-e(c,f)/2,p=f.x+e(f,c)/2;return ai(s,i?function(t){t.x=(t.x-s.x)*r[0],t.y=(s.y-t.y)*r[1]}:function(t){t.x=(t.x-h)/(p-h)*r[0],t.y=(1-(s.y?t.y/s.y:1))*r[1]}),u}var n=sa.layout.hierarchy().sort(null).value(null),e=Oi,r=[1,1],i=!1;return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(i=null==(r=n),t):i?null:r},t.nodeSize=function(n){return arguments.length?(i=null!=(r=n),t):i?r:null},ii(t,n)},sa.layout.treemap=function(){function t(t,n){for(var e,r,i=-1,o=t.length;++i<o;)r=(e=t[i]).value*(n<0?0:n),e.area=isNaN(r)||r<=0?0:r}function n(e){var o=e.children;if(o&&o.length){var a,u,s,l=f(e),c=[],h=o.slice(),d=1/0,v="slice"===p?l.dx:"dice"===p?l.dy:"slice-dice"===p?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),c.area=0;(s=h.length)>0;)c.push(a=h[s-1]),c.area+=a.area,"squarify"!==p||(u=r(c,v))<=d?(h.pop(),d=u):(c.area-=c.pop().area,i(c,v,l,!1),v=Math.min(l.dx,l.dy),c.length=c.area=0,d=1/0);c.length&&(i(c,v,l,!0),c.length=c.area=0),o.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var o,a=f(n),u=r.slice(),s=[];for(t(u,a.dx*a.dy/n.value),s.area=0;o=u.pop();)s.push(o),s.area+=o.area,null!=o.z&&(i(s,o.z?a.dx:a.dy,a,!u.length),s.length=s.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,i=0,o=1/0,a=-1,u=t.length;++a<u;)(e=t[a].area)&&(e<o&&(o=e),e>i&&(i=e));return r*=r,n*=n,r?Math.max(n*i*d/r,r/(n*o*d)):1/0}function i(t,n,e,r){var i,o=-1,a=t.length,u=e.x,l=e.y,c=n?s(t.area/n):0;if(n==e.dx){for((r||c>e.dy)&&(c=e.dy);++o<a;)i=t[o],i.x=u,i.y=l,i.dy=c,u+=i.dx=Math.min(e.x+e.dx-u,c?s(i.area/c):0);i.z=!0,i.dx+=e.x+e.dx-u,e.y+=c,e.dy-=c}else{for((r||c>e.dx)&&(c=e.dx);++o<a;)i=t[o],i.x=u,i.y=l,i.dx=c,l+=i.dy=Math.min(e.y+e.dy-l,c?s(i.area/c):0);i.z=!1,i.dy+=e.y+e.dy-l,e.x+=c,e.dx-=c}}function o(r){var i=a||u(r),o=i[0];return o.x=o.y=0,o.value?(o.dx=l[0],o.dy=l[1]):o.dx=o.dy=0,a&&u.revalue(o),t([o],o.dx*o.dy/o.value),(a?e:n)(o),h&&(a=i),i}var a,u=sa.layout.hierarchy(),s=Math.round,l=[1,1],c=null,f=zi,h=!1,p="squarify",d=.5*(1+Math.sqrt(5));return o.size=function(t){return arguments.length?(l=t,o):l},o.padding=function(t){function n(n){var e=t.call(o,n,n.depth);return null==e?zi(n):Vi(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Vi(n,t)}if(!arguments.length)return c;var r;return f=null==(c=t)?zi:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,o},o.round=function(t){return arguments.length?(s=t?Math.round:Number,o):s!=Number},o.sticky=function(t){return arguments.length?(h=t,a=null,o):h},o.ratio=function(t){return arguments.length?(d=t,o):d},o.mode=function(t){return arguments.length?(p=t+"",o):p},ii(o,u)},sa.random={normal:function(t,n){var e=arguments.length;return e<2&&(n=1),e<1&&(t=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return t+n*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=sa.random.normal.apply(sa,arguments);return function(){return Math.exp(t())}},bates:function(t){var n=sa.random.irwinHall(t);return function(){return n()/t}},irwinHall:function(t){return function(){for(var n=0,e=0;e<t;e++)n+=Math.random();return n}}},sa.scale={};var Ss={floor:y,ceil:y};sa.scale.linear=function(){return Zi([0,1],[0,1],$r,!1)};var _s={s:1,g:1,p:1,r:1,e:1};sa.scale.log=function(){return ro(sa.scale.linear().domain([0,1]),10,!0,[1,10])};var Ms=sa.format(".0e"),ks={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};sa.scale.pow=function(){return io(sa.scale.linear(),1,[0,1])},sa.scale.sqrt=function(){return sa.scale.pow().exponent(.5)},sa.scale.ordinal=function(){return ao([],{t:"range",a:[[]]})},sa.scale.category10=function(){return sa.scale.ordinal().range(As)},sa.scale.category20=function(){return sa.scale.ordinal().range(Es)},sa.scale.category20b=function(){return sa.scale.ordinal().range(Ps)},sa.scale.category20c=function(){return sa.scale.ordinal().range(Os)};var As=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map($t),Es=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map($t),Ps=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map($t),Os=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map($t);sa.scale.quantile=function(){return uo([],[])},sa.scale.quantize=function(){return so(0,1,[0,1])},sa.scale.threshold=function(){return lo([.5],[0,1])},sa.scale.identity=function(){return co([0,1])},sa.svg={},sa.svg.arc=function(){function t(){var t=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),c=a.apply(this,arguments)-Va,f=u.apply(this,arguments)-Va,h=Math.abs(f-c),p=c>f?0:1;if(l<t&&(d=l,l=t,t=d),h>=za)return n(l,p)+(t?n(t,1-p):"")+"Z";var d,v,g,m,y,$,b,x,w,C,S,_,M=0,k=0,A=[];if((m=(+s.apply(this,arguments)||0)/2)&&(g=o===Ts?Math.sqrt(t*t+l*l):+o.apply(this,arguments),p||(k*=-1),l&&(k=nt(g/l*Math.sin(m))),t&&(M=nt(g/t*Math.sin(m)))),l){y=l*Math.cos(c+k),$=l*Math.sin(c+k),b=l*Math.cos(f-k),x=l*Math.sin(f-k);var E=Math.abs(f-c-2*k)<=Ia?0:1;if(k&&yo(y,$,b,x)===p^E){var P=(c+f)/2;y=l*Math.cos(P),$=l*Math.sin(P),b=x=null}}else y=$=0;if(t){w=t*Math.cos(f-M),C=t*Math.sin(f-M),S=t*Math.cos(c+M),_=t*Math.sin(c+M);var O=Math.abs(c-f+2*M)<=Ia?0:1;if(M&&yo(w,C,S,_)===1-p^O){var T=(c+f)/2;w=t*Math.cos(T),C=t*Math.sin(T),S=_=null}}else w=C=0;if(h>Da&&(d=Math.min(Math.abs(l-t)/2,+i.apply(this,arguments)))>.001){v=t<l^p?0:1;var L=d,j=d;if(h<Ia){var N=null==S?[w,C]:null==b?[y,$]:je([y,$],[S,_],[b,x],[w,C]),R=y-N[0],D=$-N[1],F=b-N[0],I=x-N[1],q=1/Math.sin(Math.acos((R*F+D*I)/(Math.sqrt(R*R+D*D)*Math.sqrt(F*F+I*I)))/2),z=Math.sqrt(N[0]*N[0]+N[1]*N[1]);j=Math.min(d,(t-z)/(q-1)),L=Math.min(d,(l-z)/(q+1))}if(null!=b){var V=$o(null==S?[w,C]:[S,_],[y,$],l,L,p),B=$o([b,x],[w,C],l,L,p);d===L?A.push("M",V[0],"A",L,",",L," 0 0,",v," ",V[1],"A",l,",",l," 0 ",1-p^yo(V[1][0],V[1][1],B[1][0],B[1][1]),",",p," ",B[1],"A",L,",",L," 0 0,",v," ",B[0]):A.push("M",V[0],"A",L,",",L," 0 1,",v," ",B[0])}else A.push("M",y,",",$);if(null!=S){var U=$o([y,$],[S,_],t,-j,p),W=$o([w,C],null==b?[y,$]:[b,x],t,-j,p);d===j?A.push("L",W[0],"A",j,",",j," 0 0,",v," ",W[1],"A",t,",",t," 0 ",p^yo(W[1][0],W[1][1],U[1][0],U[1][1]),",",1-p," ",U[1],"A",j,",",j," 0 0,",v," ",U[0]):A.push("L",W[0],"A",j,",",j," 0 0,",v," ",U[0])}else A.push("L",w,",",C)}else A.push("M",y,",",$),null!=b&&A.push("A",l,",",l," 0 ",E,",",p," ",b,",",x),A.push("L",w,",",C),null!=S&&A.push("A",t,",",t," 0 ",O,",",1-p," ",S,",",_);return A.push("Z"),A.join("")}function n(t,n){return"M0,"+t+"A"+t+","+t+" 0 1,"+n+" 0,"+-t+"A"+t+","+t+" 0 1,"+n+" 0,"+t}var e=ho,r=po,i=fo,o=Ts,a=vo,u=go,s=mo;return t.innerRadius=function(n){return arguments.length?(e=Mt(n),t):e},t.outerRadius=function(n){return arguments.length?(r=Mt(n),t):r},t.cornerRadius=function(n){return arguments.length?(i=Mt(n),t):i},t.padRadius=function(n){return arguments.length?(o=n==Ts?Ts:Mt(n),t):o},t.startAngle=function(n){return arguments.length?(a=Mt(n),t):a},t.endAngle=function(n){return arguments.length?(u=Mt(n),t):u},t.padAngle=function(n){return arguments.length?(s=Mt(n),t):s},t.centroid=function(){var t=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,n=(+a.apply(this,arguments)+ +u.apply(this,arguments))/2-Va;return[Math.cos(n)*t,Math.sin(n)*t]},t};var Ts="auto";sa.svg.line=function(){return bo(y)};var Ls=sa.map({linear:xo,"linear-closed":wo,step:Co,"step-before":So,"step-after":_o,basis:Oo,"basis-open":To,"basis-closed":Lo,bundle:jo,cardinal:Ao,"cardinal-open":Mo,"cardinal-closed":ko,monotone:qo});Ls.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var js=[0,2/3,1/3,0],Ns=[0,1/3,2/3,0],Rs=[0,1/6,2/3,1/6];sa.svg.line.radial=function(){var t=bo(zo);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},So.reverse=_o,_o.reverse=So,sa.svg.area=function(){return Vo(y)},sa.svg.area.radial=function(){var t=Vo(zo);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},sa.svg.chord=function(){function t(t,u){var s=n(this,o,t,u),l=n(this,a,t,u);return"M"+s.p0+r(s.r,s.p1,s.a1-s.a0)+(e(s,l)?i(s.r,s.p1,s.r,s.p0):i(s.r,s.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+i(l.r,l.p1,s.r,s.p0))+"Z"}function n(t,n,e,r){var i=n.call(t,e,r),o=u.call(t,i,r),a=s.call(t,i,r)-Va,c=l.call(t,i,r)-Va;return{r:o,a0:a,a1:c,p0:[o*Math.cos(a),o*Math.sin(a)],p1:[o*Math.cos(c),o*Math.sin(c)]}}function e(t,n){return t.a0==n.a0&&t.a1==n.a1}function r(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ia)+",1 "+n}function i(t,n,e,r){return"Q 0,0 "+r}var o=$e,a=be,u=Bo,s=vo,l=go;return t.radius=function(n){return arguments.length?(u=Mt(n),t):u},t.source=function(n){return arguments.length?(o=Mt(n),t):o},t.target=function(n){return arguments.length?(a=Mt(n),t):a},t.startAngle=function(n){return arguments.length?(s=Mt(n),t):s},t.endAngle=function(n){return arguments.length?(l=Mt(n),t):l},t},sa.svg.diagonal=function(){function t(t,i){var o=n.call(this,t,i),a=e.call(this,t,i),u=(o.y+a.y)/2,s=[o,{x:o.x,y:u},{x:a.x,y:u},a];return s=s.map(r),"M"+s[0]+"C"+s[1]+" "+s[2]+" "+s[3]}var n=$e,e=be,r=Uo;return t.source=function(e){return arguments.length?(n=Mt(e),t):n},t.target=function(n){return arguments.length?(e=Mt(n),t):e},t.projection=function(n){return arguments.length?(r=n,t):r},t},sa.svg.diagonal.radial=function(){var t=sa.svg.diagonal(),n=Uo,e=t.projection;return t.projection=function(t){return arguments.length?e(Wo(n=t)):n},t},sa.svg.symbol=function(){function t(t,r){return(Ds.get(n.call(this,t,r))||Go)(e.call(this,t,r))}var n=Yo,e=Ho;return t.type=function(e){return arguments.length?(n=Mt(e),t):n},t.size=function(n){return arguments.length?(e=Mt(n),t):e},t};var Ds=sa.map({circle:Go,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Is)),e=n*Is;return"M0,"+-n+"L"+e+",0 0,"+n+" "+-e+",0Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Fs),e=n*Fs/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Fs),e=n*Fs/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});sa.svg.symbolTypes=Ds.keys();var Fs=Math.sqrt(3),Is=Math.tan(30*Ba);Ea.transition=function(t){for(var n,e,r=qs||++Us,i=Qo(t),o=[],a=zs||{time:Date.now(),ease:Mr,delay:0,duration:250},u=-1,s=this.length;++u<s;){o.push(n=[]);for(var l=this[u],c=-1,f=l.length;++c<f;)(e=l[c])&&ta(e,c,i,r,a),n.push(e)}return Xo(o,i,r)},Ea.interrupt=function(t){return this.each(null==t?Vs:Zo(Qo(t)))};var qs,zs,Vs=Zo(Qo()),Bs=[],Us=0;Bs.call=Ea.call,Bs.empty=Ea.empty,Bs.node=Ea.node,Bs.size=Ea.size,sa.transition=function(t,n){return t&&t.transition?qs?t.transition(n):t:sa.selection().transition(t)},sa.transition.prototype=Bs,Bs.select=function(t){var n,e,r,i=this.id,o=this.namespace,a=[];t=A(t);for(var u=-1,s=this.length;++u<s;){a.push(n=[]);for(var l=this[u],c=-1,f=l.length;++c<f;)(r=l[c])&&(e=t.call(r,r.__data__,c,u))?("__data__"in r&&(e.__data__=r.__data__),ta(e,c,o,i,r[o][i]),n.push(e)):n.push(null)}return Xo(a,o,i)},Bs.selectAll=function(t){var n,e,r,i,o,a=this.id,u=this.namespace,s=[];t=E(t);for(var l=-1,c=this.length;++l<c;)for(var f=this[l],h=-1,p=f.length;++h<p;)if(r=f[h]){o=r[u][a],e=t.call(r,r.__data__,h,l),s.push(n=[]);for(var d=-1,v=e.length;++d<v;)(i=e[d])&&ta(i,d,u,a,o),n.push(i)}return Xo(s,u,a)},Bs.filter=function(t){var n,e,r,i=[];"function"!=typeof t&&(t=z(t));for(var o=0,a=this.length;o<a;o++){i.push(n=[]);for(var e=this[o],u=0,s=e.length;u<s;u++)(r=e[u])&&t.call(r,r.__data__,u,o)&&n.push(r)}return Xo(i,this.namespace,this.id)},Bs.tween=function(t,n){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(t):B(this,null==n?function(n){n[r][e].tween.remove(t)}:function(i){i[r][e].tween.set(t,n)})},Bs.attr=function(t,n){function e(){this.removeAttribute(u)}function r(){this.removeAttributeNS(u.space,u.local)}function i(t){return null==t?e:(t+="",function(){var n,e=this.getAttribute(u);return e!==t&&(n=a(e,t),function(t){this.setAttribute(u,n(t))})})}function o(t){return null==t?r:(t+="",function(){var n,e=this.getAttributeNS(u.space,u.local);return e!==t&&(n=a(e,t),function(t){this.setAttributeNS(u.space,u.local,n(t))})})}if(arguments.length<2){for(n in t)this.attr(n,t[n]);return this}var a="transform"==t?Yr:$r,u=sa.ns.qualify(t);return Jo(this,"attr."+t,n,u.local?o:i)},Bs.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(i));return r&&function(t){this.setAttribute(i,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(i.space,i.local));return r&&function(t){this.setAttributeNS(i.space,i.local,r(t))}}var i=sa.ns.qualify(t);return this.tween("attr."+t,i.local?r:e)},Bs.style=function(t,e,r){function i(){this.style.removeProperty(t)}function o(e){return null==e?i:(e+="",function(){var i,o=n(this).getComputedStyle(this,null).getPropertyValue(t);return o!==e&&(i=$r(o,e),function(n){this.style.setProperty(t,i(n),r)})})}var a=arguments.length;if(a<3){if("string"!=typeof t){a<2&&(e="");for(r in t)this.style(r,t[r],e);return this}r=""}return Jo(this,"style."+t,e,o)},Bs.styleTween=function(t,e,r){function i(i,o){var a=e.call(this,i,o,n(this).getComputedStyle(this,null).getPropertyValue(t));return a&&function(n){this.style.setProperty(t,a(n),r)}}return arguments.length<3&&(r=""),this.tween("style."+t,i)},Bs.text=function(t){return Jo(this,"text",t,Ko)},Bs.remove=function(){var t=this.namespace;return this.each("end.transition",function(){var n;this[t].count<2&&(n=this.parentNode)&&n.removeChild(this)})},Bs.ease=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].ease:("function"!=typeof t&&(t=sa.ease.apply(sa,arguments)),B(this,function(r){r[e][n].ease=t}))},Bs.delay=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].delay:B(this,"function"==typeof t?function(r,i,o){r[e][n].delay=+t.call(r,r.__data__,i,o)}:(t=+t,function(r){r[e][n].delay=t}))},Bs.duration=function(t){var n=this.id,e=this.namespace;return arguments.length<1?this.node()[e][n].duration:B(this,"function"==typeof t?function(r,i,o){r[e][n].duration=Math.max(1,t.call(r,r.__data__,i,o))}:(t=Math.max(1,t),function(r){r[e][n].duration=t}))},Bs.each=function(t,n){var e=this.id,r=this.namespace;if(arguments.length<2){var i=zs,o=qs;try{qs=e,B(this,function(n,i,o){zs=n[r][e],t.call(n,n.__data__,i,o)})}finally{zs=i,qs=o}}else B(this,function(i){var o=i[r][e];(o.event||(o.event=sa.dispatch("start","end","interrupt"))).on(t,n)});return this},Bs.transition=function(){for(var t,n,e,r,i=this.id,o=++Us,a=this.namespace,u=[],s=0,l=this.length;s<l;s++){u.push(t=[]);for(var n=this[s],c=0,f=n.length;c<f;c++)(e=n[c])&&(r=e[a][i],ta(e,c,a,o,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),t.push(e)}return Xo(u,a,o)},sa.svg.axis=function(){function t(t){t.each(function(){var t,l=sa.select(this),c=this.__chart__||e,f=this.__chart__=e.copy(),h=null==s?f.ticks?f.ticks.apply(f,u):f.domain():s,p=null==n?f.tickFormat?f.tickFormat.apply(f,u):y:n,d=l.selectAll(".tick").data(h,f),v=d.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),g=sa.transition(d.exit()).style("opacity",Da).remove(),m=sa.transition(d.order()).style("opacity",1),$=Math.max(i,0)+a,b=Ui(f),x=l.selectAll(".domain").data([0]),w=(x.enter().append("path").attr("class","domain"),sa.transition(x));v.append("line"),v.append("text");var C,S,_,M,k=v.select("line"),A=m.select("line"),E=d.select("text").text(p),P=v.select("text"),O=m.select("text"),T="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(t=na,C="x",_="y",S="x2",M="y2",E.attr("dy",T<0?"0em":".71em").style("text-anchor","middle"),w.attr("d","M"+b[0]+","+T*o+"V0H"+b[1]+"V"+T*o)):(t=ea,C="y",_="x",S="y2",M="x2",E.attr("dy",".32em").style("text-anchor",T<0?"end":"start"),w.attr("d","M"+T*o+","+b[0]+"H0V"+b[1]+"H"+T*o)),k.attr(M,T*i),P.attr(_,T*$),A.attr(S,0).attr(M,T*i),O.attr(C,0).attr(_,T*$),f.rangeBand){var L=f,j=L.rangeBand()/2;c=f=function(t){return L(t)+j}}else c.rangeBand?c=f:g.call(t,f,c);v.call(t,c,f),m.call(t,f,f)})}var n,e=sa.scale.linear(),r=Ws,i=6,o=6,a=3,u=[10],s=null;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n in Hs?n+"":Ws,t):r},t.ticks=function(){return arguments.length?(u=ca(arguments),t):u},t.tickValues=function(n){return arguments.length?(s=n,t):s},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n){var e=arguments.length;return e?(i=+n,o=+arguments[e-1],t):i},t.innerTickSize=function(n){return arguments.length?(i=+n,t):i},t.outerTickSize=function(n){return arguments.length?(o=+n,t):o},t.tickPadding=function(n){return arguments.length?(a=+n,t):a},t.tickSubdivide=function(){return arguments.length&&t},t};var Ws="bottom",Hs={top:1,right:1,bottom:1,left:1};sa.svg.brush=function(){function t(n){n.each(function(){var n=sa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",o).on("touchstart.brush",o),a=n.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),n.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var u=n.selectAll(".resize").data(v,y);u.exit().remove(),u.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ys[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),u.style("display",t.empty()?"none":null);var s,f=sa.transition(n),h=sa.transition(a);l&&(s=Ui(l),h.attr("x",s[0]).attr("width",s[1]-s[0]),r(f)),c&&(s=Ui(c),h.attr("y",s[0]).attr("height",s[1]-s[0]),i(f)),e(f)})}function e(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+f[+/e$/.test(t)]+","+h[+/^s/.test(t)]+")"})}function r(t){t.select(".extent").attr("x",f[0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function i(t){t.select(".extent").attr("y",h[0]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function o(){function o(){32==sa.event.keyCode&&(E||($=null,O[0]-=f[1],O[1]-=h[1],E=2),S())}function v(){32==sa.event.keyCode&&2==E&&(O[0]+=f[1],O[1]+=h[1],E=0,S())}function g(){var t=sa.mouse(x),n=!1;b&&(t[0]+=b[0],t[1]+=b[1]),E||(sa.event.altKey?($||($=[(f[0]+f[1])/2,(h[0]+h[1])/2]),O[0]=f[+(t[0]<$[0])],O[1]=h[+(t[1]<$[1])]):$=null),k&&m(t,l,0)&&(r(_),n=!0),A&&m(t,c,1)&&(i(_),n=!0),n&&(e(_),C({type:"brush",mode:E?"move":"resize"}))}function m(t,n,e){var r,i,o=Ui(n),s=o[0],l=o[1],c=O[e],v=e?h:f,g=v[1]-v[0];if(E&&(s-=c,l-=g+c),r=(e?d:p)?Math.max(s,Math.min(l,t[e])):t[e],E?i=(r+=c)+g:($&&(c=Math.max(s,Math.min(l,2*$[e]-r))),c<r?(i=r,r=c):i=c),v[0]!=r||v[1]!=i)return e?u=null:a=null,v[0]=r,v[1]=i,!0}function y(){g(),_.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),sa.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),P(),C({type:"brushend"})}var $,b,x=this,w=sa.select(sa.event.target),C=s.of(x,arguments),_=sa.select(x),M=w.datum(),k=!/^(n|s)$/.test(M)&&l,A=!/^(e|w)$/.test(M)&&c,E=w.classed("extent"),P=Z(x),O=sa.mouse(x),T=sa.select(n(x)).on("keydown.brush",o).on("keyup.brush",v);if(sa.event.changedTouches?T.on("touchmove.brush",g).on("touchend.brush",y):T.on("mousemove.brush",g).on("mouseup.brush",y),_.interrupt().selectAll("*").interrupt(),E)O[0]=f[0]-O[0],O[1]=h[0]-O[1];else if(M){var L=+/w$/.test(M),j=+/^n/.test(M);b=[f[1-L]-O[0],h[1-j]-O[1]],O[0]=f[L],O[1]=h[j]}else sa.event.altKey&&($=O.slice());_.style("pointer-events","none").selectAll(".resize").style("display",null),sa.select("body").style("cursor",w.style("cursor")),C({type:"brushstart"}),g()}var a,u,s=M(t,"brushstart","brush","brushend"),l=null,c=null,f=[0,0],h=[0,0],p=!0,d=!0,v=Gs[0];return t.event=function(t){t.each(function(){var t=s.of(this,arguments),n={x:f,y:h,i:a,j:u},e=this.__chart__||n;this.__chart__=n,qs?sa.select(this).transition().each("start.brush",function(){a=e.i,u=e.j,f=e.x,h=e.y,t({type:"brushstart"})}).tween("brush:brush",function(){var e=br(f,n.x),r=br(h,n.y);return a=u=null,function(i){f=n.x=e(i),h=n.y=r(i),t({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=n.i,u=n.j,t({type:"brush",mode:"resize"}),t({type:"brushend"})}):(t({type:"brushstart"}),t({type:"brush",mode:"resize"}),t({type:"brushend"}))})},t.x=function(n){return arguments.length?(l=n,v=Gs[!l<<1|!c],t):l},t.y=function(n){return arguments.length?(c=n,v=Gs[!l<<1|!c],t):c},t.clamp=function(n){return arguments.length?(l&&c?(p=!!n[0],d=!!n[1]):l?p=!!n:c&&(d=!!n),t):l&&c?[p,d]:l?p:c?d:null},t.extent=function(n){var e,r,i,o,s;return arguments.length?(l&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),a=[e,r],l.invert&&(e=l(e),r=l(r)),r<e&&(s=e,e=r,r=s),e==f[0]&&r==f[1]||(f=[e,r])),c&&(i=n[0],o=n[1],l&&(i=i[1],o=o[1]),u=[i,o],c.invert&&(i=c(i),o=c(o)),o<i&&(s=i,i=o,o=s),i==h[0]&&o==h[1]||(h=[i,o])),t):(l&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),r<e&&(s=e,e=r,r=s))),c&&(u?(i=u[0],o=u[1]):(i=h[0],o=h[1],c.invert&&(i=c.invert(i),o=c.invert(o)),o<i&&(s=i,i=o,o=s))),l&&c?[[e,i],[r,o]]:l?[e,r]:c&&[i,o])},t.clear=function(){return t.empty()||(f=[0,0],h=[0,0],a=u=null),t},t.empty=function(){return!!l&&f[0]==f[1]||!!c&&h[0]==h[1]},sa.rebind(t,s,"on")};var Ys={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Gs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Zs=du.format=bu.timeFormat,Xs=Zs.utc,Js=Xs("%Y-%m-%dT%H:%M:%S.%LZ");Zs.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ra:Js,ra.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},ra.toString=Js.toString,du.second=qt(function(t){return new vu(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),du.seconds=du.second.range,du.seconds.utc=du.second.utc.range,du.minute=qt(function(t){return new vu(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),du.minutes=du.minute.range,du.minutes.utc=du.minute.utc.range,du.hour=qt(function(t){var n=t.getTimezoneOffset()/60;return new vu(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),du.hours=du.hour.range,du.hours.utc=du.hour.utc.range,du.month=qt(function(t){return t=du.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),du.months=du.month.range,du.months.utc=du.month.utc.range;var Ks=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qs=[[du.second,1],[du.second,5],[du.second,15],[du.second,30],[du.minute,1],[du.minute,5],[du.minute,15],[du.minute,30],[du.hour,1],[du.hour,3],[du.hour,6],[du.hour,12],[du.day,1],[du.day,2],[du.week,1],[du.month,1],[du.month,3],[du.year,1]],tl=Zs.multi([[".%L",function(t){return t.getMilliseconds()}],[":%S",function(t){return t.getSeconds()}],["%I:%M",function(t){return t.getMinutes()}],["%I %p",function(t){return t.getHours()}],["%a %d",function(t){return t.getDay()&&1!=t.getDate()}],["%b %d",function(t){return 1!=t.getDate()}],["%B",function(t){return t.getMonth()}],["%Y",Pn]]),nl={range:function(t,n,e){return sa.range(Math.ceil(t/e)*e,+n,e).map(oa)},floor:y,ceil:y};Qs.year=du.year,du.scale=function(){return ia(sa.scale.linear(),Qs,tl)};var el=Qs.map(function(t){return[t[0].utc,t[1]]}),rl=Xs.multi([[".%L",function(t){return t.getUTCMilliseconds()}],[":%S",function(t){return t.getUTCSeconds()}],["%I:%M",function(t){return t.getUTCMinutes()}],["%I %p",function(t){return t.getUTCHours()}],["%a %d",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],["%b %d",function(t){return 1!=t.getUTCDate()}],["%B",function(t){return t.getUTCMonth()}],["%Y",Pn]]);el.year=du.year.utc,du.scale.utc=function(){return ia(sa.scale.linear(),el,rl)},sa.text=kt(function(t){return t.responseText}),sa.json=function(t,n){return At(t,"application/json",aa,n)},sa.html=function(t,n){return At(t,"text/html",ua,n)},sa.xml=kt(function(t){return t.responseXML}),"function"==typeof define&&define.amd?(this.d3=sa,define(sa)):"object"==typeof module&&module.exports?module.exports=sa:this.d3=sa}(),angular.module("RecursionHelper",[]).factory("RecursionHelper",["$compile",function(t){return{compile:function(n,e){angular.isFunction(e)&&(e={post:e});var r,i=n.contents().remove();return{pre:e&&e.pre?e.pre:null,post:function(n,o){r||(r=t(i)),r(n,function(t){o.append(t)}),e&&e.post&&e.post.apply(null,arguments)}}}}}]);
\ No newline at end of file
