function BigInteger ( e , t , n ) { null != e && ( "number" == typeof e ? this . fromNumber ( e , t , n ) : null == t && "string" != typeof e ? this . fromString ( e , 256 ) : this . fromString ( e , t ) ) } function nbi ( ) { return new BigInteger ( null ) } function am1 ( e , t , n , i , a , o ) { for ( ; -- o >= 0 ; ) { var s = t * this [ e ++ ] + n [ i ] + a ; a = Math . floor ( s / 67108864 ) , n [ i ++ ] = 67108863 & s } return a } function am2 ( e , t , n , i , a , o ) { for ( var s = 32767 & t , r = t >> 15 ; -- o >= 0 ; ) { var l = 32767 & this [ e ] , c = this [ e ++ ] >> 15 , d = r * l + c * s ; l = s * l + ( ( 32767 & d ) << 15 ) + n [ i ] + ( 1073741823 & a ) , a = ( l >>> 30 ) + ( d >>> 15 ) + r * c + ( a >>> 30 ) , n [ i ++ ] = 1073741823 & l } return a } function am3 ( e , t , n , i , a , o ) { for ( var s = 16383 & t , r = t >> 14 ; -- o >= 0 ; ) { var l = 16383 & this [ e ] , c = this [ e ++ ] >> 14 , d = r * l + c * s ; l = s * l + ( ( 16383 & d ) << 14 ) + n [ i ] + a , a = ( l >> 28 ) + ( d >> 14 ) + r * c , n [ i ++ ] = 268435455 & l } return a } function int2char ( e ) { return BI _RM . charAt ( e ) } function intAt ( e , t ) { var n = BI _RC [ e . charCodeAt ( t ) ] ; return null == n ? - 1 : n } function bnpCopyTo ( e ) { for ( var t = this . t - 1 ; t >= 0 ; -- t ) e [ t ] = this [ t ] ; e . t = this . t , e . s = this . s } function bnpFromInt ( e ) { this . t = 1 , this . s = 0 > e ? - 1 : 0 , e > 0 ? this [ 0 ] = e : - 1 > e ? this [ 0 ] = e + this . DV : this . t = 0 } function nbv ( e ) { var t = nbi ( ) ; return t . fromInt ( e ) , t } function bnpFromString ( e , t , n ) { var i ; if ( 16 == t ) i = 4 ; else if ( 8 == t ) i = 3 ; else if ( 256 == t ) i = 8 ; else if ( 2 == t ) i = 1 ; else if ( 32 == t ) i = 5 ; else { if ( 4 != t ) return void this . fromRadix ( e , t ) ; i = 2 } this . t = 0 , this . s = 0 ; for ( var a = e . length , o = ! 1 , s = 0 ; -- a >= 0 ; ) { var r = 8 == i ? 255 & e [ a ] : intAt ( e , a ) ; 0 > r ? "-" == e . charAt ( a ) && ( o = ! 0 ) : ( o = ! 1 , 0 == s ? this [ this . t ++ ] = r : s + i > this . DB ? ( this [ this . t - 1 ] |= ( r & ( 1 << this . DB - s ) - 1 ) << s , this [ this . t ++ ] = r >> this . DB - s ) : this [ this . t - 1 ] |= r << s , s += i , s >= this . DB && ( s -= this . DB ) ) } 8 == i && 0 != ( 128 & e [ 0 ] ) && n && ( this . s = - 1 , s > 0 && ( this [ this . t - 1 ] |= ( 1 << this . DB - s ) - 1 << s ) ) , this . clamp ( ) , o && BigInteger . ZERO . subTo ( this , this ) } function bnpClamp ( ) { for ( var e = this . s & this . DM ; this . t > 0 && this [ this . t - 1 ] == e ; ) -- this . t } function bnToString ( e ) { if ( this . s < 0 ) return "-" + this . negate ( ) . toString ( e ) ; var t ; if ( 16 == e ) t = 4 ; else if ( 8 == e ) t = 3 ; else if ( 2 == e ) t = 1 ; else if ( 32 == e ) t = 5 ; else { if ( 4 != e ) return this . toRadix ( e ) ; t = 2 } var n , i = ( 1 << t ) - 1 , a = ! 1 , o = "" , s = this . t , r = this . DB - s * this . DB % t ; if ( s -- > 0 ) for ( r < this . DB && ( n = this [ s ] >> r ) > 0 && ( a = ! 0 , o = int2char ( n ) ) ; s >= 0 ; ) t > r ? ( n = ( this [ s ] & ( 1 << r ) - 1 ) << t - r , n |= this [ -- s ] >> ( r += this . DB - t ) ) : ( n = this [ s ] >> ( r -= t ) & i , 0 >= r && ( r += this . DB , -- s ) ) , n > 0 && ( a = ! 0 ) , a && ( o += int2char ( n ) ) ; return a ? o : "0" } function bnNegate ( ) { var e = nbi ( ) ; return BigInteger . ZERO . subTo ( this , e ) , e } function bnAbs ( ) { return this . s < 0 ? this . negate ( ) : this } function bnCompareTo ( e ) { var t = this . s - e . s ; if ( 0 != t ) return t ; var n = this . t ; if ( t = n - e . t , 0 != t ) return this . s < 0 ? - t : t ; for ( ; -- n >= 0 ; ) if ( 0 != ( t = this [ n ] - e [ n ] ) ) return t ; return 0 } function nbits ( e ) { var t , n = 1 ; return 0 != ( t = e >>> 16 ) && ( e = t , n += 16 ) , 0 != ( t = e >> 8 ) && ( e = t , n += 8 ) , 0 != ( t = e >> 4 ) && ( e = t , n += 4 ) , 0 != ( t = e >> 2 ) && ( e = t , n += 2 ) , 0 != ( t = e >> 1 ) && ( e = t , n += 1 ) , n } function bnBitLength ( ) { return this . t <= 0 ? 0 : this . DB * ( this . t - 1 ) + nbits ( this [ this . t - 1 ] ^ this . s & this . DM ) } function bnpDLShiftTo ( e , t ) { var n ; for ( n = this . t - 1 ; n >= 0 ; -- n ) t [ n + e ] = this [ n ] ; for ( n = e - 1 ; n >= 0 ; -- n ) t [ n ] = 0 ; t . t = this . t + e , t . s = this . s } function bnpDRShiftTo ( e , t ) { for ( var n = e ; n < this . t ; ++ n ) t [ n - e ] = this [ n ] ; t . t = Math . max ( this . t - e , 0 ) , t . s = this . s } function bnpLShiftTo ( e , t ) { var n , i = e % this . DB , a = this . DB - i , o = ( 1 << a ) - 1 , s = Math . floor ( e / this . DB ) , r = this . s << i & this . DM ; for ( n = this . t - 1 ; n >= 0 ; -- n ) t [ n + s + 1 ] = this [ n ] >> a | r , r = ( this [ n ] & o ) << i ; for ( n = s - 1 ; n >= 0 ; -- n ) t [ n ] = 0 ; t [ s ] = r , t . t = this . t + s + 1 , t . s = this . s , t . clamp ( ) } function bnpRShiftTo ( e , t ) { t . s = this . s ; var n = Math . floor ( e / this . DB ) ; if ( n >= this . t ) return void ( t . t = 0 ) ; var i = e % this . DB , a = this . DB - i , o = ( 1 << i ) - 1 ; t [ 0 ] = this [ n ] >> i ; for ( var s = n + 1 ; s < this . t ; ++ s ) t [ s - n - 1 ] |= ( this [ s ] & o ) << a , t [ s - n ] = this [ s ] >> i ; i > 0 && ( t [ this . t - n - 1 ] |= ( this . s & o ) << a ) , t . t = this . t - n , t . clamp ( ) } function bnpSubTo ( e , t ) { for ( var n = 0 , i = 0 , a = Math . min ( e . t , this . t ) ; a > n ; ) i += this [ n ] - e [ n ] , t [ n ++ ] = i & this . DM , i >>= this . DB ; if ( e . t < this . t ) { for ( i -= e . s ; n < this . t ; ) i += this [ n ] , t [ n ++ ] = i & this . DM , i >>= this . DB ; i += this . s } else { for ( i += this . s ; n < e . t ; ) i -= e [ n ] , t [ n ++ ] = i & this . DM , i >>= this . DB ; i -= e . s } t . s = 0 > i ? - 1 : 0 , - 1 > i ? t [ n ++ ] = this . DV + i : i > 0 && ( t [ n ++ ] = i ) , t . t = n , t . clamp ( ) } function bnpMultiplyTo ( e , t ) { var n = this . abs ( ) , i = e . abs ( ) , a = n . t ; for ( t . t = a + i . t ; -- a >= 0 ; ) t [ a ] = 0 ; for ( a = 0 ; a < i . t ; ++ a ) t [ a + n . t ] = n . am ( 0 , i [ a ] , t , a , 0 , n . t ) ; t . s = 0 , t . clamp ( ) , this . s != e . s && BigInteger . ZERO . subTo ( t , t ) } function bnpSquareTo ( e ) { for ( var t = this . abs ( ) , n = e . t = 2 * t . t ; -- n >= 0 ; ) e [ n ] = 0 ; for ( n = 0 ; n < t . t - 1 ; ++ n ) { var i = t . a
return ! 1 } function cancelEvent ( e ) { return e = e || window . event , e && ( e = e . originalEvent || e , e . stopPropagation && e . stopPropagation ( ) , e . preventDefault && e . preventDefault ( ) ) , ! 1 } function getScrollWidth ( ) { var e = $ ( "<div>" ) . css ( { position : "absolute" , width : 100 , height : 100 , overflow : "scroll" , top : - 9999 } ) . appendTo ( $ ( document . body ) ) , t = e [ 0 ] . offsetWidth - e [ 0 ] . clientWidth ; return e . remove ( ) , t } function onCtrlEnter ( e , t ) { $ ( e ) . on ( "keydown" , function ( e ) { return 13 == e . keyCode && ( e . ctrlKey || e . metaKey ) ? ( t ( ) , cancelEvent ( e ) ) : void 0 } ) } function setFieldSelection ( e , t , n ) { e = $ ( e ) [ 0 ] ; try { if ( e . focus ( ) , ( void 0 === t || t === ! 1 ) && ( t = e . value . length ) , ( void 0 === n || n === ! 1 ) && ( n = t ) , e . createTextRange ) { var i = e . createTextRange ( ) ; i . collapse ( ! 0 ) , i . moveEnd ( "character" , n ) , i . moveStart ( "character" , t ) , i . select ( ) } else e . setSelectionRange && e . setSelectionRange ( t , n ) } catch ( a ) { } } function getFieldSelection ( e ) { if ( e . selectionStart ) return e . selectionStart ; if ( ! document . selection ) return 0 ; var t = " " , n = document . selection . createRange ( ) , i = n . text , a = n . duplicate ( ) , o = 0 ; try { a . moveToElementText ( e ) } catch ( s ) { return 0 } return n . text = i + t , o = a . text . indexOf ( t ) , n . moveStart ( "character" , - 1 ) , n . text = "" , o } function getRichValue ( e ) { if ( ! e ) return "" ; var t = [ ] , n = [ ] ; return getRichElementValue ( e , t , n ) , n . length && t . push ( n . join ( "" ) ) , t . join ( "\n" ) } function getRichValueWithCaret ( e ) { if ( ! e ) return [ ] ; var t , n , i = [ ] , a = [ ] , o = window . getSelection ? window . getSelection ( ) : ! 1 ; if ( o && o . rangeCount ) { var s = o . getRangeAt ( 0 ) ; s . startContainer && s . startContainer == s . endContainer && s . startOffset == s . endOffset && ( t = s . startContainer , n = s . startOffset ) } getRichElementValue ( e , i , a , t , n ) , a . length && i . push ( a . join ( "" ) ) ; var r = i . join ( "\n" ) , l = r . indexOf ( " " ) ; return - 1 != l && ( r = r . substr ( 0 , l ) + r . substr ( l + 1 ) ) , [ r , l ] } function getRichElementValue ( e , t , n , i , a ) { if ( 3 != e . nodeType ) { if ( 1 == e . nodeType ) { var o , s = i === e , r = "DIV" == e . tagName || "P" == e . tagName ; r && n . length || "BR" == e . tagName ? ( t . push ( n . join ( "" ) ) , n . splice ( 0 , n . length ) ) : "IMG" == e . tagName && e . alt && n . push ( e . alt ) , s && ! a && n . push ( " " ) ; for ( var o = e . firstChild ; o ; ) getRichElementValue ( o , t , n , i , a ) , o = o . nextSibling ; s && a && n . push ( " " ) , r && n . length && ( t . push ( n . join ( "" ) ) , n . splice ( 0 , n . length ) ) } } else if ( i === e ) { var l = e . nodeValue ; n . push ( l . substr ( 0 , a ) + " " + l . substr ( a ) ) } else n . push ( e . nodeValue ) } function setRichFocus ( e , t , n ) { if ( e . focus ( ) , ! t || t . parentNode != e || t . nextSibling || n || ( e . removeChild ( t ) , t = null ) , window . getSelection && document . createRange ) { var i = document . createRange ( ) ; t ? i . selectNode ( t ) : i . selectNodeContents ( e ) , n || i . collapse ( ! 1 ) ; var a = window . getSelection ( ) ; a . removeAllRanges ( ) , a . addRange ( i ) } else if ( void 0 !== document . body . createTextRange ) { var o = document . body . createTextRange ( ) ; o . moveToElementText ( t || e ) , n || o . collapse ( ! 1 ) , o . select ( ) } } function getSelectedText ( ) { var e = ( window . getSelection && window . getSelection ( ) || document . getSelection && document . getSelection ( ) || document . selection && document . selection . createRange ( ) . text || "" ) . toString ( ) . replace ( /^\s+|\s+$/g , "" ) ; return e } function scrollToNode ( e , t , n ) { var i = t . offsetTop - 15 , a = t . offsetHeight + 30 , o = e . scrollTop , s = e . clientHeight ; o > i ? ( e . scrollTop = i , $ ( n ) . nanoScroller ( { flash : ! 0 } ) ) : i + a - s > o && ( e . scrollTop = i + a - s , $ ( n ) . nanoScroller ( { flash : ! 0 } ) ) } function onContentLoaded ( e ) { setZeroTimeout ( e ) } function tsNow ( e ) { var t = + new Date + ( window . tsOffset || 0 ) ; return e ? Math . floor ( t / 1e3 ) : t } function safeReplaceObject ( e , t ) { for ( var n in e ) t . hasOwnProperty ( n ) || "$" == n . charAt ( 0 ) || delete e [ n ] ; for ( var n in t ) t . hasOwnProperty ( n ) && ( e [ n ] = t [ n ] ) } function listMergeSorted ( e , t ) { e = e || [ ] , t = t || [ ] ; for ( var n = angular . copy ( e ) , i = e . length ? e [ e . length - 1 ] : 4294967295 , a = 0 ; a < t . length ; a ++ ) t [ a ] < i && n . push ( t [ a ] ) ; return n } function listUniqSorted ( e ) { e = e || [ ] ; for ( var t = [ ] , n = ! 1 , i = 0 ; i < e . length ; i ++ ) e [ i ] !== n && t . push ( e [ i ] ) , n = e [ i ] ; return t } function templateUrl ( e ) { var t = { confirm _modal : "desktop" , error _modal : "desktop" , media _modal _layout : "desktop" , slider : "desktop" , reply _message : "desktop" , chat _invite _link _modal : "desktop" , reply _markup : "desktop" , dialog _service : "desktop" , channel _edit _modal : "desktop" } , n = t [ e ] || ( Config . Mobile ? "mobile" : "desktop" ) ; return "partials/" + n + "/" + e + ".html" } function encodeEntities ( e ) { return e . replace ( /&/g , "&" ) . replace ( /([^\#-~| |!])/g , function ( e ) { return "&#" + e . charCodeAt ( 0 ) + ";" } ) . replace ( /</g , "<" ) . replace ( />/g , ">"
null != a && l . push ( a ) ; return Z . apply ( [ ] , l ) } , guid : 1 , proxy : function ( e , t ) { var n , i , a ; return "string" == typeof t && ( a = e [ t ] , t = e , e = a ) , ae . isFunction ( e ) ? ( n = Y . call ( arguments , 2 ) , i = function ( ) { return e . apply ( t || this , n . concat ( Y . call ( arguments ) ) ) } , i . guid = e . guid = e . guid || ae . guid ++ , i ) : void 0 } , now : function ( ) { return + new Date } , support : ne } ) , ae . each ( "Boolean Number String Function Array Date RegExp Object Error" . split ( " " ) , function ( e , t ) { Q [ "[object " + t + "]" ] = t . toLowerCase ( ) } ) ; var ce = function ( e ) { function t ( e , t , n , i ) { var a , o , s , r , l , c , u , m , h , g ; if ( ( t ? t . ownerDocument || t : B ) !== P && T ( t ) , t = t || P , n = n || [ ] , ! e || "string" != typeof e ) return n ; if ( 1 !== ( r = t . nodeType ) && 9 !== r ) return [ ] ; if ( N && ! i ) { if ( a = ve . exec ( e ) ) if ( s = a [ 1 ] ) { if ( 9 === r ) { if ( o = t . getElementById ( s ) , ! o || ! o . parentNode ) return n ; if ( o . id === s ) return n . push ( o ) , n } else if ( t . ownerDocument && ( o = t . ownerDocument . getElementById ( s ) ) && R ( t , o ) && o . id === s ) return n . push ( o ) , n } else { if ( a [ 2 ] ) return Q . apply ( n , t . getElementsByTagName ( e ) ) , n ; if ( ( s = a [ 3 ] ) && w . getElementsByClassName && t . getElementsByClassName ) return Q . apply ( n , t . getElementsByClassName ( s ) ) , n } if ( w . qsa && ( ! F || ! F . test ( e ) ) ) { if ( m = u = L , h = t , g = 9 === r && e , 1 === r && "object" !== t . nodeName . toLowerCase ( ) ) { for ( c = C ( e ) , ( u = t . getAttribute ( "id" ) ) ? m = u . replace ( be , "\\$&" ) : t . setAttribute ( "id" , m ) , m = "[id='" + m + "'] " , l = c . length ; l -- ; ) c [ l ] = m + p ( c [ l ] ) ; h = ye . test ( e ) && d ( t . parentNode ) || t , g = c . join ( "," ) } if ( g ) try { return Q . apply ( n , h . querySelectorAll ( g ) ) , n } catch ( f ) { } finally { u || t . removeAttribute ( "id" ) } } } return M ( e . replace ( le , "$1" ) , t , n , i ) } function n ( ) { function e ( n , i ) { return t . push ( n + " " ) > k . cacheLength && delete e [ t . shift ( ) ] , e [ n + " " ] = i } var t = [ ] ; return e } function i ( e ) { return e [ L ] = ! 0 , e } function a ( e ) { var t = P . createElement ( "div" ) ; try { return ! ! e ( t ) } catch ( n ) { return ! 1 } finally { t . parentNode && t . parentNode . removeChild ( t ) , t = null } } function o ( e , t ) { for ( var n = e . split ( "|" ) , i = e . length ; i -- ; ) k . attrHandle [ n [ i ] ] = t } function s ( e , t ) { var n = t && e , i = n && 1 === e . nodeType && 1 === t . nodeType && ( ~ t . sourceIndex || K ) - ( ~ e . sourceIndex || K ) ; if ( i ) return i ; if ( n ) for ( ; n = n . nextSibling ; ) if ( n === t ) return - 1 ; return e ? 1 : - 1 } function r ( e ) { return function ( t ) { var n = t . nodeName . toLowerCase ( ) ; return "input" === n && t . type === e } } function l ( e ) { return function ( t ) { var n = t . nodeName . toLowerCase ( ) ; return ( "input" === n || "button" === n ) && t . type === e } } function c ( e ) { return i ( function ( t ) { return t = + t , i ( function ( n , i ) { for ( var a , o = e ( [ ] , n . length , t ) , s = o . length ; s -- ; ) n [ a = o [ s ] ] && ( n [ a ] = ! ( i [ a ] = n [ a ] ) ) } ) } ) } function d ( e ) { return e && typeof e . getElementsByTagName !== G && e } function u ( ) { } function p ( e ) { for ( var t = 0 , n = e . length , i = "" ; n > t ; t ++ ) i += e [ t ] . value ; return i } function m ( e , t , n ) { var i = t . dir , a = n && "parentNode" === i , o = q ++ ; return t . first ? function ( t , n , o ) { for ( ; t = t [ i ] ; ) if ( 1 === t . nodeType || a ) return e ( t , n , o ) } : function ( t , n , s ) { var r , l , c = [ j , o ] ; if ( s ) { for ( ; t = t [ i ] ; ) if ( ( 1 === t . nodeType || a ) && e ( t , n , s ) ) return ! 0 } else for ( ; t = t [ i ] ; ) if ( 1 === t . nodeType || a ) { if ( l = t [ L ] || ( t [ L ] = { } ) , ( r = l [ i ] ) && r [ 0 ] === j && r [ 1 ] === o ) return c [ 2 ] = r [ 2 ] ; if ( l [ i ] = c , c [ 2 ] = e ( t , n , s ) ) return ! 0 } } } function h ( e ) { return e . length > 1 ? function ( t , n , i ) { for ( var a = e . length ; a -- ; ) if ( ! e [ a ] ( t , n , i ) ) return ! 1 ; return ! 0 } : e [ 0 ] } function g ( e , n , i ) { for ( var a = 0 , o = n . length ; o > a ; a ++ ) t ( e , n [ a ] , i ) ; return i } function f ( e , t , n , i , a ) { for ( var o , s = [ ] , r = 0 , l = e . length , c = null != t ; l > r ; r ++ ) ( o = e [ r ] ) && ( ! n || n ( o , i , a ) ) && ( s . push ( o ) , c && t . push ( r ) ) ; return s } function _ ( e , t , n , a , o , s ) { return a && ! a [ L ] && ( a = _ ( a ) ) , o && ! o [ L ] && ( o = _ ( o , s ) ) , i ( function ( i , s , r , l ) { var c , d , u , p = [ ] , m = [ ] , h = s . length , _ = i || g ( t || "*" , r . nodeType ? [ r ] : r , [ ] ) , v = ! e || ! i && t ? _ : f ( _ , p , e , r , l ) , y = n ? o || ( i ? e : h || a ) ? [ ] : s : v ; if ( n && n ( v , y , r , l ) , a ) for ( c = f ( y , m ) , a ( c , [ ] , r , l ) , d = c . length ; d -- ; ) ( u = c [ d ] ) && ( y [ m [ d ] ] = ! ( v [ m [ d ] ] = u ) ) ; if ( i ) { if ( o || e ) { if ( o ) { for ( c = [ ] , d = y . length ; d -- ; ) ( u = y [ d ] ) && c . push ( v [ d ] = u ) ; o ( null , y = [ ] , c , l ) } for ( d = y . length ; d -- ; ) ( u = y [ d ] ) && ( c = o ? te . call ( i , u ) : p [ d ] ) > - 1 && ( i [ c ] = ! ( s [ c ] = u ) ) } } else y = f ( y === s ? y . splice ( h , y . length ) : y ) , o ? o ( null , s , y , l ) : Q . apply ( s , y ) } ) } function v ( e ) { for ( var t , n , i , a = e . length , o = k . relative [ e [ 0 ] . type ] , s = o || k . relative [ " " ] , r = o ? 1 : 0 , l = m ( function ( e ) { return e === t } , s , ! 0 ) , c = m ( function ( e ) { return te . call ( t , e ) > - 1 } , s , ! 0 ) , d = [ function ( e , n , i ) { return ! o && ( i || n !== A ) || ( ( t = n ) . nodeType ? l ( e , n , i ) : c ( e , n , i ) ) } ] ; a > r ; r ++ ) if ( n = k . relative [ e [ r ] . type ] ) d = [ m ( h ( d ) , n ) ] ; else { if ( n = k . filter [ e [ r ] . type ] . apply ( null , e [ r ] . matches ) , n [ L ] ) { for ( i = ++ r ; a > i && ! k . relative [ e [ i ] . typ
ae . event . global [ m ] = ! 0 ) ; e = null } } , remove : function ( e , t , n , i , a ) { var o , s , r , l , c , d , u , p , m , h , g , f = ae . hasData ( e ) && ae . _data ( e ) ; if ( f && ( d = f . events ) ) { for ( t = ( t || "" ) . match ( ye ) || [ "" ] , c = t . length ; c -- ; ) if ( r = Fe . exec ( t [ c ] ) || [ ] , m = g = r [ 1 ] , h = ( r [ 2 ] || "" ) . split ( "." ) . sort ( ) , m ) { for ( u = ae . event . special [ m ] || { } , m = ( i ? u . delegateType : u . bindType ) || m , p = d [ m ] || [ ] , r = r [ 2 ] && new RegExp ( "(^|\\.)" + h . join ( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) , l = o = p . length ; o -- ; ) s = p [ o ] , ! a && g !== s . origType || n && n . guid !== s . guid || r && ! r . test ( s . namespace ) || i && i !== s . selector && ( "**" !== i || ! s . selector ) || ( p . splice ( o , 1 ) , s . selector && p . delegateCount -- , u . remove && u . remove . call ( e , s ) ) ; l && ! p . length && ( u . teardown && u . teardown . call ( e , h , f . handle ) !== ! 1 || ae . removeEvent ( e , m , f . handle ) , delete d [ m ] ) } else for ( m in d ) ae . event . remove ( e , m + t [ c ] , n , i , ! 0 ) ; ae . isEmptyObject ( d ) && ( delete f . handle , ae . _removeData ( e , "events" ) ) } } , trigger : function ( t , n , i , a ) { var o , s , r , l , c , d , u , p = [ i || he ] , m = te . call ( t , "type" ) ? t . type : t , h = te . call ( t , "namespace" ) ? t . namespace . split ( "." ) : [ ] ; if ( r = d = i = i || he , 3 !== i . nodeType && 8 !== i . nodeType && ! Ne . test ( m + ae . event . triggered ) && ( m . indexOf ( "." ) >= 0 && ( h = m . split ( "." ) , m = h . shift ( ) , h . sort ( ) ) , s = m . indexOf ( ":" ) < 0 && "on" + m , t = t [ ae . expando ] ? t : new ae . Event ( m , "object" == typeof t && t ) , t . isTrigger = a ? 2 : 3 , t . namespace = h . join ( "." ) , t . namespace _re = t . namespace ? new RegExp ( "(^|\\.)" + h . join ( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null , t . result = void 0 , t . target || ( t . target = i ) , n = null == n ? [ t ] : ae . makeArray ( n , [ t ] ) , c = ae . event . special [ m ] || { } , a || ! c . trigger || c . trigger . apply ( i , n ) !== ! 1 ) ) { if ( ! a && ! c . noBubble && ! ae . isWindow ( i ) ) { for ( l = c . delegateType || m , Ne . test ( l + m ) || ( r = r . parentNode ) ; r ; r = r . parentNode ) p . push ( r ) , d = r ; d === ( i . ownerDocument || he ) && p . push ( d . defaultView || d . parentWindow || e ) } for ( u = 0 ; ( r = p [ u ++ ] ) && ! t . isPropagationStopped ( ) ; ) t . type = u > 1 ? l : c . bindType || m , o = ( ae . _data ( r , "events" ) || { } ) [ t . type ] && ae . _data ( r , "handle" ) , o && o . apply ( r , n ) , o = s && r [ s ] , o && o . apply && ae . acceptData ( r ) && ( t . result = o . apply ( r , n ) , t . result === ! 1 && t . preventDefault ( ) ) ; if ( t . type = m , ! a && ! t . isDefaultPrevented ( ) && ( ! c . _default || c . _default . apply ( p . pop ( ) , n ) === ! 1 ) && ae . acceptData ( i ) && s && i [ m ] && ! ae . isWindow ( i ) ) { d = i [ s ] , d && ( i [ s ] = null ) , ae . event . triggered = m ; try { i [ m ] ( ) } catch ( g ) { } ae . event . triggered = void 0 , d && ( i [ s ] = d ) } return t . result } } , dispatch : function ( e ) { e = ae . event . fix ( e ) ; var t , n , i , a , o , s = [ ] , r = Y . call ( arguments ) , l = ( ae . _data ( this , "events" ) || { } ) [ e . type ] || [ ] , c = ae . event . special [ e . type ] || { } ; if ( r [ 0 ] = e , e . delegateTarget = this , ! c . preDispatch || c . preDispatch . call ( this , e ) !== ! 1 ) { for ( s = ae . event . handlers . call ( this , e , l ) , t = 0 ; ( a = s [ t ++ ] ) && ! e . isPropagationStopped ( ) ; ) for ( e . currentTarget = a . elem , o = 0 ; ( i = a . handlers [ o ++ ] ) && ! e . isImmediatePropagationStopped ( ) ; ) ( ! e . namespace _re || e . namespace _re . test ( i . namespace ) ) && ( e . handleObj = i , e . data = i . data , n = ( ( ae . event . special [ i . origType ] || { } ) . handle || i . handler ) . apply ( a . elem , r ) , void 0 !== n && ( e . result = n ) === ! 1 && ( e . preventDefault ( ) , e . stopPropagation ( ) ) ) ; return c . postDispatch && c . postDispatch . call ( this , e ) , e . result } } , handlers : function ( e , t ) { var n , i , a , o , s = [ ] , r = t . delegateCount , l = e . target ; if ( r && l . nodeType && ( ! e . button || "click" !== e . type ) ) for ( ; l != this ; l = l . parentNode || this ) if ( 1 === l . nodeType && ( l . disabled !== ! 0 || "click" !== e . type ) ) { for ( a = [ ] , o = 0 ; r > o ; o ++ ) i = t [ o ] , n = i . selector + " " , void 0 === a [ n ] && ( a [ n ] = i . needsContext ? ae ( n , this ) . index ( l ) >= 0 : ae . find ( n , this , null , [ l ] ) . length ) , a [ n ] && a . push ( i ) ; a . length && s . push ( { elem : l , handlers : a } ) } return r < t . length && s . push ( { elem : this , handlers : t . slice ( r ) } ) , s } , fix : function ( e ) { if ( e [ ae . expando ] ) return e ; var t , n , i , a = e . type , o = e , s = this . fixHooks [ a ] ; for ( s || ( this . fixHooks [ a ] = s = De . test ( a ) ? this . mouseHooks : Pe . test ( a ) ? this . keyHooks : { } ) , i = s . props ? this . props . concat ( s . props ) : this . props , e = new ae . Event ( o ) , t = i . length ; t -- ; ) n = i [ t ] , e [ n ] = o [ n ] ; return e . target || ( e . target = o . srcElement || he ) , 3 === e . target . nodeType && ( e . target = e . target . parentNode ) , e . metaKey = ! ! e . metaKey , s . filter ? s . filter ( e , o ) : e } , props : "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which" . split ( " " ) , fixHooks : { } , keyHooks : { props : "char charCode key keyCode" . split ( " " ) , filter : function ( e , t ) { return null == e . which && ( e . which = null != t . charCode ? t . charCode : t . keyCode ) , e } } , mouseHooks : { props : " button buttons clientX clientY fromElement offsetX offsetY pageX pageY scre
return e = ae . propFix [ e ] || e , this . each ( function ( ) { try { this [ e ] = void 0 , delete this [ e ] } catch ( t ) { } } ) } } ) , ae . extend ( { propFix : { "for" : "htmlFor" , "class" : "className" } , prop : function ( e , t , n ) { var i , a , o , s = e . nodeType ; return e && 3 !== s && 8 !== s && 2 !== s ? ( o = 1 !== s || ! ae . isXMLDoc ( e ) , o && ( t = ae . propFix [ t ] || t , a = ae . propHooks [ t ] ) , void 0 !== n ? a && "set" in a && void 0 !== ( i = a . set ( e , n , t ) ) ? i : e [ t ] = n : a && "get" in a && null !== ( i = a . get ( e , t ) ) ? i : e [ t ] ) : void 0 } , propHooks : { tabIndex : { get : function ( e ) { var t = ae . find . attr ( e , "tabindex" ) ; return t ? parseInt ( t , 10 ) : Mt . test ( e . nodeName ) || At . test ( e . nodeName ) && e . href ? 0 : - 1 } } } } ) , ne . hrefNormalized || ae . each ( [ "href" , "src" ] , function ( e , t ) { ae . propHooks [ t ] = { get : function ( e ) { return e . getAttribute ( t , 4 ) } } } ) , ne . optSelected || ( ae . propHooks . selected = { get : function ( e ) { var t = e . parentNode ; return t && ( t . selectedIndex , t . parentNode && t . parentNode . selectedIndex ) , null } } ) , ae . each ( [ "tabIndex" , "readOnly" , "maxLength" , "cellSpacing" , "cellPadding" , "rowSpan" , "colSpan" , "useMap" , "frameBorder" , "contentEditable" ] , function ( ) { ae . propFix [ this . toLowerCase ( ) ] = this } ) , ne . enctype || ( ae . propFix . enctype = "encoding" ) ; var Et = /[\t\r\n\f]/g ; ae . fn . extend ( { addClass : function ( e ) { var t , n , i , a , o , s , r = 0 , l = this . length , c = "string" == typeof e && e ; if ( ae . isFunction ( e ) ) return this . each ( function ( t ) { ae ( this ) . addClass ( e . call ( this , t , this . className ) ) } ) ; if ( c ) for ( t = ( e || "" ) . match ( ye ) || [ ] ; l > r ; r ++ ) if ( n = this [ r ] , i = 1 === n . nodeType && ( n . className ? ( " " + n . className + " " ) . replace ( Et , " " ) : " " ) ) { for ( o = 0 ; a = t [ o ++ ] ; ) i . indexOf ( " " + a + " " ) < 0 && ( i += a + " " ) ; s = ae . trim ( i ) , n . className !== s && ( n . className = s ) } return this } , removeClass : function ( e ) { var t , n , i , a , o , s , r = 0 , l = this . length , c = 0 === arguments . length || "string" == typeof e && e ; if ( ae . isFunction ( e ) ) return this . each ( function ( t ) { ae ( this ) . removeClass ( e . call ( this , t , this . className ) ) } ) ; if ( c ) for ( t = ( e || "" ) . match ( ye ) || [ ] ; l > r ; r ++ ) if ( n = this [ r ] , i = 1 === n . nodeType && ( n . className ? ( " " + n . className + " " ) . replace ( Et , " " ) : "" ) ) { for ( o = 0 ; a = t [ o ++ ] ; ) for ( ; i . indexOf ( " " + a + " " ) >= 0 ; ) i = i . replace ( " " + a + " " , " " ) ; s = e ? ae . trim ( i ) : "" , n . className !== s && ( n . className = s ) } return this } , toggleClass : function ( e , t ) { var n = typeof e ; return "boolean" == typeof t && "string" === n ? t ? this . addClass ( e ) : this . removeClass ( e ) : this . each ( ae . isFunction ( e ) ? function ( n ) { ae ( this ) . toggleClass ( e . call ( this , n , this . className , t ) , t ) } : function ( ) { if ( "string" === n ) for ( var t , i = 0 , a = ae ( this ) , o = e . match ( ye ) || [ ] ; t = o [ i ++ ] ; ) a . hasClass ( t ) ? a . removeClass ( t ) : a . addClass ( t ) ; else ( n === $e || "boolean" === n ) && ( this . className && ae . _data ( this , "__className__" , this . className ) , this . className = this . className || e === ! 1 ? "" : ae . _data ( this , "__className__" ) || "" ) } ) } , hasClass : function ( e ) { for ( var t = " " + e + " " , n = 0 , i = this . length ; i > n ; n ++ ) if ( 1 === this [ n ] . nodeType && ( " " + this [ n ] . className + " " ) . replace ( Et , " " ) . indexOf ( t ) >= 0 ) return ! 0 ; return ! 1 } } ) , ae . each ( "blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu" . split ( " " ) , function ( e , t ) { ae . fn [ t ] = function ( e , n ) { return arguments . length > 0 ? this . on ( t , null , e , n ) : this . trigger ( t ) } } ) , ae . fn . extend ( { hover : function ( e , t ) { return this . mouseenter ( e ) . mouseleave ( t || e ) } , bind : function ( e , t , n ) { return this . on ( e , null , t , n ) } , unbind : function ( e , t ) { return this . off ( e , null , t ) } , delegate : function ( e , t , n , i ) { return this . on ( t , e , n , i ) } , undelegate : function ( e , t , n ) { return 1 === arguments . length ? this . off ( e , "**" ) : this . off ( t , e || "**" , n ) } } ) ; var It = ae . now ( ) , Tt = /\?/ , Pt = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g ; ae . parseJSON = function ( t ) { if ( e . JSON && e . JSON . parse ) return e . JSON . parse ( t + "" ) ; var n , i = null , a = ae . trim ( t + "" ) ; return a && ! ae . trim ( a . replace ( Pt , function ( e , t , a , o ) { return n && t && ( i = 0 ) , 0 === i ? e : ( n = a || t , i += ! o - ! a , "" ) } ) ) ? Function ( "return " + a ) ( ) : ae . error ( "Invalid JSON: " + t ) } , ae . parseXML = function ( t ) { var n , i ; if ( ! t || "string" != typeof t ) return null ; try { e . DOMParser ? ( i = new DOMParser , n = i . parseFromString ( t , "text/xml" ) ) : ( n = new ActiveXObject ( "Microsoft.XMLDOM" ) , n . async = "false" , n . loadXML ( t ) ) } catch ( a ) { n = void 0 } return n && n . documentElement && ! n . getElementsByTagName ( "parsererror" ) . length || ae . error ( "Invalid XML: " + t ) , n } ; var Dt , Nt , Ft = /#.*$/ , Ot = / (
type : "Vector t" } , { id : "-994444869" , predicate : "error" , params : [ { name : "code" , type : "int" } , { name : "text" , type : "string" } ] , type : "Error" } , { id : "1450380236" , predicate : "null" , params : [ ] , type : "Null" } , { id : "2134579434" , predicate : "inputPeerEmpty" , params : [ ] , type : "InputPeer" } , { id : "2107670217" , predicate : "inputPeerSelf" , params : [ ] , type : "InputPeer" } , { id : "396093539" , predicate : "inputPeerChat" , params : [ { name : "chat_id" , type : "int" } ] , type : "InputPeer" } , { id : "-1182234929" , predicate : "inputUserEmpty" , params : [ ] , type : "InputUser" } , { id : "-138301121" , predicate : "inputUserSelf" , params : [ ] , type : "InputUser" } , { id : "-208488460" , predicate : "inputPhoneContact" , params : [ { name : "client_id" , type : "long" } , { name : "phone" , type : "string" } , { name : "first_name" , type : "string" } , { name : "last_name" , type : "string" } ] , type : "InputContact" } , { id : "-181407105" , predicate : "inputFile" , params : [ { name : "id" , type : "long" } , { name : "parts" , type : "int" } , { name : "name" , type : "string" } , { name : "md5_checksum" , type : "string" } ] , type : "InputFile" } , { id : "-1771768449" , predicate : "inputMediaEmpty" , params : [ ] , type : "InputMedia" } , { id : "-139464256" , predicate : "inputMediaUploadedPhoto" , params : [ { name : "file" , type : "InputFile" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "-373312269" , predicate : "inputMediaPhoto" , params : [ { name : "id" , type : "InputPhoto" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "-104578748" , predicate : "inputMediaGeoPoint" , params : [ { name : "geo_point" , type : "InputGeoPoint" } ] , type : "InputMedia" } , { id : "-1494984313" , predicate : "inputMediaContact" , params : [ { name : "phone_number" , type : "string" } , { name : "first_name" , type : "string" } , { name : "last_name" , type : "string" } ] , type : "InputMedia" } , { id : "-2106507297" , predicate : "inputMediaUploadedVideo" , params : [ { name : "file" , type : "InputFile" } , { name : "duration" , type : "int" } , { name : "w" , type : "int" } , { name : "h" , type : "int" } , { name : "mime_type" , type : "string" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "2004934137" , predicate : "inputMediaUploadedThumbVideo" , params : [ { name : "file" , type : "InputFile" } , { name : "thumb" , type : "InputFile" } , { name : "duration" , type : "int" } , { name : "w" , type : "int" } , { name : "h" , type : "int" } , { name : "mime_type" , type : "string" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "-1821749571" , predicate : "inputMediaVideo" , params : [ { name : "id" , type : "InputVideo" } , { name : "caption" , type : "string" } ] , type : "InputMedia" } , { id : "480546647" , predicate : "inputChatPhotoEmpty" , params : [ ] , type : "InputChatPhoto" } , { id : "-1809496270" , predicate : "inputChatUploadedPhoto" , params : [ { name : "file" , type : "InputFile" } , { name : "crop" , type : "InputPhotoCrop" } ] , type : "InputChatPhoto" } , { id : "-1293828344" , predicate : "inputChatPhoto" , params : [ { name : "id" , type : "InputPhoto" } , { name : "crop" , type : "InputPhotoCrop" } ] , type : "InputChatPhoto" } , { id : "-457104426" , predicate : "inputGeoPointEmpty" , params : [ ] , type : "InputGeoPoint" } , { id : "-206066487" , predicate : "inputGeoPoint" , params : [ { name : "lat" , type : "double" } , { name : "long" , type : "double" } ] , type : "InputGeoPoint" } , { id : "483901197" , predicate : "inputPhotoEmpty" , params : [ ] , type : "InputPhoto" } , { id : "-74070332" , predicate : "inputPhoto" , params : [ { name : "id" , type : "long" } , { name : "access_hash" , type : "long" } ] , type : "InputPhoto" } , { id : "1426648181" , predicate : "inputVideoEmpty" , params : [ ] , type : "InputVideo" } , { id : "-296249774" , predicate : "inputVideo" , params : [ { name : "id" , type : "long" } , { name : "access_hash" , type : "long" } ] , type : "InputVideo" } , { id : "342061462" , predicate : "inputFileLocation" , params : [ { name : "volume_id" , type : "long" } , { name : "local_id" , type : "int" } , { name : "secret" , type : "long" } ] , type : "InputFileLocation" } , { id : "1023632620" , predicate : "inputVideoFileLocation" , params : [ { name : "id" , type : "long" } , { name : "access_hash" , type : "long" } ] , type : "InputFileLocation" } , { id : "-1377390588" , predicate : "inputPhotoCropAuto" , params : [ ] , type : "InputPhotoCrop" } , { id : "-644787419" , predicate : "inputPhotoCrop" , params : [ { name : "crop_left" , type : "double" } , { name : "crop_top" , type : "double" } , { name : "crop_width" , type : "double" } ] , type : "InputPhotoCrop" } , { id : "1996904104" , predicate : "inputAppEvent" , params : [ { name : "time" , type : "double" } , { name : "type" , type : "string" } , { name : "peer" , type : "long" } , { name : "data" , type : "string" } ] , type : "InputAppEvent" } , { id : "-1649296275" , predicate : "peerUser" , params : [ { name : "user_id" , type : "int" } ] , type : "Peer" } ,
predicate : "updateUserBlocked" , params : [ { name : "user_id" , type : "int" } , { name : "blocked" , type : "Bool" } ] , type : "Update" } , { id : "-1094555409" , predicate : "updateNotifySettings" , params : [ { name : "peer" , type : "NotifyPeer" } , { name : "notify_settings" , type : "PeerNotifySettings" } ] , type : "Update" } , { id : "-484053553" , predicate : "auth.sentAppCode" , params : [ { name : "phone_registered" , type : "Bool" } , { name : "phone_code_hash" , type : "string" } , { name : "send_call_timeout" , type : "int" } , { name : "is_password" , type : "Bool" } ] , type : "auth.SentCode" } , { id : "381645902" , predicate : "sendMessageTypingAction" , params : [ ] , type : "SendMessageAction" } , { id : "-44119819" , predicate : "sendMessageCancelAction" , params : [ ] , type : "SendMessageAction" } , { id : "-1584933265" , predicate : "sendMessageRecordVideoAction" , params : [ ] , type : "SendMessageAction" } , { id : "-378127636" , predicate : "sendMessageUploadVideoAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-718310409" , predicate : "sendMessageRecordAudioAction" , params : [ ] , type : "SendMessageAction" } , { id : "-212740181" , predicate : "sendMessageUploadAudioAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-774682074" , predicate : "sendMessageUploadPhotoAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "-1441998364" , predicate : "sendMessageUploadDocumentAction" , params : [ { name : "progress" , type : "int" } ] , type : "SendMessageAction" } , { id : "393186209" , predicate : "sendMessageGeoLocationAction" , params : [ ] , type : "SendMessageAction" } , { id : "1653390447" , predicate : "sendMessageChooseContactAction" , params : [ ] , type : "SendMessageAction" } , { id : "446822276" , predicate : "contacts.found" , params : [ { name : "results" , type : "Vector<Peer>" } , { name : "chats" , type : "Vector<Chat>" } , { name : "users" , type : "Vector<User>" } ] , type : "contacts.Found" } , { id : "942527460" , predicate : "updateServiceNotification" , params : [ { name : "type" , type : "string" } , { name : "message" , type : "string" } , { name : "media" , type : "MessageMedia" } , { name : "popup" , type : "Bool" } ] , type : "Update" } , { id : "-496024847" , predicate : "userStatusRecently" , params : [ ] , type : "UserStatus" } , { id : "129960444" , predicate : "userStatusLastWeek" , params : [ ] , type : "UserStatus" } , { id : "2011940674" , predicate : "userStatusLastMonth" , params : [ ] , type : "UserStatus" } , { id : "-298113238" , predicate : "updatePrivacy" , params : [ { name : "key" , type : "PrivacyKey" } , { name : "rules" , type : "Vector<PrivacyRule>" } ] , type : "Update" } , { id : "1335282456" , predicate : "inputPrivacyKeyStatusTimestamp" , params : [ ] , type : "InputPrivacyKey" } , { id : "-1137792208" , predicate : "privacyKeyStatusTimestamp" , params : [ ] , type : "PrivacyKey" } , { id : "218751099" , predicate : "inputPrivacyValueAllowContacts" , params : [ ] , type : "InputPrivacyRule" } , { id : "407582158" , predicate : "inputPrivacyValueAllowAll" , params : [ ] , type : "InputPrivacyRule" } , { id : "320652927" , predicate : "inputPrivacyValueAllowUsers" , params : [ { name : "users" , type : "Vector<InputUser>" } ] , type : "InputPrivacyRule" } , { id : "195371015" , predicate : "inputPrivacyValueDisallowContacts" , params : [ ] , type : "InputPrivacyRule" } , { id : "-697604407" , predicate : "inputPrivacyValueDisallowAll" , params : [ ] , type : "InputPrivacyRule" } , { id : "-1877932953" , predicate : "inputPrivacyValueDisallowUsers" , params : [ { name : "users" , type : "Vector<InputUser>" } ] , type : "InputPrivacyRule" } , { id : "-123988" , predicate : "privacyValueAllowContacts" , params : [ ] , type : "PrivacyRule" } , { id : "1698855810" , predicate : "privacyValueAllowAll" , params : [ ] , type : "PrivacyRule" } , { id : "1297858060" , predicate : "privacyValueAllowUsers" , params : [ { name : "users" , type : "Vector<int>" } ] , type : "PrivacyRule" } , { id : "-125240806" , predicate : "privacyValueDisallowContacts" , params : [ ] , type : "PrivacyRule" } , { id : "-1955338397" , predicate : "privacyValueDisallowAll" , params : [ ] , type : "PrivacyRule" } , { id : "209668535" , predicate : "privacyValueDisallowUsers" , params : [ { name : "users" , type : "Vector<int>" } ] , type : "PrivacyRule" } , { id : "1430961007" , predicate : "account.privacyRules" , params : [ { name : "rules" , type : "Vector<PrivacyRule>" } , { name : "users" , type : "Vector<User>" } ] , type : "account.PrivacyRules" } , { id : "-1194283041" , predicate : "accountDaysTTL" , params : [ { name : "days" , type : "int" } ] , type : "AccountDaysTTL" } , { id : "-1527411636" , predicate : "account.sentChangePhoneCode" , params : [ { name : "phone_code_hash" , type : "string" } , { name : "send_call_timeout" , type : "int" } ] , type : " acc
name : "peer" , type : "InputPeer" } , { name : "id" , type : "int" } , { name : "random_id" , type : "long" } ] , type : "Updates" } , { id : "-1082919718" , method : "messages.sendBroadcast" , params : [ { name : "contacts" , type : "Vector<InputUser>" } , { name : "random_id" , type : "Vector<long>" } , { name : "message" , type : "string" } , { name : "media" , type : "InputMedia" } ] , type : "Updates" } , { id : "651135312" , method : "messages.getDhConfig" , params : [ { name : "version" , type : "int" } , { name : "random_length" , type : "int" } ] , type : "messages.DhConfig" } , { id : "-162681021" , method : "messages.requestEncryption" , params : [ { name : "user_id" , type : "InputUser" } , { name : "random_id" , type : "int" } , { name : "g_a" , type : "bytes" } ] , type : "EncryptedChat" } , { id : "1035731989" , method : "messages.acceptEncryption" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "g_b" , type : "bytes" } , { name : "key_fingerprint" , type : "long" } ] , type : "EncryptedChat" } , { id : "-304536635" , method : "messages.discardEncryption" , params : [ { name : "chat_id" , type : "int" } ] , type : "Bool" } , { id : "2031374829" , method : "messages.setEncryptedTyping" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "typing" , type : "Bool" } ] , type : "Bool" } , { id : "2135648522" , method : "messages.readEncryptedHistory" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "max_date" , type : "int" } ] , type : "Bool" } , { id : "-1451792525" , method : "messages.sendEncrypted" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "random_id" , type : "long" } , { name : "data" , type : "bytes" } ] , type : "messages.SentEncryptedMessage" } , { id : "-1701831834" , method : "messages.sendEncryptedFile" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "random_id" , type : "long" } , { name : "data" , type : "bytes" } , { name : "file" , type : "InputEncryptedFile" } ] , type : "messages.SentEncryptedMessage" } , { id : "852769188" , method : "messages.sendEncryptedService" , params : [ { name : "peer" , type : "InputEncryptedChat" } , { name : "random_id" , type : "long" } , { name : "data" , type : "bytes" } ] , type : "messages.SentEncryptedMessage" } , { id : "1436924774" , method : "messages.receivedQueue" , params : [ { name : "max_qts" , type : "int" } ] , type : "Vector<long>" } , { id : "-562337987" , method : "upload.saveBigFilePart" , params : [ { name : "file_id" , type : "long" } , { name : "file_part" , type : "int" } , { name : "file_total_parts" , type : "int" } , { name : "bytes" , type : "bytes" } ] , type : "Bool" } , { id : "1769565673" , method : "initConnection" , params : [ { name : "api_id" , type : "int" } , { name : "device_model" , type : "string" } , { name : "system_version" , type : "string" } , { name : "app_version" , type : "string" } , { name : "lang_code" , type : "string" } , { name : "query" , type : "!X" } ] , type : "X" } , { id : "-1663104819" , method : "help.getSupport" , params : [ ] , type : "help.Support" } , { id : "229241832" , method : "auth.sendSms" , params : [ { name : "phone_number" , type : "string" } , { name : "phone_code_hash" , type : "string" } ] , type : "Bool" } , { id : "916930423" , method : "messages.readMessageContents" , params : [ { name : "id" , type : "Vector<int>" } ] , type : "messages.AffectedMessages" } , { id : "655677548" , method : "account.checkUsername" , params : [ { name : "username" , type : "string" } ] , type : "Bool" } , { id : "1040964988" , method : "account.updateUsername" , params : [ { name : "username" , type : "string" } ] , type : "User" } , { id : "301470424" , method : "contacts.search" , params : [ { name : "q" , type : "string" } , { name : "limit" , type : "int" } ] , type : "contacts.Found" } , { id : "-623130288" , method : "account.getPrivacy" , params : [ { name : "key" , type : "InputPrivacyKey" } ] , type : "account.PrivacyRules" } , { id : "-906486552" , method : "account.setPrivacy" , params : [ { name : "key" , type : "InputPrivacyKey" } , { name : "rules" , type : "Vector<InputPrivacyRule>" } ] , type : "account.PrivacyRules" } , { id : "1099779595" , method : "account.deleteAccount" , params : [ { name : "reason" , type : "string" } ] , type : "Bool" } , { id : "150761757" , method : "account.getAccountTTL" , params : [ ] , type : "AccountDaysTTL" } , { id : "608323678" , method : "account.setAccountTTL" , params : [ { name : "ttl" , type : "AccountDaysTTL" } ] , type : "Bool" } , { id : "-627372787" , method : "invokeWithLayer" , params : [ { name : "layer" , type : "int" } , { name : "query" , type : "!X" } ] , type : "X" } , { id : "-113456221" , method : "contacts.resolveUsername" , params : [ { name : "username" , type : "string" } ] , type : "contacts.ResolvedPeer" } , { id : "-1543001868" , method : "account.sendChangePhoneCode" , params : [ { name : "phone_number" , type : "string" } ] , type : "account.SentChangePhoneCode" } , { id : "1891839707" , method : "account.changePhone" , params : [ { name : "phone_number" , type : " s
"1f622" : [ "😢" , [ "cry" ] , ":'(" ] , "1f623" : [ "😣" , [ "persevere" ] ] , "1f624" : [ "😤" , [ "triumph" ] ] , "1f625" : [ "😥" , [ "disappointed_relieved" ] ] , "1f626" : [ "😦" , [ "frowning" ] ] , "1f627" : [ "😧" , [ "anguished" ] ] , "1f628" : [ "😨" , [ "fearful" ] ] , "1f629" : [ "😩" , [ "weary" ] ] , "1f62a" : [ "😪" , [ "sleepy" ] ] , "1f62b" : [ "😫" , [ "tired_face" ] ] , "1f62c" : [ "😬" , [ "grimacing" ] ] , "1f62d" : [ "😭" , [ "sob" ] , ":'(" ] , "1f62e" : [ "😮" , [ "open_mouth" ] ] , "1f62f" : [ "😯" , [ "hushed" ] ] , "1f630" : [ "😰" , [ "cold_sweat" ] ] , "1f631" : [ "😱" , [ "scream" ] ] , "1f632" : [ "😲" , [ "astonished" ] ] , "1f633" : [ "😳" , [ "flushed" ] ] , "1f634" : [ "😴" , [ "sleeping" ] ] , "1f635" : [ "😵" , [ "dizzy_face" ] ] , "1f636" : [ "😶" , [ "no_mouth" ] ] , "1f637" : [ "😷" , [ "mask" ] ] , "1f638" : [ "😸" , [ "smile_cat" ] ] , "1f639" : [ "😹" , [ "joy_cat" ] ] , "1f63a" : [ "😺" , [ "smiley_cat" ] ] , "1f63b" : [ "😻" , [ "heart_eyes_cat" ] ] , "1f63c" : [ "😼" , [ "smirk_cat" ] ] , "1f63d" : [ "😽" , [ "kissing_cat" ] ] , "1f63e" : [ "😾" , [ "pouting_cat" ] ] , "1f63f" : [ "😿" , [ "crying_cat_face" ] ] , "1f640" : [ "🙀" , [ "scream_cat" ] ] , "1f645" : [ "🙅" , [ "no_good" ] ] , "1f646" : [ "🙆" , [ "ok_woman" ] ] , "1f647" : [ "🙇" , [ "bow" ] ] , "1f648" : [ "🙈" , [ "see_no_evil" ] ] , "1f649" : [ "🙉" , [ "hear_no_evil" ] ] , "1f64a" : [ "🙊" , [ "speak_no_evil" ] ] , "1f64b" : [ "🙋" , [ "raising_hand" ] ] , "1f64c" : [ "🙌" , [ "raised_hands" ] ] , "1f64d" : [ "🙍" , [ "person_frowning" ] ] , "1f64e" : [ "🙎" , [ "person_with_pouting_face" ] ] , "1f64f" : [ "🙏" , [ "pray" ] ] , "1f680" : [ "🚀" , [ "rocket" ] ] , "1f681" : [ "🚁" , [ "helicopter" ] ] , "1f682" : [ "🚂" , [ "steam_locomotive" ] ] , "1f683" : [ "🚃" , [ "railway_car" ] ] , "1f68b" : [ "🚋" , [ "train" ] ] , "1f684" : [ "🚄" , [ "bullettrain_side" ] ] , "1f685" : [ "🚅" , [ "bullettrain_front" ] ] , "1f686" : [ "🚆" , [ "train2" ] ] , "1f687" : [ "🚇" , [ "metro" ] ] , "1f688" : [ "🚈" , [ "light_rail" ] ] , "1f689" : [ "🚉" , [ "station" ] ] , "1f68a" : [ "🚊" , [ "tram" ] ] , "1f68c" : [ "🚌" , [ "bus" ] ] , "1f68d" : [ "🚍" , [ "oncoming_bus" ] ] , "1f68e" : [ "🚎" , [ "trolleybus" ] ] , "1f68f" : [ "🚏" , [ "busstop" ] ] , "1f690" : [ "🚐" , [ "minibus" ] ] , "1f691" : [ "🚑" , [ "ambulance" ] ] , "1f692" : [ "🚒" , [ "fire_engine" ] ] , "1f693" : [ "🚓" , [ "police_car" ] ] , "1f694" : [ "🚔" , [ "oncoming_police_car" ] ] , "1f695" : [ "🚕" , [ "taxi" ] ] , "1f696" : [ "🚖" , [ "oncoming_taxi" ] ] , "1f697" : [ "🚗" , [ "car" , "red_car" ] ] , "1f698" : [ "🚘" , [ "oncoming_automobile" ] ] , "1f699" : [ "🚙" , [ "blue_car" ] ] , "1f69a" : [ "🚚" , [ "truck" ] ] , "1f69b" : [ "🚛" , [ "articulated_lorry" ] ] , "1f69c" : [ "🚜" , [ "tractor" ] ] , "1f69d" : [ "🚝" , [ "monorail" ] ] , "1f69e" : [ "🚞" , [ "mountain_railway" ] ] , "1f69f" : [ "🚟" , [ "suspension_railway" ] ] , "1f6a0" : [ "🚠" , [ "mountain_cableway" ] ] , "1f6a1" : [ "🚡" , [ "aerial_tramway" ] ] , "1f6a2" : [ "🚢" , [ "ship" ] ] , "1f6a3" : [ "🚣" , [ "rowboat" ] ] , "1f6a4" : [ "🚤" , [ "speedboat" ] ] , "1f6a5" : [ "🚥" , [ "traffic_light" ] ] , "1f6a6" : [ "🚦" , [ "vertical_traffic_light" ] ] , "1f6a7" : [ "🚧" , [ "construction" ] ] , "1f6a8" : [ "🚨" , [ "rotating_light" ] ] , "1f6a9" : [ "🚩" , [ "triangular_flag_on_post" ] ] , "1f6aa" : [ "🚪" , [ "door" ] ] , "1f6ab" : [ "🚫" , [ "no_entry_sign" ] ] , "1f6ac" : [ "🚬" , [ "smoking" ] ] , "1f6ad" : [ "🚭" , [ "no_smoking" ] ] , "1f6ae" : [ "🚮" , [ "put_litter_in_its_place" ] ] , "1f6af" : [ "🚯" , [ "do_not_litter" ] ] , "1f6b0" : [ "🚰" , [ "potable_water" ] ] , "1f6b1" : [ "🚱" , [ "non-potable_water" ] ] , "1f6b2" : [ "🚲" , [ "bike" ] ] , "1f6b3" : [ "🚳" , [ "no_bicycles" ] ] , "1f6b4" : [ "🚴" , [ "bicyclist" ] ] , "1f6b5" : [ "🚵" , [ "mountain_bicyclist" ] ] , "1f6b6" : [ "🚶" , [ "walking" ] ] , "1f6b7" : [ "🚷" , [ "no_pedestrians" ] ] , "1f6b8" : [ "🚸" , [ "children_crossing" ] ] , "1f6b9" : [ "🚹" , [ "mens" ] ] , "1f6ba" : [ "🚺" , [ "womens" ] ] , "1f6bb" : [ "🚻" , [ "restroom" ] ] , "1f6bc" : [ "🚼" , [ "baby_symbol" ] ] , "1f6bd" : [ "🚽" , [ "toilet" ] ] , "1f6be" : [ "🚾" , [ "wc" ] ] , "1f6bf" : [ "🚿" , [ "shower" ] ] , "1f6c0" : [ "🛀" , [ "bath" ] ] , "1f6c1" : [ "🛁" , [ "bathtub" ] ] , "1f6c2" : [ "🛂" , [ "passport_control" ] ] , "1f6c3" : [ "🛃" , [ "customs" ] ] , "1f6c4" : [ "🛄" , [ "baggage_claim" ] ] , "1f6c5" : [ "🛅" , [ "left_luggage" ] ] , "0023" : [ "#⃣ " , [ "hash" ] ] , "0030" : [ "0⃣ " , [ "zero" ] ] , "0031" : [ "1⃣ " , [ "one" ] ] , "0032" : [ "2⃣ " , [ "two" ] ] , "0033" : [ "3⃣ " , [ "three" ] ] , "0034" : [ "4⃣ " , [ "four" ] ] , "0035" : [ "5⃣ " , [ "five" ] ] , "0036" : [ "6⃣ " , [ "six" ] ] , "0037" : [ "7⃣ " , [ "seven" ] ] , "0038" : [ "8⃣ " , [ "eight" ] ] , "0039" : [ "9⃣ " , [ "nine" ] ] , "1f1e8-1f1f3" : [ "🇨🇳" , [ "cn" ] ] , "1f1e9-1f1ea" : [ "🇩🇪" , [ "de" ] ] , "1f1ea-1f1f8" : [ "🇪🇸" , [ "es" ] ] , "1f1eb-1f1f7" : [ "🇫🇷" , [ "fr" ] ] , "1f1ec-1f1e7" : [ "🇬🇧" , [ "gb" , "uk" ] ] , "1f1ee-1f1f9" : [ "🇮🇹" , [ " it
clearTimeout ( i ) , i = setTimeout ( function ( ) { try { t . update ( ) } catch ( e ) { console . log ( "appCache.update: " + e ) } } , e || 3e5 ) } , o = function ( ) { t . addEventListener ( "updateready" , function ( e ) { t . status == t . UPDATEREADY && ( n || ( safeConfirm ( { type : "WEBOGRAM_UPDATED_RELOAD" , message : "A new version of Webogram is downloaded. Launch it?" } , function ( e ) { e ? window . location . reload ( ) : n = ! 0 } ) , a ( ) ) ) } , ! 1 ) , t . addEventListener ( "noupdate" , function ( ) { a ( ) } , ! 1 ) , t . addEventListener ( "error" , function ( ) { a ( ) } , ! 1 ) } ; a ( 3e3 ) , window . addEventListener ( "load" , o ) } } ( ) , function ( ) { var e = [ Config . Navigator . osX ? "osx" : "non_osx" , Config . Navigator . retina ? "is_2x" : "is_1x" ] ; Config . Modes . ios _standalone && e . push ( "ios_standalone" ) , $ ( document . body ) . addClass ( e . join ( " " ) ) , ConfigStorage . get ( "layout_selected" , "i18n_locale" , function ( e ) { var t = e [ 0 ] , n = e [ 1 ] , i = "en-us" , a = { dom : ! 1 , i18n _ng : ! 1 , i18n _messages : ! 1 , i18n _fallback : ! 1 } , o = function ( ) { var e , t = ! 0 ; for ( e in a ) if ( a . hasOwnProperty ( e ) && a [ e ] === ! 1 ) { t = ! 1 ; break } t && ( a . boot = ! 1 , angular . bootstrap ( document , [ "myApp" ] ) ) } ; switch ( Config . Modes . force _mobile ? t = "mobile" : Config . Modes . force _desktop && ( t = "desktop" ) , t ) { case "mobile" : Config . Mobile = ! 0 ; break ; case "desktop" : Config . Mobile = ! 1 ; break ; default : var s = $ ( window ) . width ( ) ; Config . Mobile = Config . Navigator . mobile || s > 10 && 480 > s } $ ( "head" ) . append ( '<link rel="stylesheet" href="css/' + ( Config . Mobile ? "mobile.css" : "desktop.css" ) + '" />' ) , n || ( n = ( navigator . language || "" ) . toLowerCase ( ) , n = Config . I18n . aliases [ n ] || n ) ; for ( var r = 0 ; r < Config . I18n . supported . length ; r ++ ) if ( Config . I18n . supported [ r ] == n ) { Config . I18n . locale = n ; break } a . i18n _ng = Config . I18n . locale == i , $ . getJSON ( "js/locales/" + Config . I18n . locale + ".json" ) . success ( function ( e ) { Config . I18n . messages = e , a . i18n _messages = ! 0 , Config . I18n . locale == i && ( a . i18n _fallback = ! 0 ) , o ( ) } ) , Config . I18n . locale != i && $ . getJSON ( "js/locales/" + i + ".json" ) . success ( function ( e ) { Config . I18n . fallback _messages = e , a . i18n _fallback = ! 0 , o ( ) } ) , $ ( document ) . ready ( function ( ) { a . dom = ! 0 , a . i18n _ng ? o ( ) : $ ( "<script>" ) . appendTo ( "body" ) . on ( "load" , function ( ) { a . i18n _ng = ! 0 , o ( ) } ) . attr ( "src" , "vendor/angular/i18n/angular-locale_" + Config . I18n . locale + ".js" ) } ) } ) } ( ) , function ( e , t , n ) { "use strict" ; var i , a , o , s , r , l , c , d , u , p , m , h , g , f , _ , v , y , b , w , k , $ , S , C , x , M , A , E , I , T , P , D ; C = { paneClass : "nano-pane" , sliderClass : "nano-slider" , contentClass : "nano-content" , iOSNativeScrolling : ! 1 , preventPageScrolling : ! 1 , disableResize : ! 1 , alwaysVisible : ! 1 , flashDelay : 1500 , sliderMinHeight : 20 , sliderMaxHeight : null , documentContext : null , windowContext : null } , b = "scrollbar" , y = "scroll" , u = "mousedown" , p = "mouseenter" , m = "mousemove" , g = "mousewheel" , h = "mouseup" , v = "resize" , r = "drag" , l = "enter" , k = "up" , _ = "panedown" , o = "DOMMouseScroll" , s = "down" , $ = "wheel" , c = "keydown" , d = "keyup" , w = "touchmove" , i = "Microsoft Internet Explorer" === t . navigator . appName && /msie 7./i . test ( t . navigator . appVersion ) && t . ActiveXObject , a = null , E = t . requestAnimationFrame , S = t . cancelAnimationFrame , T = n . createElement ( "div" ) . style , D = function ( ) { var e , t , n , i , a , o ; for ( i = [ "t" , "webkitT" , "MozT" , "msT" , "OT" ] , e = a = 0 , o = i . length ; o > a ; e = ++ a ) if ( n = i [ e ] , t = i [ e ] + "ransform" , t in T ) return i [ e ] . substr ( 0 , i [ e ] . length - 1 ) ; return ! 1 } ( ) , P = function ( e ) { return D === ! 1 ? ! 1 : "" === D ? e : D + e . charAt ( 0 ) . toUpperCase ( ) + e . substr ( 1 ) } , I = P ( "transform" ) , M = I !== ! 1 , x = function ( ) { var e , t , i ; return e = n . createElement ( "div" ) , t = e . style , t . position = "absolute" , t . width = "100px" , t . height = "100px" , t . overflow = y , t . top = "-9999px" , n . body . appendChild ( e ) , i = e . offsetWidth - e . clientWidth , n . body . removeChild ( e ) , i } , A = function ( ) { var e , n , i ; return n = t . navigator . userAgent , ( e = /(?=.+Mac OS X)(?=.+Firefox)/ . test ( n ) ) ? ( i = /Firefox\/\d{2}\./ . exec ( n ) , i && ( i = i [ 0 ] . replace ( /\D+/g , "" ) ) , e && + i > 23 ) : ! 1 } , f = function ( ) { function c ( i , o ) { this . el = i , this . options = o , a || ( a = x ( ) ) , this . $el = e ( this . el ) , this . doc = e ( this . options . documentContext || n ) , this . win = e ( this . options . windowContext || t ) , this . body = this . doc . find ( "body" ) , this . $content = this . $el . children ( "." + o . contentClass ) , this . $content . attr ( "tabindex" , this . options . tabIndex || 0 ) , this . content = this . $content [ 0 ] , this . previousPosition = 0 , this . options . iOSNativeScrolling && ( null != this . el . style . WebkitOverflowScrolling || navigator . userAgent . match ( /mobi.+Gecko/i ) ) ? this . nativeScrolling ( ) : this . generate ( ) , this . createEvents ( ) , this . addEvents ( ) , this . reset ( ) } return c . prototype . preven
e && M . invoke ( e ) } ) , M } function Qe ( ) { var e = ! 0 ; this . disableAutoScrolling = function ( ) { e = ! 1 } , this . $get = [ "$window" , "$location" , "$rootScope" , function ( t , n , i ) { function a ( e ) { var t = null ; return Array . prototype . some . call ( e , function ( e ) { return "a" === R ( e ) ? ( t = e , ! 0 ) : void 0 } ) , t } function o ( ) { var e = r . yOffset ; if ( x ( e ) ) e = e ( ) ; else if ( O ( e ) ) { var n = e [ 0 ] , i = t . getComputedStyle ( n ) ; e = "fixed" !== i . position ? 0 : n . getBoundingClientRect ( ) . bottom } else S ( e ) || ( e = 0 ) ; return e } function s ( e ) { if ( e ) { e . scrollIntoView ( ) ; var n = o ( ) ; if ( n ) { var i = e . getBoundingClientRect ( ) . top ; t . scrollBy ( 0 , i - n ) } } else t . scrollTo ( 0 , 0 ) } function r ( e ) { e = $ ( e ) ? e : n . hash ( ) ; var t ; e ? ( t = l . getElementById ( e ) ) ? s ( t ) : ( t = a ( l . getElementsByName ( e ) ) ) ? s ( t ) : "top" === e && s ( null ) : s ( null ) } var l = t . document ; return e && i . $watch ( function ( ) { return n . hash ( ) } , function ( e , t ) { ( e !== t || "" !== e ) && He ( function ( ) { i . $evalAsync ( r ) } ) } ) , r } ] } function et ( e , t ) { return e || t ? e ? t ? ( Ri ( e ) && ( e = e . join ( " " ) ) , Ri ( t ) && ( t = t . join ( " " ) ) , e + " " + t ) : e : t : "" } function tt ( e ) { for ( var t = 0 ; t < e . length ; t ++ ) { var n = e [ t ] ; if ( n . nodeType === Sa ) return n } } function nt ( e ) { $ ( e ) && ( e = e . split ( " " ) ) ; var t = fe ( ) ; return o ( e , function ( e ) { e . length && ( t [ e ] = ! 0 ) } ) , t } function it ( e ) { return w ( e ) ? e : { } } function at ( e , t , n , i ) { function a ( e ) { try { e . apply ( null , V ( arguments , 1 ) ) } finally { if ( v -- , 0 === v ) for ( ; b . length ; ) try { b . pop ( ) ( ) } catch ( t ) { n . error ( t ) } } } function s ( e ) { var t = e . indexOf ( "#" ) ; return - 1 === t ? "" : e . substr ( t ) } function r ( ) { C = null , c ( ) , d ( ) } function l ( ) { try { return m . state } catch ( e ) { } } function c ( ) { w = l ( ) , w = y ( w ) ? null : w , q ( w , A ) && ( w = A ) , A = w } function d ( ) { ( $ !== u . url ( ) || k !== w ) && ( $ = u . url ( ) , k = w , o ( x , function ( e ) { e ( u . url ( ) , w ) } ) ) } var u = this , p = ( t [ 0 ] , e . location ) , m = e . history , h = e . setTimeout , f = e . clearTimeout , _ = { } ; u . isMock = ! 1 ; var v = 0 , b = [ ] ; u . $$completeOutstandingRequest = a , u . $$incOutstandingRequestCount = function ( ) { v ++ } , u . notifyWhenNoOutstandingRequests = function ( e ) { 0 === v ? e ( ) : b . push ( e ) } ; var w , k , $ = p . href , S = t . find ( "base" ) , C = null ; c ( ) , k = w , u . url = function ( t , n , a ) { if ( y ( a ) && ( a = null ) , p !== e . location && ( p = e . location ) , m !== e . history && ( m = e . history ) , t ) { var o = k === a ; if ( $ === t && ( ! i . history || o ) ) return u ; var r = $ && Ft ( $ ) === Ft ( t ) ; return $ = t , k = a , ! i . history || r && o ? ( ( ! r || C ) && ( C = t ) , n ? p . replace ( t ) : r ? p . hash = s ( t ) : p . href = t , p . href !== t && ( C = t ) ) : ( m [ n ? "replaceState" : "pushState" ] ( a , "" , t ) , c ( ) , k = w ) , u } return C || p . href . replace ( /%27/g , "'" ) } , u . state = function ( ) { return w } ; var x = [ ] , M = ! 1 , A = null ; u . onUrlChange = function ( t ) { return M || ( i . history && xi ( e ) . on ( "popstate" , r ) , xi ( e ) . on ( "hashchange" , r ) , M = ! 0 ) , x . push ( t ) , t } , u . $$applicationDestroyed = function ( ) { xi ( e ) . off ( "hashchange popstate" , r ) } , u . $$checkUrlChange = d , u . baseHref = function ( ) { var e = S . attr ( "href" ) ; return e ? e . replace ( /^(https?\:)?\/\/[^\/]*/ , "" ) : "" } , u . defer = function ( e , t ) { var n ; return v ++ , n = h ( function ( ) { delete _ [ n ] , a ( e ) } , t || 0 ) , _ [ n ] = ! 0 , n } , u . defer . cancel = function ( e ) { return _ [ e ] ? ( delete _ [ e ] , f ( e ) , a ( g ) , ! 0 ) : ! 1 } } function ot ( ) { this . $get = [ "$window" , "$log" , "$sniffer" , "$document" , function ( e , t , n , i ) { return new at ( e , i , t , n ) } ] } function st ( ) { this . $get = function ( ) { function e ( e , n ) { function a ( e ) { e != p && ( m ? m == e && ( m = e . n ) : m = e , o ( e . n , e . p ) , o ( e , p ) , p = e , p . n = null ) } function o ( e , t ) { e != t && ( e && ( e . p = t ) , t && ( t . n = e ) ) } if ( e in t ) throw i ( "$cacheFactory" ) ( "iid" , "CacheId '{0}' is already taken!" , e ) ; var s = 0 , r = u ( { } , n , { id : e } ) , l = { } , c = n && n . capacity || Number . MAX _VALUE , d = { } , p = null , m = null ; return t [ e ] = { put : function ( e , t ) { if ( ! y ( t ) ) { if ( c < Number . MAX _VALUE ) { var n = d [ e ] || ( d [ e ] = { key : e } ) ; a ( n ) } return e in l || s ++ , l [ e ] = t , s > c && this . remove ( m . key ) , t } } , get : function ( e ) { if ( c < Number . MAX _VALUE ) { var t = d [ e ] ; if ( ! t ) return ; a ( t ) } return l [ e ] } , remove : function ( e ) { if ( c < Number . MAX _VALUE ) { var t = d [ e ] ; if ( ! t ) return ; t == p && ( p = t . p ) , t == m && ( m = t . n ) , o ( t . n , t . p ) , delete d [ e ] } delete l [ e ] , s -- } , removeAll : function ( ) { l = { } , s = 0 , d = { } , p = m = null } , destroy : function ( ) { l = null , r = null , d = null , delete t [ e ] } , info : function ( ) { return u ( { } , r , { size : s } ) } } } var t = { } ; return e . info = function ( ) { var e = { } ; return o ( t , function ( t , n ) { e [ n ] = t . info ( ) } ) , e } , e . get = function ( e ) { return t [ e ] } , e } } function rt ( ) { this . $get = [ "$cacheFactory" , function ( e ) { return e ( "templates" ) } ] } function lt ( e , i ) { function a ( e , t , n ) { var i = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/ , a = { } ; return o ( e , function ( e , o ) { var s = e . match ( i ) ; if ( ! s ) throw Ia ( "iscp" , "Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}" , t , o , e , n ? " control
this . $$url = Tt ( this . $$path ) + ( t ? "?" + t : "" ) + i , this . $$absUrl = e + ( this . $$url ? n + this . $$url : "" ) } , this . $$parseLinkUrl = function ( t , n ) { return Ft ( e ) == Ft ( t ) ? ( this . $$parse ( t ) , ! 0 ) : ! 1 } } function jt ( e , t , n ) { this . $$html5 = ! 0 , Bt . apply ( this , arguments ) , this . $$parseLinkUrl = function ( i , a ) { if ( a && "#" === a [ 0 ] ) return this . hash ( a . slice ( 1 ) ) , ! 0 ; var o , s ; return e == Ft ( i ) ? o = i : ( s = Nt ( t , i ) ) ? o = e + n + s : t === i + "/" && ( o = t ) , o && this . $$parse ( o ) , ! ! o } , this . $$compose = function ( ) { var t = te ( this . $$search ) , i = this . $$hash ? "#" + ne ( this . $$hash ) : "" ; this . $$url = Tt ( this . $$path ) + ( t ? "?" + t : "" ) + i , this . $$absUrl = e + n + this . $$url } } function qt ( e ) { return function ( ) { return this [ e ] } } function Ht ( e , t ) { return function ( n ) { return y ( n ) ? this [ e ] : ( this [ e ] = t ( n ) , this . $$compose ( ) , this ) } } function Vt ( ) { var e = "" , t = { enabled : ! 1 , requireBase : ! 0 , rewriteLinks : ! 0 } ; this . hashPrefix = function ( t ) { return b ( t ) ? ( e = t , this ) : e } , this . html5Mode = function ( e ) { return D ( e ) ? ( t . enabled = e , this ) : w ( e ) ? ( D ( e . enabled ) && ( t . enabled = e . enabled ) , D ( e . requireBase ) && ( t . requireBase = e . requireBase ) , D ( e . rewriteLinks ) && ( t . rewriteLinks = e . rewriteLinks ) , this ) : t } , this . $get = [ "$rootScope" , "$browser" , "$sniffer" , "$rootElement" , "$window" , function ( n , i , a , o , s ) { function r ( e , t , n ) { var a = c . url ( ) , o = c . $$state ; try { i . url ( e , t , n ) , c . $$state = i . state ( ) } catch ( s ) { throw c . url ( a ) , c . $$state = o , s } } function l ( e , t ) { n . $broadcast ( "$locationChangeSuccess" , c . absUrl ( ) , e , c . $$state , t ) } var c , d , u , p = i . baseHref ( ) , m = i . url ( ) ; if ( t . enabled ) { if ( ! p && t . requireBase ) throw za ( "nobase" , "$location in HTML5 mode requires a <base> tag to be present!" ) ; u = Rt ( m ) + ( p || "/" ) , d = a . history ? Lt : jt } else u = Ft ( m ) , d = Bt ; var h = Ut ( u ) ; c = new d ( u , h , "#" + e ) , c . $$parseLinkUrl ( m , m ) , c . $$state = i . state ( ) ; var g = /^\s*(javascript|mailto):/i ; o . on ( "click" , function ( e ) { if ( t . rewriteLinks && ! e . ctrlKey && ! e . metaKey && ! e . shiftKey && 2 != e . which && 2 != e . button ) { for ( var a = xi ( e . target ) ; "a" !== R ( a [ 0 ] ) ; ) if ( a [ 0 ] === o [ 0 ] || ! ( a = a . parent ( ) ) [ 0 ] ) return ; var r = a . prop ( "href" ) , l = a . attr ( "href" ) || a . attr ( "xlink:href" ) ; w ( r ) && "[object SVGAnimatedString]" === r . toString ( ) && ( r = xn ( r . animVal ) . href ) , g . test ( r ) || ! r || a . attr ( "target" ) || e . isDefaultPrevented ( ) || c . $$parseLinkUrl ( r , l ) && ( e . preventDefault ( ) , c . absUrl ( ) != i . url ( ) && ( n . $apply ( ) , s . angular [ "ff-684208-preventDefault" ] = ! 0 ) ) } } ) , Ot ( c . absUrl ( ) ) != Ot ( m ) && i . url ( c . absUrl ( ) , ! 0 ) ; var f = ! 0 ; return i . onUrlChange ( function ( e , t ) { return y ( Nt ( h , e ) ) ? void ( s . location . href = e ) : ( n . $evalAsync ( function ( ) { var i , a = c . absUrl ( ) , o = c . $$state ; c . $$parse ( e ) , c . $$state = t , i = n . $broadcast ( "$locationChangeStart" , e , a , t , o ) . defaultPrevented , c . absUrl ( ) === e && ( i ? ( c . $$parse ( a ) , c . $$state = o , r ( a , ! 1 , o ) ) : ( f = ! 1 , l ( a , o ) ) ) } ) , void ( n . $$phase || n . $digest ( ) ) ) } ) , n . $watch ( function ( ) { var e = Ot ( i . url ( ) ) , t = Ot ( c . absUrl ( ) ) , o = i . state ( ) , s = c . $$replace , d = e !== t || c . $$html5 && a . history && o !== c . $$state ; ( f || d ) && ( f = ! 1 , n . $evalAsync ( function ( ) { var t = c . absUrl ( ) , i = n . $broadcast ( "$locationChangeStart" , t , e , c . $$state , o ) . defaultPrevented ; c . absUrl ( ) === t && ( i ? ( c . $$parse ( e ) , c . $$state = o ) : ( d && r ( t , s , o === c . $$state ? null : c . $$state ) , l ( e , o ) ) ) } ) ) , c . $$replace = ! 1 } ) , c } ] } function zt ( ) { var e = ! 0 , t = this ; this . debugEnabled = function ( t ) { return b ( t ) ? ( e = t , this ) : e } , this . $get = [ "$window" , function ( n ) { function i ( e ) { return e instanceof Error && ( e . stack ? e = e . message && - 1 === e . stack . indexOf ( e . message ) ? "Error: " + e . message + "\n" + e . stack : e . stack : e . sourceURL && ( e = e . message + "\n" + e . sourceURL + ":" + e . line ) ) , e } function a ( e ) { var t = n . console || { } , a = t [ e ] || t . log || g , s = ! 1 ; try { s = ! ! a . apply } catch ( r ) { } return s ? function ( ) { var e = [ ] ; return o ( arguments , function ( t ) { e . push ( i ( t ) ) } ) , a . apply ( t , e ) } : function ( e , t ) { a ( e , null == t ? "" : t ) } } return { log : a ( "log" ) , info : a ( "info" ) , warn : a ( "warn" ) , error : a ( "error" ) , debug : function ( ) { var n = a ( "debug" ) ; return function ( ) { e && n . apply ( t , arguments ) } } ( ) } } ] } function Wt ( e , t ) { if ( "__defineGetter__" === e || "__defineSetter__" === e || "__lookupGetter__" === e || "__lookupSetter__" === e || "__proto__" === e ) throw Ga ( "isecfld" , "Attempting to access a disallowed field in Angular expressions! Expression: {0}" , t ) ; return e } function Gt ( e , t ) { if ( e += "" , ! $ ( e ) ) throw Ga ( "iseccst" , "Cannot convert object to primitive value! Expression: {0}" , t ) ; return e } function Kt ( e , t ) { if ( e ) { if ( e . constructor === e ) throw Ga ( "isecfn" , "Referencing Function in Angular expressions is disallowed! Expression: {0}" , t ) ; if ( e . window === e ) throw Ga ( " isecwi
return n } if ( ! a ( e ) ) return e ; Ri ( n ) || ( n = [ n ] ) , 0 === n . length && ( n = [ "+" ] ) ; var c = t ( n , i ) ; c . push ( { get : function ( ) { return { } } , descending : i ? - 1 : 1 } ) ; var d = Array . prototype . map . call ( e , r ) ; return d . sort ( l ) , e = d . map ( function ( e ) { return e . value } ) } } function Qn ( e ) { return x ( e ) && ( e = { link : e } ) , e . restrict = e . restrict || "AC" , _ ( e ) } function ei ( e , t ) { e . $name = t } function ti ( e , t , i , a , s ) { var r = this , l = [ ] ; r . $error = { } , r . $$success = { } , r . $pending = n , r . $name = s ( t . name || t . ngForm || "" ) ( i ) , r . $dirty = ! 1 , r . $pristine = ! 0 , r . $valid = ! 0 , r . $invalid = ! 1 , r . $submitted = ! 1 , r . $$parentForm = fo , r . $rollbackViewValue = function ( ) { o ( l , function ( e ) { e . $rollbackViewValue ( ) } ) } , r . $commitViewValue = function ( ) { o ( l , function ( e ) { e . $commitViewValue ( ) } ) } , r . $addControl = function ( e ) { me ( e . $name , "input" ) , l . push ( e ) , e . $name && ( r [ e . $name ] = e ) , e . $$parentForm = r } , r . $$renameControl = function ( e , t ) { var n = e . $name ; r [ n ] === e && delete r [ n ] , r [ t ] = e , e . $name = t } , r . $removeControl = function ( e ) { e . $name && r [ e . $name ] === e && delete r [ e . $name ] , o ( r . $pending , function ( t , n ) { r . $setValidity ( n , null , e ) } ) , o ( r . $error , function ( t , n ) { r . $setValidity ( n , null , e ) } ) , o ( r . $$success , function ( t , n ) { r . $setValidity ( n , null , e ) } ) , L ( l , e ) , e . $$parentForm = fo } , fi ( { ctrl : this , $element : e , set : function ( e , t , n ) { var i = e [ t ] ; if ( i ) { var a = i . indexOf ( n ) ; - 1 === a && i . push ( n ) } else e [ t ] = [ n ] } , unset : function ( e , t , n ) { var i = e [ t ] ; i && ( L ( i , n ) , 0 === i . length && delete e [ t ] ) } , $animate : a } ) , r . $setDirty = function ( ) { a . removeClass ( e , Jo ) , a . addClass ( e , Qo ) , r . $dirty = ! 0 , r . $pristine = ! 1 , r . $$parentForm . $setDirty ( ) } , r . $setPristine = function ( ) { a . setClass ( e , Jo , Qo + " " + _o ) , r . $dirty = ! 1 , r . $pristine = ! 0 , r . $submitted = ! 1 , o ( l , function ( e ) { e . $setPristine ( ) } ) } , r . $setUntouched = function ( ) { o ( l , function ( e ) { e . $setUntouched ( ) } ) } , r . $setSubmitted = function ( ) { a . addClass ( e , _o ) , r . $submitted = ! 0 , r . $$parentForm . $setSubmitted ( ) } } function ni ( e ) { e . $formatters . push ( function ( t ) { return e . $isEmpty ( t ) ? t : t . toString ( ) } ) } function ii ( e , t , n , i , a , o ) { ai ( e , t , n , i , a , o ) , ni ( i ) } function ai ( e , t , n , i , a , o ) { var s = bi ( t [ 0 ] . type ) ; if ( ! a . android ) { var r = ! 1 ; t . on ( "compositionstart" , function ( e ) { r = ! 0 } ) , t . on ( "compositionend" , function ( ) { r = ! 1 , l ( ) } ) } var l = function ( e ) { if ( c && ( o . defer . cancel ( c ) , c = null ) , ! r ) { var a = t . val ( ) , l = e && e . type ; "password" === s || n . ngTrim && "false" === n . ngTrim || ( a = Bi ( a ) ) , ( i . $viewValue !== a || "" === a && i . $$hasNativeValidators ) && i . $setViewValue ( a , l ) } } ; if ( a . hasEvent ( "input" ) ) t . on ( "input" , l ) ; else { var c , d = function ( e , t , n ) { c || ( c = o . defer ( function ( ) { c = null , t && t . value === n || l ( e ) } ) ) } ; t . on ( "keydown" , function ( e ) { var t = e . keyCode ; 91 === t || t > 15 && 19 > t || t >= 37 && 40 >= t || d ( e , this , this . value ) } ) , a . hasEvent ( "paste" ) && t . on ( "paste cut" , d ) } t . on ( "change" , l ) , i . $render = function ( ) { var e = i . $isEmpty ( i . $viewValue ) ? "" : i . $viewValue ; t . val ( ) !== e && t . val ( e ) } } function oi ( e , t ) { if ( C ( e ) ) return e ; if ( $ ( e ) ) { Mo . lastIndex = 0 ; var n = Mo . exec ( e ) ; if ( n ) { var i = + n [ 1 ] , a = + n [ 2 ] , o = 0 , s = 0 , r = 0 , l = 0 , c = Hn ( i ) , d = 7 * ( a - 1 ) ; return t && ( o = t . getHours ( ) , s = t . getMinutes ( ) , r = t . getSeconds ( ) , l = t . getMilliseconds ( ) ) , new Date ( i , 0 , c . getDate ( ) + d , o , s , r , l ) } } return 0 / 0 } function si ( e , t ) { return function ( n , i ) { var a , s ; if ( C ( n ) ) return n ; if ( $ ( n ) ) { if ( '"' == n . charAt ( 0 ) && '"' == n . charAt ( n . length - 1 ) && ( n = n . substring ( 1 , n . length - 1 ) ) , wo . test ( n ) ) return new Date ( n ) ; if ( e . lastIndex = 0 , a = e . exec ( n ) ) return a . shift ( ) , s = 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 } , o ( a , function ( e , n ) { n < t . length && ( s [ t [ n ] ] = + e ) } ) , new Date ( s . yyyy , s . MM - 1 , s . dd , s . HH , s . mm , s . ss || 0 , 1e3 * s . sss || 0 ) } return 0 / 0 } } function ri ( e , t , i , a ) { return function ( o , s , r , l , c , d , u ) { function p ( e ) { return e && ! ( e . getTime && e . getTime ( ) !== e . getTime ( ) ) } function m ( e ) { return b ( e ) && ! C ( e ) ? i ( e ) || n : e } li ( o , s , r , l ) , ai ( o , s , r , l , c , d ) ; var h , g = l && l . $options && l . $options . timezone ; if ( l . $$parserName = e , l . $parsers . push ( function ( e ) { if ( l . $isEmpty ( e ) ) return null ; if ( t . test ( e ) ) { var a = i ( e , h ) ; return g && ( a = X ( a , g ) ) , a } return n } ) , l . $formatters . push ( function ( e ) { if ( e && ! C ( e ) ) throw is ( "datefmt" , "Expected `{0}` to be a date" , e ) ; return p ( e ) ? ( h = e , h && g && ( h = X ( h , g , ! 0 ) ) , u ( "date" ) ( e , a , g ) ) : ( h = null , "" ) } ) , b ( r . min ) || r . ngMin ) { var f ; l . $validators . min = function ( e ) { return ! p ( e ) || y ( f ) || i ( e ) >= f } , r . $observe ( "min" , function ( e ) { f = m ( e ) , l . $validate ( ) } ) } if ( b ( r . max ) || r . ngMax ) { var _ ; l . $validators . max = fu
case eo . Literal : u = this . escape ( e . value ) , this . assign ( t , u ) , a ( u ) ; break ; case eo . UnaryExpression : this . recurse ( e . argument , n , n , function ( e ) { c = e } ) , u = e . operator + "(" + this . ifDefined ( c , 0 ) + ")" , this . assign ( t , u ) , a ( u ) ; break ; case eo . BinaryExpression : this . recurse ( e . left , n , n , function ( e ) { l = e } ) , this . recurse ( e . right , n , n , function ( e ) { c = e } ) , u = "+" === e . operator ? this . plus ( l , c ) : "-" === e . operator ? this . ifDefined ( l , 0 ) + e . operator + this . ifDefined ( c , 0 ) : "(" + l + ")" + e . operator + "(" + c + ")" , this . assign ( t , u ) , a ( u ) ; break ; case eo . LogicalExpression : t = t || this . nextId ( ) , p . recurse ( e . left , t ) , p . if _ ( "&&" === e . operator ? t : p . not ( t ) , p . lazyRecurse ( e . right , t ) ) , a ( t ) ; break ; case eo . ConditionalExpression : t = t || this . nextId ( ) , p . recurse ( e . test , t ) , p . if _ ( t , p . lazyRecurse ( e . alternate , t ) , p . lazyRecurse ( e . consequent , t ) ) , a ( t ) ; break ; case eo . Identifier : t = t || this . nextId ( ) , i && ( i . context = "inputs" === p . stage ? "s" : this . assign ( this . nextId ( ) , this . getHasOwnProperty ( "l" , e . name ) + "?l:s" ) , i . computed = ! 1 , i . name = e . name ) , Wt ( e . name ) , p . if _ ( "inputs" === p . stage || p . not ( p . getHasOwnProperty ( "l" , e . name ) ) , function ( ) { p . if _ ( "inputs" === p . stage || "s" , function ( ) { s && 1 !== s && p . if _ ( p . not ( p . nonComputedMember ( "s" , e . name ) ) , p . lazyAssign ( p . nonComputedMember ( "s" , e . name ) , "{}" ) ) , p . assign ( t , p . nonComputedMember ( "s" , e . name ) ) } ) } , t && p . lazyAssign ( t , p . nonComputedMember ( "l" , e . name ) ) ) , ( p . state . expensiveChecks || cn ( e . name ) ) && p . addEnsureSafeObject ( t ) , a ( t ) ; break ; case eo . MemberExpression : l = i && ( i . context = this . nextId ( ) ) || this . nextId ( ) , t = t || this . nextId ( ) , p . recurse ( e . object , l , n , function ( ) { p . if _ ( p . notNull ( l ) , function ( ) { e . computed ? ( c = p . nextId ( ) , p . recurse ( e . property , c ) , p . getStringValue ( c ) , p . addEnsureSafeMemberName ( c ) , s && 1 !== s && p . if _ ( p . not ( p . computedMember ( l , c ) ) , p . lazyAssign ( p . computedMember ( l , c ) , "{}" ) ) , u = p . ensureSafeObject ( p . computedMember ( l , c ) ) , p . assign ( t , u ) , i && ( i . computed = ! 0 , i . name = c ) ) : ( Wt ( e . property . name ) , s && 1 !== s && p . if _ ( p . not ( p . nonComputedMember ( l , e . property . name ) ) , p . lazyAssign ( p . nonComputedMember ( l , e . property . name ) , "{}" ) ) , u = p . nonComputedMember ( l , e . property . name ) , ( p . state . expensiveChecks || cn ( e . property . name ) ) && ( u = p . ensureSafeObject ( u ) ) , p . assign ( t , u ) , i && ( i . computed = ! 1 , i . name = e . property . name ) ) } , function ( ) { p . assign ( t , "undefined" ) } ) , a ( t ) } , ! ! s ) ; break ; case eo . CallExpression : t = t || this . nextId ( ) , e . filter ? ( c = p . filter ( e . callee . name ) , d = [ ] , o ( e . arguments , function ( e ) { var t = p . nextId ( ) ; p . recurse ( e , t ) , d . push ( t ) } ) , u = c + "(" + d . join ( "," ) + ")" , p . assign ( t , u ) , a ( t ) ) : ( c = p . nextId ( ) , l = { } , d = [ ] , p . recurse ( e . callee , c , l , function ( ) { p . if _ ( p . notNull ( c ) , function ( ) { p . addEnsureSafeFunction ( c ) , o ( e . arguments , function ( e ) { p . recurse ( e , p . nextId ( ) , n , function ( e ) { d . push ( p . ensureSafeObject ( e ) ) } ) } ) , l . name ? ( p . state . expensiveChecks || p . addEnsureSafeObject ( l . context ) , u = p . member ( l . context , l . name , l . computed ) + "(" + d . join ( "," ) + ")" ) : u = c + "(" + d . join ( "," ) + ")" , u = p . ensureSafeObject ( u ) , p . assign ( t , u ) } , function ( ) { p . assign ( t , "undefined" ) } ) , a ( t ) } ) ) ; break ; case eo . AssignmentExpression : if ( c = this . nextId ( ) , l = { } , ! nn ( e . left ) ) throw Ga ( "lval" , "Trying to assing a value to a non l-value" ) ; this . recurse ( e . left , n , l , function ( ) { p . if _ ( p . notNull ( l . context ) , function ( ) { p . recurse ( e . right , c ) , p . addEnsureSafeObject ( p . member ( l . context , l . name , l . computed ) ) , p . addEnsureSafeAssignContext ( l . context ) , u = p . member ( l . context , l . name , l . computed ) + e . operator + c , p . assign ( t , u ) , a ( t || u ) } ) } , 1 ) ; break ; case eo . ArrayExpression : d = [ ] , o ( e . elements , function ( e ) { p . recurse ( e , p . nextId ( ) , n , function ( e ) { d . push ( e ) } ) } ) , u = "[" + d . join ( "," ) + "]" , this . assign ( t , u ) , a ( u ) ; break ; case eo . ObjectExpression : d = [ ] , o ( e . properties , function ( e ) { p . recurse ( e . value , p . nextId ( ) , n , function ( t ) { d . push ( p . escape ( e . key . type === eo . Identifier ? e . key . name : "" + e . key . value ) + ":" + t ) } ) } ) , u = "{" + d . join ( "," ) + "}" , this . assign ( t , u ) , a ( u ) ; break ; case eo . ThisExpression : this . assign ( t , "s" ) , a ( "s" ) ; break ; case eo . NGValueParameter : this . assign ( t , "v" ) , a ( "v" ) } } , getHasOwnProperty : function ( e , t ) { var n = e + "." + t , i = this . current ( ) . own ; return i . hasOwnProperty ( n ) || ( i [ n ] = this . nextId ( ! 1 , e + "&&(" + this . escape ( t ) + " in " + e + ")" ) ) , i [ n ] } , assign : function ( e , t ) { return e ? ( this . current ( ) . body . push ( e , "=" , t , ";" ) , e ) : void 0 } , filter : function ( e ) { return this . state . filters . hasOwnProperty ( e ) || ( this . state . filters [ e ] = this . nextId ( ! 0 ) ) , this . state . filters [ e ] } , ifDefined : function ( e , t ) { return " ifDefi
P = new Array ( k ) , p = 0 ; k > p ; p ++ ) if ( x = i === I ? p : I [ p ] , M = i [ x ] , A = E ( x , M , p ) , f [ A ] ) T = f [ A ] , delete f [ A ] , F [ A ] = T , P [ p ] = T ; else { if ( F [ A ] ) throw o ( P , function ( e ) { e && e . scope && ( f [ e . id ] = e ) } ) , l ( "dupes" , "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}" , m , A , M ) ; P [ p ] = { id : A , scope : n , clone : n } , F [ A ] = ! 0 } for ( var U in f ) { if ( T = f [ U ] , D = ge ( T . clone ) , s . leave ( D ) , D [ 0 ] . parentNode ) for ( p = 0 , _ = D . length ; _ > p ; p ++ ) D [ p ] [ r ] = ! 0 ; T . scope . $destroy ( ) } for ( p = 0 ; k > p ; p ++ ) if ( x = i === I ? p : I [ p ] , M = i [ x ] , T = P [ p ] , T . scope ) { y = N ; do y = y . nextSibling ; while ( y && y [ r ] ) ; d ( T ) != y && s . move ( ge ( T . clone ) , null , xi ( N ) ) , N = u ( T ) , c ( T . scope , p , b , M , w , x , k ) } else g ( function ( e , t ) { T . scope = t ; var n = h . cloneNode ( ! 1 ) ; e [ e . length ++ ] = n , s . enter ( e , null , xi ( N ) ) , N = n , T . clone = e , F [ T . id ] = T , c ( T . scope , p , b , M , w , x , k ) } ) ; f = F } ) } } } } ] , hs = "ng-hide" , gs = "ng-hide-animate" , fs = [ "$animate" , function ( e ) { return { restrict : "A" , multiElement : ! 0 , link : function ( t , n , i ) { t . $watch ( i . ngShow , function ( t ) { e [ t ? "removeClass" : "addClass" ] ( n , hs , { tempClasses : gs } ) } ) } } } ] , _s = [ "$animate" , function ( e ) { return { restrict : "A" , multiElement : ! 0 , link : function ( t , n , i ) { t . $watch ( i . ngHide , function ( t ) { e [ t ? "addClass" : "removeClass" ] ( n , hs , { tempClasses : gs } ) } ) } } } ] , vs = Qn ( function ( e , t , n ) { e . $watch ( n . ngStyle , function ( e , n ) { n && e !== n && o ( n , function ( e , n ) { t . css ( n , "" ) } ) , e && t . css ( e ) } , ! 0 ) } ) , ys = [ "$animate" , function ( e ) { return { require : "ngSwitch" , controller : [ "$scope" , function ( ) { this . cases = { } } ] , link : function ( n , i , a , s ) { var r = a . ngSwitch || a . on , l = [ ] , c = [ ] , d = [ ] , u = [ ] , p = function ( e , t ) { return function ( ) { e . splice ( t , 1 ) } } ; n . $watch ( r , function ( n ) { var i , a ; for ( i = 0 , a = d . length ; a > i ; ++ i ) e . cancel ( d [ i ] ) ; for ( d . length = 0 , i = 0 , a = u . length ; a > i ; ++ i ) { var r = ge ( c [ i ] . clone ) ; u [ i ] . $destroy ( ) ; var m = d [ i ] = e . leave ( r ) ; m . then ( p ( d , i ) ) } c . length = 0 , u . length = 0 , ( l = s . cases [ "!" + n ] || s . cases [ "?" ] ) && o ( l , function ( n ) { n . transclude ( function ( i , a ) { u . push ( a ) ; var o = n . element ; i [ i . length ++ ] = t . createComment ( " end ngSwitchWhen: " ) ; var s = { clone : i } ; c . push ( s ) , e . enter ( i , o . parent ( ) , o ) } ) } ) } ) } } } ] , bs = Qn ( { transclude : "element" , priority : 1200 , require : "^ngSwitch" , multiElement : ! 0 , link : function ( e , t , n , i , a ) { i . cases [ "!" + n . ngSwitchWhen ] = i . cases [ "!" + n . ngSwitchWhen ] || [ ] , i . cases [ "!" + n . ngSwitchWhen ] . push ( { transclude : a , element : t } ) } } ) , ws = Qn ( { transclude : "element" , priority : 1200 , require : "^ngSwitch" , multiElement : ! 0 , link : function ( e , t , n , i , a ) { i . cases [ "?" ] = i . cases [ "?" ] || [ ] , i . cases [ "?" ] . push ( { transclude : a , element : t } ) } } ) , ks = Qn ( { restrict : "EAC" , link : function ( e , t , n , a , o ) { if ( ! o ) throw i ( "ngTransclude" ) ( "orphan" , "Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}" , J ( t ) ) ; o ( function ( e ) { t . empty ( ) , t . append ( e ) } ) } } ) , $s = [ "$templateCache" , function ( e ) { return { restrict : "E" , terminal : ! 0 , compile : function ( t , n ) { if ( "text/ng-template" == n . type ) { var i = n . id , a = t [ 0 ] . text ; e . put ( i , a ) } } } } ] , Ss = { $setViewValue : g , $render : g } , Cs = [ "$element" , "$scope" , "$attrs" , function ( e , i , a ) { var o = this , s = new Ye ; o . ngModelCtrl = Ss , o . unknownOption = xi ( t . createElement ( "option" ) ) , o . renderUnknownOption = function ( t ) { var n = "? " + Ke ( t ) + " ?" ; o . unknownOption . val ( n ) , e . prepend ( o . unknownOption ) , e . val ( n ) } , i . $on ( "$destroy" , function ( ) { o . renderUnknownOption = g } ) , o . removeUnknownOption = function ( ) { o . unknownOption . parent ( ) && o . unknownOption . remove ( ) } , o . readValue = function ( ) { return o . removeUnknownOption ( ) , e . val ( ) } , o . writeValue = function ( t ) { o . hasOption ( t ) ? ( o . removeUnknownOption ( ) , e . val ( t ) , "" === t && o . emptyOption . prop ( "selected" , ! 0 ) ) : null == t && o . emptyOption ? ( o . removeUnknownOption ( ) , e . val ( "" ) ) : o . renderUnknownOption ( t ) } , o . addOption = function ( e , t ) { me ( e , '"option value"' ) , "" === e && ( o . emptyOption = t ) ; var n = s . get ( e ) || 0 ; s . put ( e , n + 1 ) } , o . removeOption = function ( e ) { var t = s . get ( e ) ; t && ( 1 === t ? ( s . remove ( e ) , "" === e && ( o . emptyOption = n ) ) : s . put ( e , t - 1 ) ) } , o . hasOption = function ( e ) { return ! ! s . get ( e ) } } ] , xs = function ( ) { return { restrict : "E" , require : [ "select" , "?ngModel" ] , controller : Cs , link : function ( e , t , n , i ) { var a = i [ 1 ] ; if ( a ) { var s = i [ 0 ] ; if ( s . ngModelCtrl = a , a . $render = function ( ) { s . writeValue ( a . $viewValue ) } , t . on ( "change" , function ( ) { e . $apply ( function ( ) { a . $setViewValue ( s . readValue ( ) ) } ) } ) , n . multiple ) { s . readValue = function ( ) { var e = [ ] ; return o ( t . find ( "option" ) , function ( t ) { t . selected && e . push ( t . value ) } ) , e }
var i = y ( e ) ; i . setAttribute ( xe , t ) ; var a = N . get ( i ) , o = a ? L ( a , n ) : n ; N . put ( i , o ) } var N = new g , F = new g , O = null , U = r . $watch ( function ( ) { return 0 === k . totalPendingRequests } , function ( e ) { e && ( U ( ) , r . $$postDigest ( function ( ) { r . $$postDigest ( function ( ) { null === O && ( O = ! 0 ) } ) } ) ) } ) , R = { } , G = e . classNameFilter ( ) , Z = G ? function ( e ) { return G . test ( e ) } : function ( ) { return ! 0 } , X = p ( $ ) ; return { on : function ( e , t , n ) { var i = c ( t ) ; R [ e ] = R [ e ] || [ ] , R [ e ] . push ( { node : i , callback : n } ) } , off : function ( e , t , n ) { function i ( e , t , n ) { var i = c ( t ) ; return e . filter ( function ( e ) { var t = e . node === i && ( ! n || e . callback === n ) ; return ! t } ) } var a = R [ e ] ; a && ( R [ e ] = 1 === arguments . length ? null : i ( a , t , n ) ) } , pin : function ( e , t ) { i ( K ( e ) , "element" , "not an element" ) , i ( K ( t ) , "parentElement" , "not an element" ) , e . data ( Me , t ) } , push : function ( e , t , n , i ) { return n = n || { } , n . domOperation = i , A ( e , t , n ) } , enabled : function ( e , t ) { var n = arguments . length ; if ( 0 === n ) t = ! ! O ; else { var i = K ( e ) ; if ( i ) { var a = y ( e ) , o = F . get ( a ) ; 1 === n ? t = ! o : ( t = ! ! t , t ? o && F . remove ( a ) : F . put ( a , ! 0 ) ) } else t = O = ! ! e } return t } } } ] } ] , Ee = [ "$$rAF" , function ( e ) { function t ( t ) { n . push ( t ) , n . length > 1 || e ( function ( ) { for ( var e = 0 ; e < n . length ; e ++ ) n [ e ] ( ) ; n = [ ] } ) } var n = [ ] ; return function ( ) { var e = ! 1 ; return t ( function ( ) { e = ! 0 } ) , function ( n ) { e ? n ( ) : t ( n ) } } } ] , Ie = [ "$q" , "$sniffer" , "$$animateAsyncRun" , function ( e , t , n ) { function i ( e ) { this . setHost ( e ) , this . _doneCallbacks = [ ] , this . _runInAnimationFrame = n ( ) , this . _state = 0 } var a = 0 , o = 1 , s = 2 ; return i . chain = function ( e , t ) { function n ( ) { return i === e . length ? void t ( ! 0 ) : void e [ i ] ( function ( e ) { return e === ! 1 ? void t ( ! 1 ) : ( i ++ , void n ( ) ) } ) } var i = 0 ; n ( ) } , i . all = function ( e , t ) { function n ( n ) { a = a && n , ++ i === e . length && t ( a ) } var i = 0 , a = ! 0 ; j ( e , function ( e ) { e . done ( n ) } ) } , i . prototype = { setHost : function ( e ) { this . host = e || { } } , done : function ( e ) { this . _state === s ? e ( ) : this . _doneCallbacks . push ( e ) } , progress : R , getPromise : function ( ) { if ( ! this . promise ) { var t = this ; this . promise = e ( function ( e , n ) { t . done ( function ( t ) { t === ! 1 ? n ( ) : e ( ) } ) } ) } return this . promise } , then : function ( e , t ) { return this . getPromise ( ) . then ( e , t ) } , "catch" : function ( e ) { return this . getPromise ( ) [ "catch" ] ( e ) } , "finally" : function ( e ) { return this . getPromise ( ) [ "finally" ] ( e ) } , 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 ( e ) { var t = this ; t . _state === a && ( t . _state = o , t . _runInAnimationFrame ( function ( ) { t . _resolve ( e ) } ) ) } , _resolve : function ( e ) { this . _state !== s && ( j ( this . _doneCallbacks , function ( t ) { t ( e ) } ) , this . _doneCallbacks . length = 0 , this . _state = s ) } } , i } ] , Te = [ "$animateProvider" , function ( e ) { function t ( e , t ) { e . data ( r , t ) } function n ( e ) { e . removeData ( r ) } function i ( e ) { return e . data ( r ) } var o = "ng-animate-ref" , s = this . drivers = [ ] , r = "$$animationRunner" ; this . $get = [ "$$jqLite" , "$rootScope" , "$injector" , "$$AnimateRunner" , "$$HashMap" , "$$rAFScheduler" , function ( e , r , l , c , d , u ) { function g ( e ) { function t ( e ) { if ( e . processed ) return e ; e . processed = ! 0 ; var n = e . domNode , i = n . parentNode ; o . put ( n , e ) ; for ( var s ; i ; ) { if ( s = o . get ( i ) ) { s . processed || ( s = t ( s ) ) ; break } i = i . parentNode } return ( s || a ) . children . push ( e ) , e } function n ( e ) { var t , n = [ ] , i = [ ] ; for ( t = 0 ; t < e . children . length ; t ++ ) i . push ( e . children [ t ] ) ; var a = i . length , o = 0 , s = [ ] ; for ( t = 0 ; t < i . length ; t ++ ) { var r = i [ t ] ; 0 >= a && ( a = o , o = 0 , n . push ( s ) , s = [ ] ) , s . push ( r . fn ) , r . children . forEach ( function ( e ) { o ++ , i . push ( e ) } ) , a -- } return s . length && n . push ( s ) , n } var i , a = { children : [ ] } , o = new d ; for ( i = 0 ; i < e . length ; i ++ ) { var s = e [ i ] ; o . put ( s . domNode , e [ i ] = { domNode : s . domNode , fn : s . fn , children : [ ] } ) } for ( i = 0 ; i < e . length ; i ++ ) t ( e [ i ] ) ; return n ( a ) } var f = [ ] , _ = p ( e ) ; return function ( d , p , v ) { function b ( e ) { var t = "[" + o + "]" , n = e . hasAttribute ( o ) ? [ e ] : e . querySelectorAll ( t ) , i = [ ] ; return j ( n , function ( e ) { var t = e . getAttribute ( o ) ; t && t . length && i . push ( e ) } ) , i } function w ( e ) { var t = [ ] , n = { } ; j ( e , function ( e , i ) { var a = e . element , s = y ( a ) , r = e . event , l = [ "enter" , "move" ] . indexOf ( r ) >= 0 , c = e . structural ? b ( s ) : [ ] ; if ( c . length ) { var d = l ? "to" : "from" ; j ( c , function ( e ) { var t = e . getAttribute ( o ) ; n [ t ] = n [ t ] || { } , n [ t ] [ d ] = { animationID : i , element : B ( e ) } } ) } else t . push ( e ) } ) ; var i = { } , a = { } ; return j ( n , function ( n , o ) { var s = n . from , r = n . to ; if ( ! s || ! r ) { var l = s ? s . animationID : r . animationID , c = l . toString ( ) ; return void ( i [ c ] || ( i [ c ] = ! 0 , t . push
this . reset ( ) } , toggleMute : function ( ) { this . muted = this . $domEl . muted = ! this . $domEl . muted } , next : function ( e ) { var t = this ; if ( t . currentTrack && t . currentTrack < t . tracks ) { var i = e || t . playing ; t . pause ( ) , n ( function ( ) { t . $clearSourceList ( ) , t . $addSourceList ( t . $playlist [ t . currentTrack ] ) , t . load ( i ) , t . currentTrack ++ } ) } } , prev : function ( e ) { var t = this ; if ( t . currentTrack && t . currentTrack - 1 ) { var i = e || t . playing ; t . pause ( ) , n ( function ( ) { t . $clearSourceList ( ) , t . $addSourceList ( t . $playlist [ t . currentTrack - 2 ] ) , t . load ( i ) , t . currentTrack -- } ) } } , setPlaybackRate : function ( e ) { this . $domEl . playbackRate = e } , setVolume : function ( e ) { this . $domEl . volume = e } , seek : function ( e ) { var t , n = 0 ; return "string" != typeof e ? this . $domEl . currentTime = e : ( t = e . split ( ":" ) , n += parseInt ( t . pop ( ) , 10 ) , t . length && ( n += 60 * parseInt ( t . pop ( ) , 10 ) ) , t . length && ( n += 3600 * parseInt ( t . pop ( ) , 10 ) ) , isNaN ( n ) ? void 0 : this . $domEl . currentTime = n ) } , on : function ( e , t ) { return this . $element . on ( e , t ) } , off : function ( e , t ) { return this . $element . off ( e , t ) } , one : function ( e , t ) { return this . $element . one ( e , t ) } , $addSourceList : function ( e ) { var t = this ; if ( angular . isArray ( e ) ) angular . forEach ( e , function ( e , n ) { var i = document . createElement ( "SOURCE" ) ; [ "src" , "type" , "media" ] . forEach ( function ( t ) { void 0 !== e [ t ] && i . setAttribute ( t , e [ t ] ) } ) , t . $element . append ( i ) } ) ; else if ( angular . isObject ( e ) ) { var n = document . createElement ( "SOURCE" ) ; [ "src" , "type" , "media" ] . forEach ( function ( t ) { void 0 !== e [ t ] && n . setAttribute ( t , e [ t ] ) } ) , t . $element . append ( n ) } } , $clearSourceList : function ( ) { this . $element . contents ( ) . remove ( ) } , $formatTime : function ( e ) { if ( e === 1 / 0 ) return "∞" ; var t , n = parseInt ( e / 3600 , 10 ) % 24 , i = parseInt ( e / 60 , 10 ) % 60 , a = parseInt ( e % 60 , 10 ) , o = ( 10 > i ? "0" + i : i ) + ":" + ( 10 > a ? "0" + a : a ) ; return t = n > 0 ? ( 10 > n ? "0" + n : n ) + ":" + o : o } , $attachPlaylist : function ( e ) { void 0 === e || null === e ? this . playlist = [ ] : this . $playlist = e } } , r = function ( e , t , n ) { var a = { playing : function ( ) { e . $apply ( function ( e ) { e . playing = ! 0 , e . ended = ! 1 } ) } , pause : function ( ) { e . $apply ( function ( e ) { e . playing = ! 1 } ) } , ended : function ( ) { ! e . $selective && e . currentTrack < e . tracks ? e . next ( ! 0 ) : e . $apply ( function ( e ) { e . ended = ! 0 , e . playing = ! 1 } ) } , timeupdate : i ( 1e3 , ! 1 , function ( ) { e . $apply ( function ( e ) { e . currentTime = t . currentTime , e . formatTime = e . $formatTime ( e . currentTime ) } ) } ) , loadedmetadata : function ( ) { e . $apply ( function ( e ) { e . currentTrack || e . currentTrack ++ , e . duration = t . duration , e . formatDuration = e . $formatTime ( e . duration ) , t . buffered . length && ( e . loadPercent = Math . round ( t . buffered . end ( t . buffered . length - 1 ) / e . duration * 100 ) ) } ) } , progress : function ( ) { e . $domEl . buffered . length && e . $apply ( function ( e ) { e . loadPercent = Math . round ( t . buffered . end ( t . buffered . length - 1 ) / e . duration * 100 ) , e . network = "progress" } ) } , volumechange : function ( ) { e . $apply ( function ( e ) { e . volume = t . volume , e . muted = t . muted } ) } , seeked : function ( ) { e . $apply ( function ( e ) { e . seeking = ! 1 } ) } , seeking : function ( ) { e . $apply ( function ( e ) { e . seeking = ! 0 } ) } , ratechange : function ( ) { e . $apply ( function ( e ) { e . playbackRate = t . playbackRate } ) } , stalled : function ( ) { e . $apply ( function ( e ) { e . network = "stalled" } ) } , suspend : function ( ) { e . $apply ( function ( e ) { e . network = "suspend" } ) } } ; angular . forEach ( a , function ( e , t ) { n . on ( t , e ) } ) } , l = function ( t ) { var n = angular . extend ( e . $new ( ! 0 ) , { $element : t , $domEl : t [ 0 ] , $playlist : void 0 , buffered : t [ 0 ] . buffered , played : t [ 0 ] . played , seekable : t [ 0 ] . seekable } , a , s ) ; return r ( n , t [ 0 ] , t ) , n } ; return { scope : ! 1 , link : function ( e , t , n , i ) { var a = n . playlist , s = n . mediaPlayer || n . playerControl , r = new l ( t ) , c = e [ a ] ; if ( c = void 0 === a ? [ ] : void 0 === e [ a ] ? e [ a ] = [ ] : e [ a ] , void 0 !== s && e . $eval ( s + " = player" , { player : r } ) , "AUDIO" !== t [ 0 ] . tagName && "VIDEO" !== t [ 0 ] . tagName ) return new Error ( "player directive works only when attached to an <audio>/<video> type tag" ) ; var d = [ ] , u = t . find ( "source" ) ; 1 === u . length ? c . unshift ( { src : u [ 0 ] . src , type : u [ 0 ] . type , media : u [ 0 ] . media } ) : u . length > 1 && ( angular . forEach ( u , function ( e ) { d . push ( { src : e . src , type : e . type , media : e . media } ) } ) , c . unshift ( d ) ) , void 0 === a ? r . $attachPlaylist ( c ) : c . length ? ( o ( r ) ( c , void 0 , e ) , e . $watch ( a , o ( r ) , ! 0 ) ) : e . $watch ( a , o ( r ) , ! 0 ) } } } ] ) , angular . module ( "mediaPlayer.helpers" , [ ] ) . factory ( "mp.throttle" , [ "$timeout" , function ( e ) { return function ( t , n , i , a ) { var o , s = 0 ; "boolean" != typeof n && ( a = i , i = n , n = void 0 ) ; var r = function ( ) { var r = this , l = + new Date - s , c = arguments , d = function ( ) { s = + new Date , i . apply ( r , c ) } , u = function ( ) { o = void 0 } ; a &&
switch ( ! 0 ) { case 3 === t : return [ 257 , t - 3 , 0 ] ; case 4 === t : return [ 258 , t - 4 , 0 ] ; case 5 === t : return [ 259 , t - 5 , 0 ] ; case 6 === t : return [ 260 , t - 6 , 0 ] ; case 7 === t : return [ 261 , t - 7 , 0 ] ; case 8 === t : return [ 262 , t - 8 , 0 ] ; case 9 === t : return [ 263 , t - 9 , 0 ] ; case 10 === t : return [ 264 , t - 10 , 0 ] ; case 12 >= t : return [ 265 , t - 11 , 1 ] ; case 14 >= t : return [ 266 , t - 13 , 1 ] ; case 16 >= t : return [ 267 , t - 15 , 1 ] ; case 18 >= t : return [ 268 , t - 17 , 1 ] ; case 22 >= t : return [ 269 , t - 19 , 2 ] ; case 26 >= t : return [ 270 , t - 23 , 2 ] ; case 30 >= t : return [ 271 , t - 27 , 2 ] ; case 34 >= t : return [ 272 , t - 31 , 2 ] ; case 42 >= t : return [ 273 , t - 35 , 3 ] ; case 50 >= t : return [ 274 , t - 43 , 3 ] ; case 58 >= t : return [ 275 , t - 51 , 3 ] ; case 66 >= t : return [ 276 , t - 59 , 3 ] ; case 82 >= t : return [ 277 , t - 67 , 4 ] ; case 98 >= t : return [ 278 , t - 83 , 4 ] ; case 114 >= t : return [ 279 , t - 99 , 4 ] ; case 130 >= t : return [ 280 , t - 115 , 4 ] ; case 162 >= t : return [ 281 , t - 131 , 5 ] ; case 194 >= t : return [ 282 , t - 163 , 5 ] ; case 226 >= t : return [ 283 , t - 195 , 5 ] ; case 257 >= t : return [ 284 , t - 227 , 5 ] ; case 258 === t : return [ 285 , t - 258 , 0 ] ; default : e ( "invalid length: " + t ) } } var n , i , a = [ ] ; for ( n = 3 ; 258 >= n ; n ++ ) i = t ( n ) , a [ n ] = i [ 2 ] << 24 | i [ 1 ] << 16 | i [ 0 ] ; return a } ( ) ; p && new Uint32Array ( b ) ; var w = 0 , k = 1 ; o . prototype . g = function ( ) { for ( ; ! this . o ; ) { var t = s ( this , 3 ) ; switch ( 1 & t && ( this . o = ! 0 ) , t >>>= 1 ) { case 0 : var n = this . input , i = this . c , a = this . b , o = this . a , r = d , c = d , u = d , m = a . length , h = d ; switch ( this . d = this . f = 0 , r = n [ i ++ ] , r === d && e ( Error ( "invalid uncompressed block header: LEN (first byte)" ) ) , c = r , r = n [ i ++ ] , r === d && e ( Error ( "invalid uncompressed block header: LEN (second byte)" ) ) , c |= r << 8 , r = n [ i ++ ] , r === d && e ( Error ( "invalid uncompressed block header: NLEN (first byte)" ) ) , u = r , r = n [ i ++ ] , r === d && e ( Error ( "invalid uncompressed block header: NLEN (second byte)" ) ) , u |= r << 8 , c === ~ u && e ( Error ( "invalid uncompressed block header: length verify" ) ) , i + c > n . length && e ( Error ( "input buffer is broken" ) ) , this . k ) { case w : for ( ; o + c > a . length ; ) { if ( h = m - o , c -= h , p ) a . set ( n . subarray ( i , i + h ) , o ) , o += h , i += h ; else for ( ; h -- ; ) a [ o ++ ] = n [ i ++ ] ; this . a = o , a = this . e ( ) , o = this . a } break ; case k : for ( ; o + c > a . length ; ) a = this . e ( { t : 2 } ) ; break ; default : e ( Error ( "invalid inflate mode" ) ) } if ( p ) a . set ( n . subarray ( i , i + c ) , o ) , o += c , i += c ; else for ( ; c -- ; ) a [ o ++ ] = n [ i ++ ] ; this . c = i , this . a = o , this . b = a ; break ; case 1 : this . l ( R , B ) ; break ; case 2 : l ( this ) ; break ; default : e ( Error ( "unknown BTYPE: " + t ) ) } } return this . q ( ) } ; var $ , S , C = [ 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 ] , x = p ? new Uint16Array ( C ) : C , M = [ 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 , 258 , 258 ] , A = p ? new Uint16Array ( M ) : M , E = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 0 , 0 , 0 ] , I = p ? new Uint8Array ( E ) : E , T = [ 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 ] , P = p ? new Uint16Array ( T ) : T , D = [ 0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 , 8 , 8 , 9 , 9 , 10 , 10 , 11 , 11 , 12 , 12 , 13 , 13 ] , N = p ? new Uint8Array ( D ) : D , F = new ( p ? Uint8Array : Array ) ( 288 ) ; for ( $ = 0 , S = F . length ; S > $ ; ++ $ ) F [ $ ] = 143 >= $ ? 8 : 255 >= $ ? 9 : 279 >= $ ? 7 : 8 ; var O , U , R = a ( F ) , L = new ( p ? Uint8Array : Array ) ( 30 ) ; for ( O = 0 , U = L . length ; U > O ; ++ O ) L [ O ] = 5 ; var B = a ( L ) ; o . prototype . l = function ( e , t ) { var n = this . b , i = this . a ; this . r = e ; for ( var a , o , l , c , d = n . length - 258 ; 256 !== ( a = r ( this , e ) ) ; ) if ( 256 > a ) i >= d && ( this . a = i , n = this . e ( ) , i = this . a ) , n [ i ++ ] = a ; else for ( o = a - 257 , c = A [ o ] , 0 < I [ o ] && ( c += s ( this , I [ o ] ) ) , a = r ( this , t ) , l = P [ a ] , 0 < N [ a ] && ( l += s ( this , N [ a ] ) ) , i >= d && ( this . a = i , n = this . e ( ) , i = this . a ) ; c -- ; ) n [ i ] = n [ i ++ - l ] ; for ( ; 8 <= this . d ; ) this . d -= 8 , this . c -- ; this . a = i } , o . prototype . C = function ( e , t ) { var n = this . b , i = this . a ; this . r = e ; for ( var a , o , l , c , d = n . length ; 256 !== ( a = r ( this , e ) ) ; ) if ( 256 > a ) i >= d && ( n = this . e ( ) , d = n . length ) , n [ i ++ ] = a ; else for ( o = a - 257 , c = A [ o ] , 0 < I [ o ] && ( c += s ( this , I [ o ] ) ) , a = r ( this , t ) , l = P [ a ] , 0 < N [ a ] && ( l += s ( this , N [ a ] ) ) , i + c > d && ( n = this . e ( ) , d = n . length ) ; c -- ; ) n [ i ] = n [ i ++ - l ] ; for ( ; 8 <= this . d ; ) this . d -= 8 , this . c -- ; this . a = i } , o . prototype . e = function ( ) { var e , t , n = new ( p ? Uint8Array : Array ) ( this . a - 32768 ) , i = this . a - 32768 , a = this . b ; if ( p ) n . set ( a . subarray ( 32768 , n . length ) ) ; else for ( e = 0 , t = n . length ; t > e ; ++ e ) n [ e ] = a [ e + 32768 ] ; if ( this . i . push ( n ) , this . n += n . length , p ) a . set ( a . subarray ( i , i + 32768 ) ) ; else for ( e = 0 ; 32768 > e ; ++ e ) a [ e ] = a [ i + e ] ; return this . a = 32768 , a } , o . prototype . D = function ( e ) { var t , n , i , a , o = this . input . length / this . c + 1 | 0 , s = this . input , r = this . b ; return e && ( "number" == typeof e . t && ( o = e . t ) , "number" == typeof e . z && ( o += e . z ) ) , 2 > o ? ( n = ( s . length - this . c ) / this . r [ 2 ] , a = 258 * ( n / 2 ) | 0 , i = a < r . length
0 < et . d && ( tt [ nt - 1 - pi ] = it [ at - 1 - pi ] = ot [ st - 1 - pi ] = 129 ) } var lt = et . Xc , ct = 16 * + et . i , dt = et . Sc , ut = 8 * + et . i , pt = et . Vc , mt = 8 * + et . i , ht = et . z , gt = m ; if ( 0 < et . d ) t ( tt , nt - pi , lt , ct , 16 ) , t ( it , at - pi , dt , ut , 8 ) , t ( ot , st - pi , pt , mt , 8 ) ; else if ( 0 == et . i ) { for ( i = 0 ; 21 > i ; ++ i ) tt [ nt - pi - 1 + i ] = 127 ; for ( i = 0 ; 9 > i ; ++ i ) it [ at - pi - 1 + i ] = 127 ; for ( i = 0 ; 9 > i ; ++ i ) ot [ st - pi - 1 + i ] = 127 } if ( et . wa ) { var ft = nt - pi + 16 ; 0 < et . d && ( et . i >= et . Ma - 1 ? tt [ ft + 0 ] = tt [ ft + 1 ] = tt [ ft + 2 ] = tt [ ft + 3 ] = lt [ ct + 15 ] : t ( tt , ft + 0 , lt , ct + 16 , 4 ) ) ; for ( var _t = 0 ; 4 > _t ; ++ _t ) tt [ _t + ft + 4 * pi ] = tt [ _t + ft + 4 * pi ] = tt [ _t + ft + 8 * pi ] = tt [ _t + ft + 12 * pi ] = tt [ _t + ft + 0 ] ; for ( gt = 0 ; 16 > gt ; gt ++ ) { var vt = tt , yt = nt + ga [ gt ] ; la [ et . Eb [ gt ] ] ( vt , yt ) , et . Oa & 1 << gt ? Ri ( ht , 16 * + gt , vt , yt , 0 ) : et . ja & 1 << gt && Bi ( ht , 16 * + gt , vt , yt ) } } else { var bt = he ( et , et . Eb [ 0 ] ) ; if ( ca [ bt ] ( tt , nt ) , et . ja ) for ( gt = 0 ; 16 > gt ; gt ++ ) vt = tt , yt = nt + ga [ gt ] , et . Oa & 1 << gt ? Ri ( ht , 16 * + gt , vt , yt , 0 ) : et . ja & 1 << gt && Bi ( ht , 16 * + gt , vt , yt ) } if ( bt = he ( et , et . Tc ) , da [ bt ] ( it , at ) , da [ bt ] ( ot , st ) , 983040 & et . ja ) { var wt = et . z , kt = 256 ; 983040 & et . Oa ? Li ( wt , kt , it , at ) : ji ( wt , kt , it , at ) } if ( 15728640 & et . ja ) { var $t = et . z , kt = 320 ; 15728640 & et . Oa ? Li ( $t , kt , ot , st ) : ji ( $t , kt , ot , st ) } et . d < et . hb - 1 && ( t ( lt , ct , tt , nt + 15 * pi , 16 ) , t ( dt , ut , it , at + 7 * pi , 8 ) , t ( pt , mt , ot , st + 7 * pi , 8 ) ) ; var St = e ; if ( 0 < St . A ) { var Ct = St . M [ 1 + St . i ] , xt = St . La [ 1 + St . i ] . Nb , Mt = St . Zb [ St . Lb ] ; St . ga . oc && ( Mt += St . ga . Lc [ 0 ] , St . wa && ( Mt += St . ga . Gc [ 0 ] ) ) , Mt = 0 > Mt ? 0 : Mt > 63 ? 63 : Mt , Ct . zc = Mt , 0 < St . ga . kb && ( Mt = 4 < St . ga . kb ? Mt >> 2 : Mt >> 1 , Mt > 9 - St . ga . kb && ( Mt = 9 - St . ga . kb ) ) , Ct . yc = 1 > Mt ? 1 : Mt , Ct . ab = ( ! xt || St . wa ) + 0 } for ( var At = m , Et = 8 * St . Ja * St . r , It = St . ca , Tt = St . da + 16 * St . i + 16 * St . Ja * St . H , Pt = St . aa , Dt = St . ba + 8 * St . i + Et , Nt = St . ra , Ft = St . sa + 8 * St . i + Et , At = 0 ; 16 > At ; ++ At ) t ( It , Tt + At * St . H , St . Ea , + hi + At * pi , 16 ) ; for ( At = 0 ; 8 > At ; ++ At ) t ( Pt , Dt + At * St . r , St . Ea , + gi + At * pi , 8 ) , t ( Nt , Ft + At * St . r , St . Ea , + fi + At * pi , 8 ) } var Ot = e , Ut = s , Rt = 1 , Lt = Ot . oa ; if ( Ot . qb ) { var Bt = Ot . rc , Rt = Rt & WebPWorkerSync ( Bt ) ; if ( p ( Bt . a == OK ) , Rt ) { if ( Lt . N = Ut , Lt . ha = Ot . Ja , Lt . d = Ot . d , Lt . W = Ot . W , Lt . W ) { var jt = Lt . M ; Lt . M = Ot . M , Ot . M = jt } WebPWorkerLaunch ( Bt ) , ++ Ot . Ja == Ot . jb && ( Ot . Ja = 0 ) } } else { Lt . d = Ot . d , Lt . W = Ot . W ; t : { var qt = 1 , Ht = Ot . oa , Vt = pa [ Ot . A ] , zt = Vt * Ot . H , Wt = parseInt ( Vt / 2 ) * Ot . r , Gt = 16 * Ht . ha * Ot . H , Kt = 8 * Ht . ha * Ot . r , Yt = Ot . ca , Zt = Ot . da - zt + Gt , Xt = Ot . aa , Jt = Ot . ba - Wt + Kt , tn = Ot . ra , an = Ot . sa - Wt + Kt , on = 0 == Ht . d , rn = ( Ht . d >= Ot . hb - 1 ) + 0 , ln = 16 * Ht . d , cn = 16 * ( Ht . d + 1 ) ; if ( Ht . W ) { var dn = Ot , un = g , pn = dn . oa . d ; for ( p ( dn . oa . W ) , un = dn . lb ; un < dn . wb ; ++ un ) { var mn = dn , hn = un , gn = pn , fn = mn . oa , _n = mn . H , vn = fn . M [ 1 + hn ] , yn = mn . ca , bn = mn . da + 16 * fn . ha * _n + 16 * hn , wn = vn . zc , kn = vn . yc , $n = 2 * wn + kn ; if ( 0 != wn ) if ( 1 == mn . A ) hn > 0 && Xi ( yn , bn , _n , $n + 4 ) , vn . ab && Qi ( yn , bn , _n , $n ) , gn > 0 && Zi ( yn , bn , _n , $n + 4 ) , vn . ab && Ji ( yn , bn , _n , $n ) ; else { var Sn = mn . r , Cn = mn . aa , xn = mn . ba + 8 * fn . ha * Sn + 8 * hn , Mn = mn . ra , An = mn . sa + 8 * fn . ha * Sn + 8 * hn , En = mn . Ac . fb ? wn >= 40 ? 2 : wn >= 15 ? 1 : 0 : wn >= 40 ? 3 : wn >= 20 ? 2 : wn >= 15 ? 1 : 0 ; hn > 0 && ( Hi ( yn , bn , _n , $n + 4 , kn , En ) , zi ( Cn , xn , Mn , An , Sn , $n + 4 , kn , En ) ) , vn . ab && ( Gi ( yn , bn , _n , $n , kn , En ) , Yi ( Cn , xn , Mn , An , Sn , $n , kn , En ) ) , gn > 0 && ( qi ( yn , bn , _n , $n + 4 , kn , En ) , Vi ( Cn , xn , Mn , An , Sn , $n + 4 , kn , En ) ) , vn . ab && ( Wi ( yn , bn , _n , $n , kn , En ) , Ki ( Cn , xn , Mn , An , Sn , $n , kn , En ) ) } } } if ( Ut . put ) { if ( on ? ( Ut . y = Ot . ca , Ut . D = Ot . da + Gt , Ut . c = Ot . aa , Ut . B = Ot . ba + Kt , Ut . S = Ot . ra , Ut . C = Ot . sa + Kt ) : ( ln -= Vt , Ut . y = Yt , Ut . D = Zt , Ut . c = Xt , Ut . B = Jt , Ut . S = tn , Ut . C = an ) , rn || ( cn -= Vt ) , cn > Ut . K && ( cn = Ut . K ) , Ot . Ga != h && cn > ln && ( 0 == ln ? ( Ut . p = U ( Ot , ln , cn - ln ) , Ut . q = 0 ) : Ut . q = U ( Ot , ln , cn - ln ) , Ut . p == h ) ) { Rt = ye ( Ot , nn , "Could not decode alpha data." ) ; break t } if ( ln < Ut . k ) { var In = Ut . k - ln , ln = Ut . k ; p ( ! ( 1 & In ) ) , Ut . D += Ot . H * In , Ut . B += Ot . r * ( In >> 1 ) , Ut . C += Ot . r * ( In >> 1 ) , Ut . p != h && ( Ut . q += Ut . width * In ) } cn > ln && ( Ut . D += Ut . t , Ut . B += Ut . t >> 1 , Ut . C += Ut . t >> 1 , Ut . p != h && ( Ut . q += Ut . t ) , Ut . w = ln - Ut . k , Ut . m = Ut . Ka - Ut . t , Ut . h = cn - ln , qt = Ut . put ( Ut ) ) } Ht . ha + 1 == Ot . jb && ! rn && ( t ( Ot . ca , Ot . da - zt , Yt , Zt + 16 * Ot . H , zt ) , t ( Ot . aa , Ot . ba - Wt , Xt , Jt + 8 * Ot . r , Wt ) , t ( Ot . ra , Ot . sa - Wt , tn , an + 8 * Ot . r , Wt ) ) , Rt = qt } } if ( ! Rt ) { l = ye ( e , "VP8_STATUS_USER_ABORT" , "Output aborted." ) ; break e } } var Tn ; if ( ! ( Tn = e . qb && ! WebPWorkerSync ( e . rc ) ) ) { var Pn ; ( Pn = 0 < e . fc ) && ( p ( e ) , p ( 0 < e . fc ) , Pn = ! 1 ) , Tn = Pn } l = Tn ? 0 : 1 } var Dn = l ; s . Pb && s . Pb ( s ) , l = 1 & Dn } return l ? ( e . za = 0 , l ) : ( Se ( e ) , 0 ) } function Se ( e ) { e != h && ( e . ib && ( e . ib = 0 ) , e . ib = h , e . Gb = 0 , e . za = 0 ) } function Ce ( e , t ) { return e + ( 1 << t ) - 1 >> t } function xe ( e , t , n , i , a ) { var o = Xa [ n ] + Ja [ t ] >> Aa ; t = Za [ t ] , i [ a + 0 ] = Qa [ e + Ya [ n ] - Ea ] , i [ a + 1 ] = Qa [ e + o - Ea ] , i [ a + 2 ] = Qa [ e + t - Ea ] } function Me ( e , t , n , i , a ) { var o = Xa [ n ] + Ja [ t ] >> Aa ; t = Za [ t ] , i [ a + 0 ] = 248 & Qa [ e + Ya [ n ] - Ea ] | Qa [ e + o - Ea ] >> 5 , i [ a + 1 ] = Qa [ e + o - Ea ] << 3 & 224 | Qa [ e + t - Ea ] >> 3
this . WebPGetDecoderVersion = this . Ld = function ( ) { return 512 } ; var ka = [ 0 , 1 , 2 , 3 , 6 , 4 , 5 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 6 , 7 , 0 ] , $a = [ [ 173 , 148 , 140 , 0 ] , [ 176 , 155 , 140 , 135 , 0 ] , [ 180 , 157 , 141 , 134 , 130 , 0 ] , [ 254 , 254 , 243 , 230 , 196 , 177 , 153 , 140 , 133 , 130 , 129 , 0 ] ] , Sa = [ 0 , 1 , 4 , 8 , 5 , 2 , 3 , 6 , 9 , 12 , 13 , 10 , 7 , 11 , 14 , 15 ] , Ca = u ( [ di , ui ] , "" ) ; c ( 4 , f ) ; var xa = [ [ 0 , 0 , 0 , 0 ] , [ 1 , 0 , 0 , 0 ] , [ 0 , 1 , 0 , 0 ] , [ 1 , 1 , 0 , 0 ] , [ 0 , 0 , 1 , 0 ] , [ 1 , 0 , 1 , 0 ] , [ 0 , 1 , 1 , 0 ] , [ 1 , 1 , 1 , 0 ] , [ 0 , 0 , 0 , 1 ] , [ 1 , 0 , 0 , 1 ] , [ 0 , 1 , 0 , 1 ] , [ 1 , 1 , 0 , 1 ] , [ 0 , 0 , 1 , 1 ] , [ 1 , 0 , 1 , 1 ] , [ 0 , 1 , 1 , 1 ] , [ 1 , 1 , 1 , 1 ] ] , Ma = 134480385 , Aa = 16 , Ea = - 227 , Ia = 482 , Ta = [ Ue , function ( e ) { return e } , function ( e , t , n ) { return t [ n + 0 ] } , function ( e , t , n ) { return t [ n + 1 ] } , function ( e , t , n ) { return t [ n - 1 ] } , function ( e , t , n ) { return Ne ( Ne ( e , t [ n + 1 ] ) , t [ n + 0 ] ) } , function ( e , t , n ) { return Ne ( e , t [ n - 1 ] ) } , function ( e , t , n ) { return Ne ( e , t [ n + 0 ] ) } , function ( e , t , n ) { return Ne ( t [ n - 1 ] , t [ n + 0 ] ) } , function ( e , t , n ) { return Ne ( t [ n + 0 ] , t [ n + 1 ] ) } , function ( e , t , n ) { return Ne ( Ne ( e , t [ n - 1 ] ) , Ne ( t [ n + 0 ] , t [ n + 1 ] ) ) } , function ( e , t , n ) { return 0 >= Math . abs ( ( e >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) + ( Math . abs ( ( e >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) ) + ( Math . abs ( ( e >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) - Math . abs ( ( t [ n + 0 ] >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) ) + ( Math . abs ( ( 255 & e ) - ( 255 & t [ n - 1 ] ) ) - Math . abs ( ( 255 & t [ n + 0 ] ) - ( 255 & t [ n - 1 ] ) ) ) ? t [ n + 0 ] : e } , function ( e , t , n ) { return ( Fe ( ( e >> 24 & 255 ) + ( t [ n + 0 ] >> 24 & 255 ) - ( t [ n - 1 ] >> 24 & 255 ) ) << 24 | Fe ( ( e >> 16 & 255 ) + ( t [ n + 0 ] >> 16 & 255 ) - ( t [ n - 1 ] >> 16 & 255 ) ) << 16 | Fe ( ( e >> 8 & 255 ) + ( t [ n + 0 ] >> 8 & 255 ) - ( t [ n - 1 ] >> 8 & 255 ) ) << 8 | Fe ( ( 255 & e ) + ( 255 & t [ n + 0 ] ) - ( 255 & t [ n - 1 ] ) ) ) >>> 0 } , function ( e , t , n ) { var i = t [ n - 1 ] ; return e = Ne ( e , t [ n + 0 ] ) , ( Oe ( e >> 24 & 255 , i >> 24 & 255 ) << 24 | Oe ( e >> 16 & 255 , i >> 16 & 255 ) << 16 | Oe ( e >> 8 & 255 , i >> 8 & 255 ) << 8 | Oe ( e >> 0 & 255 , i >> 0 & 255 ) ) >>> 0 } , Ue , Ue ] , Pa = { Cc : f , Bc : f , Kc : f } , Da = 16 , Na = 16 , Fa = 16 , Oa = [ 2 , 3 , 7 ] , Ua = [ 3 , 3 , 11 ] , Ra = 0 , La = 1 , Ba = 2 , ja = 3 , qa = 4 , Ha = [ Mn + An , Mn , Mn , Mn , 40 ] , Va = 19 , za = [ 17 , 18 , 0 , 1 , 2 , 3 , 4 , 5 , 16 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ] , Wa = 120 , Ga = [ 24 , 7 , 23 , 25 , 40 , 6 , 39 , 41 , 22 , 26 , 38 , 42 , 56 , 5 , 55 , 57 , 21 , 27 , 54 , 58 , 37 , 43 , 72 , 4 , 71 , 73 , 20 , 28 , 53 , 59 , 70 , 74 , 36 , 44 , 88 , 69 , 75 , 52 , 60 , 3 , 87 , 89 , 19 , 29 , 86 , 90 , 35 , 45 , 68 , 76 , 85 , 91 , 51 , 61 , 104 , 2 , 103 , 105 , 18 , 30 , 102 , 106 , 34 , 46 , 84 , 92 , 67 , 77 , 101 , 107 , 50 , 62 , 120 , 1 , 119 , 121 , 83 , 93 , 17 , 31 , 100 , 108 , 66 , 78 , 118 , 122 , 33 , 47 , 117 , 123 , 49 , 63 , 99 , 109 , 82 , 94 , 0 , 116 , 124 , 65 , 79 , 16 , 32 , 98 , 110 , 48 , 115 , 125 , 81 , 95 , 64 , 114 , 126 , 97 , 111 , 80 , 113 , 127 , 96 , 112 ] , Ka = 1 << Aa - 1 , Ya = c ( 256 , 0 ) , Za = c ( 256 , 0 ) , Xa = c ( 256 , _ ) , Ja = c ( 256 , _ ) , Qa = c ( Ia - Ea , f ) , eo = c ( Ia - Ea , f ) , to = 0 , no = Array ( Xt ) , io = [ function ( e , t , n , i , a , o , s , r , l , c , d , u , p ) { mt ( e , t , n , i , a , o , s , r , l , c , d , u , p , xe , 3 ) } , ht , function ( e , t , n , i , a , o , s , r , l , c , d , u , p ) { mt ( e , t , n , i , a , o , s , r , l , c , d , u , p , Ie , 3 ) } , gt , ft , _t , function ( e , t , n , i , a , o , s , r , l , c , d , u , p ) { mt ( e , t , n , i , a , o , s , r , l , c , d , u , p , Me , 2 ) } , ht , gt , ft , _t ] ; this . Hd = function ( e , t , n , i ) { return Nt ( Rt , e , t , n , i ) } , this . Id = function ( e , t , n , i ) { return Nt ( Lt , e , t , n , i ) } , this . Jd = function ( e , t , n , i ) { return Nt ( Ht , e , t , n , i ) } , this . Ed = function ( e , t , n , i ) { return Nt ( qt , e , t , n , i ) } , this . Fd = function ( e , t , n , i ) { return Nt ( Bt , e , t , n , i ) } , this . Gd = function ( e , t , n , i ) { return Nt ( jt , e , t , n , i ) } , this . WebPDecode = this . Dd = function ( t , n , i ) { var a = e ( un ) , o = "VP8StatusCode" ; return i == h ? tn : ( o = Ft ( t , [ 0 ] , [ n ] , i . input ) , o != Qt ? o == rn ? nn : o : ( a . j = i . j , a . Qa = i . Qa , o = Dt ( t , 0 , [ n ] , a ) ) ) } } } ( ) ; var _logTimer = ( new Date ) . getTime ( ) ; ! function ( e ) { function t ( ) { return { shortIndexes : { } , fullTexts : { } } } function n ( e ) { var t = "%" == e . charAt ( 0 ) ; return e = e . replace ( s , " " ) . replace ( r , "" ) , e = e . replace ( /[^A-Za-z0-9]/g , function ( e ) { return Config . LatinizeMap [ e ] || e } ) , e = e . toLowerCase ( ) , t && ( e = "%" + e ) , e } function i ( e ) { return e && e . toLowerCase ( ) || "" } function a ( e , t , i ) { if ( void 0 !== i . fullTexts [ e ] ) return ! 1 ; if ( t = n ( t ) , ! t . length ) return ! 1 ; var a = i . shortIndexes ; i . fullTexts [ e ] = t , angular . forEach ( t . split ( " " ) , function ( t ) { var n , i , o = Math . min ( t . length , 3 ) ; for ( i = 1 ; o >= i ; i ++ ) n = t . substr ( 0 , i ) , void 0 === a [ n ] ? a [ n ] = [ e ] : a [ n ] . push ( e ) } ) } function o ( e , t ) { var i = t . shortIndexes , a = t . fullTexts ; e = n ( e ) ; var o , s , r , l , c , d = e . split ( " " ) , u = ! 1 ; for ( s = 0 ; s < d . length ; s ++ ) { if ( o = i [ d [ s ] . substr ( 0 , 3 ) ] , ! o ) { u = [ ] ; break } ( u === ! 1 || u . length > o . length ) && ( u = o ) } for ( o = { } , r = 0 ; r < u . length ; r ++ ) { for ( c = ! 0 , l = a [ u [ r ] ] , s = 0 ; s < d . length ; s ++ ) if ( - 1 == l . indexOf ( d [ s ] ) ) { c = ! 1 ; break } c && ( o [ u [ r ] ] = ! 0 ) } return o } var s = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g , r = /^\s+|\s$/g ; e . SearchIndexManager = { createIndex : t , indexObject : a , cleanSearchText : n , cleanUsername : i , search : o } } ( window ) , TLSerialization . prototype . cr
break ; case "messageEntityEmail" : if ( a . noLinks ) { p = ! 0 ; break } _ . push ( '<a href="' , encodeEntities ( "mailto:" + u ) , '" target="_blank">' , encodeEntities ( u ) , "</a>" ) ; break ; case "messageEntityUrl" : case "messageEntityTextUrl" : if ( a . noLinks ) { p = ! 0 ; break } var h = d . url || u ; h . match ( /^https?:\/\//i ) || ( h = "http://" + h ) ; var $ ; if ( "messageEntityTextUrl" == d . _ ) h = "tg://unsafe_url?url=" + encodeURIComponent ( h ) ; else if ( $ = h . match ( /^https?:\/\/telegram\.me\/(.+)/ ) ) { var S = $ [ 1 ] . split ( "/" ) ; switch ( S [ 0 ] ) { case "joinchat" : h = "tg://join?invite=" + S [ 1 ] ; break ; case "addstickers" : h = "tg://addstickers?set=" + S [ 1 ] ; break ; default : var M = S [ 0 ] . split ( "?" ) ; h = "tg://resolve?domain=" + M [ 0 ] + ( M [ 1 ] ? "&" + M [ 1 ] : "" ) } } _ . push ( '<a href="' , encodeEntities ( h ) , '" target="_blank">' , s ( u , d . nested , a ) , "</a>" ) ; break ; case "messageEntityLinebreak" : _ . push ( a . noLinebreaks ? " " : "<br/>" ) ; break ; case "messageEntityEmoji" : _ . push ( '<span class="emoji emoji-' , d . coords . category , "-" , m * d . coords . column , "-" , m * d . coords . row , '" ' , 'title="' , d . title , '">' , ":" , d . title , ":</span>" ) , c = ! 0 ; break ; case "messageEntityBotCommand" : if ( a . noLinks || a . noCommands || l ) { p = ! 0 ; break } var A , E , I = u . substr ( 1 ) ; - 1 != ( E = I . indexOf ( "@" ) ) ? ( A = I . substr ( E ) , I = I . substr ( 0 , E ) ) : A = a . fromBot , _ . push ( '<a href="' , encodeEntities ( "tg://bot_command?command=" + encodeURIComponent ( I ) + ( A ? "&bot=" + encodeURIComponent ( A ) : "" ) ) , '">' , encodeEntities ( u ) , "</a>" ) ; break ; case "messageEntityBold" : _ . push ( "<strong>" , s ( u , d . nested , a ) , "</strong>" ) ; break ; case "messageEntityItalic" : _ . push ( "<em>" , s ( u , d . nested , a ) , "</em>" ) ; break ; case "messageEntityCode" : _ . push ( "<code>" , encodeEntities ( u ) , "</code>" ) ; break ; case "messageEntityPre" : _ . push ( "<pre><code" , d . language ? ' class="language-' + encodeEntities ( d . language ) + '"' : "" , ">" , encodeEntities ( u ) , "</code></pre>" ) ; break ; default : p = ! 0 } v = d . offset + ( p ? 0 : d . length ) } return _ . push ( encodeEntities ( n . substr ( v ) ) ) , n = t ( _ . join ( "" ) ) , c && ! a . nested && ( n = n . replace ( /\ufe0f|️|�|‍/g , "" , n ) , n = n . replace ( /<span class="emoji emoji-(\d)-(\d+)-(\d+)"(.+?)<\/span>/g , '<span class="emoji emoji-spritesheet-$1" style="background-position: -$2px -$3px;" $4</span>' ) ) , e . trustAs ( "html" , n ) } function l ( e ) { for ( var t = e . length , n = e . split ( "(" ) . length - 1 , i = e . split ( ")" ) . length - 1 ; i > n && ")" === e . charAt ( t - 1 ) ; ) e = e . substr ( 0 , t - 1 ) , i -- , t -- ; return n > i && ( e = e . replace ( /\)+$/ , "" ) ) , e } function c ( e , t ) { if ( h ) return e ; if ( ! e || ! e . length ) return "" ; t = t || { } , e = e . replace ( /\ufe0f/g , "" , e ) ; for ( var n , i , a = e , e = [ ] ; n = a . match ( k ) ; ) e . push ( a . substr ( 0 , n . index ) ) , e . push ( n [ 8 ] ? ( d = u [ n [ 8 ] ] ) && ( i = p [ d ] [ 1 ] [ 0 ] ) ? ":" + i + ":" : n [ 0 ] : n [ 0 ] ) , a = a . substr ( n . index + n [ 0 ] . length ) ; return e . push ( a ) , e . join ( "" ) } var d , u = { } , p = Config . Emoji , m = 18 , h = - 1 != navigator . userAgent . search ( /OS X|iPhone|iPad|iOS|Android/i ) , g = "\\u0023\\u20E3|\\u00a9|\\u00ae|\\u203c|\\u2049|\\u2139|[\\u2194-\\u2199]|\\u21a9|\\u21aa|\\u231a|\\u231b|\\u23e9|[\\u23ea-\\u23ec]|\\u23f0|\\u24c2|\\u25aa|\\u25ab|\\u25b6|\\u2611|\\u2614|\\u26fd|\\u2705|\\u2709|[\\u2795-\\u2797]|\\u27a1|\\u27b0|\\u27bf|\\u2934|\\u2935|[\\u2b05-\\u2b07]|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u3030|\\u303d|\\u3297|\\u3299|[\\uE000-\\uF8FF\\u270A-\\u2764\\u2122\\u25C0\\u25FB-\\u25FE\\u2615\\u263a\\u2648-\\u2653\\u2660-\\u2668\\u267B\\u267F\\u2693\\u261d\\u26A0-\\u26FA\\u2708\\u2702\\u2601\\u260E]|[\\u2600\\u26C4\\u26BE\\u23F3\\u2764]|\\uD83D[\\uDC00-\\uDFFF]|\\uD83C[\\uDDE8-\\uDDFA<EFBFBD> ]\\uD83C[\\uDDEA-\\uDDFA<EFBFBD> ]|[0-9]\\u20e3|\\uD83C[\\uDC00-\\uDFFF]" ; for ( d in p ) u [ p [ d ] [ 0 ] ] = d ; var f = " a - z \ \u00c0 - \ \u00d6 \ \u00d8 - \ \u00f6 \ \u00f8 - \ \u00ff \ \u0100 - \ \u024f \ \u0253 \ \u0254 \ \u0256 \ \u0257 \ \u0259 \ \u025b \ \u0263 \ \u0268 \ \u026f \ \u0272 \ \u0289 \ \u028b \ \u02bb \ \u0300 - \ \u036f \ \u1e00 - \ \u1eff \ \u0400 - \ \u04ff \ \u0500 - \ \u0527 \ \u2de0 - \ \u2dff \ \ua640 - \ \ua69f \ \u0591 - \ \u05bf \ \u05c1 - \ \u05c2 \ \u05c4 - \ \u05c5 \ \u05c7 \ \u05d0 - \ \u05ea \ \u05f0 - \ \u05f4 \ \ufb1d - \ \ufb28 \ \ufb2a - \ \ufb36 \ \ufb38 - \ \ufb3c \ \ufb3e \ \ufb40 - \ \ufb41 \ \ufb43 - \ \ufb44 \ \ufb46 - \ \ufb4f \ \u0610 - \ \u061a \ \u0620 - \ \u065f \ \u066e - \ \u06d3 \ \u06d5 - \ \u06dc \ \u06de - \ \u06e8 \ \u06ea - \ \u06ef \ \u06fa - \ \u06fc \ \u06ff \ \u0750 - \ \u077f \ \u08a0 \ \u08a2 - \ \u08ac \ \u08e4 - \ \u08fe \ \ufb50 - \ \ufbb1 \ \ufbd3 - \ \ufd3d \ \ufd50 - \ \ufd8f \ \ufd92 - \ \ufdc7 \ \ufdf0 - \ \ufdfb \ \ufe70 - \ \ufe74 \ \ufe76 - \ \ufefc \ \u200c \ \u0e01 - \ \u0e3a \ \u0e40 - \ \u0e4e \ \u1100 - \ \u11ff \ \u3130 - \ \u3185 \ \uA960 - \ \uA97F \ \uAC00 - \ \uD7AF \ \uD7B0 -
this . updateSession ( ) ) ; var l = this . updateSentMessage ( e . bad _msg _id ) ; this . pushResend ( l . msg _id ) , this . ackMessage ( n ) } break ; case "message" : this . serverMessages . push ( e . msg _id ) , this . processMessage ( e . body , e . msg _id , a ) ; break ; case "new_session_created" : this . ackMessage ( n ) , this . processMessageAck ( e . first _msg _id ) , this . applyServerSalt ( e . server _salt ) ; var c = this ; i . get ( "dc" ) . then ( function ( t ) { t == c . dcID && ! c . upload && h && h ( e ) } ) ; break ; case "msgs_ack" : for ( var s = 0 ; s < e . msg _ids . length ; s ++ ) this . processMessageAck ( e . msg _ids [ s ] ) ; break ; case "msg_detailed_info" : if ( ! this . sentMessages [ e . msg _id ] ) { this . ackMessage ( e . answer _msg _id ) ; break } case "msg_new_detailed_info" : this . reqResendMessage ( e . answer _msg _id ) ; break ; case "msgs_state_info" : if ( this . ackMessage ( e . answer _msg _id ) , this . lastResendReq && this . lastResendReq . req _msg _id == e . req _msg _id && this . pendingResends . length ) { var s , d , u ; for ( s = 0 ; s < this . lastResendReq . resend _msg _ids . length ; s ++ ) d = this . lastResendReq . resend _msg _ids [ s ] , u = this . pendingResends . indexOf ( d ) , - 1 != u && this . pendingResends . splice ( u , 1 ) } break ; case "rpc_result" : this . ackMessage ( n ) ; var p = e . req _msg _id , r = this . sentMessages [ p ] ; if ( this . processMessageAck ( p ) , r ) { var m = r . deferred ; if ( "rpc_error" == e . result . _ ) { var g = this . processError ( e . result ) ; console . log ( dT ( ) , "Rpc error" , g ) , m && m . reject ( g ) } else { if ( m ) { if ( Config . Modes . debug ) console . log ( dT ( ) , "Rpc response" , e . result ) ; else { var f = e . result . _ ; f || ( f = e . result . length > 5 ? "[.." + e . result . length + "..]" : e . result ) , console . log ( dT ( ) , "Rpc response" , f ) } r . deferred . resolve ( e . result ) } r . isAPI && ( this . connectionInited = ! 0 ) } delete this . sentMessages [ p ] } break ; default : this . ackMessage ( n ) , h && h ( e ) } } , { getNetworker : function ( e , t , n , i ) { return new u ( e , t , n , i ) } , setUpdatesProcessor : function ( e ) { h = e } , stopAll : m , startAll : p } } ] ) , angular . module ( "izhukov.mtproto.wrapper" , [ "izhukov.utils" , "izhukov.mtproto" ] ) . factory ( "MtpApiManager" , [ "Storage" , "MtpAuthorizer" , "MtpNetworkerFactory" , "MtpSingleInstanceService" , "AppRuntimeManager" , "ErrorService" , "qSync" , "$q" , "TelegramMeWebService" , function ( e , t , n , i , a , o , s , r , l ) { function c ( e ) { f !== e && ( f = e , l . setAuthorized ( f ) ) } function d ( t , n ) { e . set ( { dc : t , user _auth : angular . extend ( { dcID : t } , n ) } ) , c ( ! 0 ) , b = t } function u ( ) { for ( var t = [ ] , n = 1 ; 5 >= n ; n ++ ) t . push ( "dc" + n + "_auth_key" ) ; return e . get . apply ( e , t ) . then ( function ( n ) { for ( var i = [ ] , a = 0 ; a < n . length ; a ++ ) n [ a ] && i . push ( m ( "auth.logOut" , { } , { dcID : a + 1 } ) ) ; return r . all ( i ) . then ( function ( ) { e . remove ( "dc" , "user_auth" ) , b = ! 1 , c ( ! 1 ) } , function ( n ) { e . remove . apply ( t ) , e . remove ( "dc" , "user_auth" ) , b = ! 1 , n . handled = ! 0 , c ( ! 1 ) } ) } ) } function p ( i , a ) { a = a || { } ; var o = a . fileUpload || a . fileDownload ? v : _ ; if ( ! i ) throw new Exception ( "get Networker without dcID" ) ; if ( void 0 !== o [ i ] ) return s . when ( o [ i ] ) ; var l = "dc" + i + "_auth_key" , c = "dc" + i + "_server_salt" ; return e . get ( l , c ) . then ( function ( s ) { if ( void 0 !== o [ i ] ) return o [ i ] ; var d = s [ 0 ] , u = s [ 1 ] ; if ( d && 512 == d . length ) { var p = bytesFromHex ( d ) , m = bytesFromHex ( u ) ; return o [ i ] = n . getNetworker ( i , p , m , a ) } return a . createNetworker ? t . auth ( i ) . then ( function ( t ) { var s = { } ; return s [ l ] = bytesToHex ( t . authKey ) , s [ c ] = bytesToHex ( t . serverSalt ) , e . set ( s ) , o [ i ] = n . getNetworker ( i , t . authKey , t . serverSalt , a ) } , function ( e ) { return console . log ( "Get networker error" , e , e . stack ) , r . reject ( e ) } ) : r . reject ( { type : "AUTH_KEY_EMPTY" , code : 401 } ) } ) } function m ( t , n , i ) { i = i || { } ; var s , l , d = r . defer ( ) , h = function ( e ) { e ? angular . isObject ( e ) || ( e = { message : e } ) : e = { type : "ERROR_EMPTY" } , d . reject ( e ) , i . noErrorBox || ( e . input = t , e . stack = e . originalError && e . originalError . stack || e . stack || ( new Error ) . stack , setTimeout ( function ( ) { e . handled || ( 401 == e . code ? u ( ) [ "finally" ] ( function ( ) { "http:" != location . protocol || Config . Modes . http || - 1 == Config . App . domains . indexOf ( location . hostname ) ? ( location . hash = "/login" , a . reload ( ) ) : location . href = location . href . replace ( /^http:/ , "https:" ) } ) : o . show ( { error : e } ) , e . handled = ! 0 ) } , 100 ) ) } , g = ( new Error ) . stack ; if ( ! g ) try { window . unexistingFunction ( ) } catch ( f ) { g = f . stack || "" } var _ = function ( a ) { return ( l = a ) . wrapApiCall ( t , n , i ) . then ( function ( e ) { d . resolve ( e ) } , function ( o ) { if ( console . error ( dT ( ) , "Error" , o . code , o . type , b , s ) , 401 == o . code && b == s ) e . remove ( "dc" , "user_auth" ) , c ( ! 1 ) , h ( o ) ; else if ( 401 == o . code && b && s != b ) { if ( void 0 === y [ s ] ) { var u = r . defer ( ) ; m ( "auth.exportAuthorization" , { dc _id : s } , { noErrorBox : ! 0 } ) . then ( function ( e ) { m ( "auth.importAuthorization"
var l = [ ] ; angular . forEach ( p [ e . id ] , function ( e , t ) { l . push ( t ) } ) , i . $broadcast ( "webpage_updated" , { id : e . id , msgs : l } ) } } function l ( t , n ) { var a = i . $new ( ! 0 ) ; a . webpageID = t , a . messageID = n , e . open ( { templateUrl : templateUrl ( "embed_modal" ) , windowTemplateUrl : templateUrl ( "media_modal_layout" ) , controller : "EmbedModalController" , scope : a , windowClass : "photo_modal_window" } ) } function c ( e ) { var t = angular . copy ( u [ e ] ) || { _ : "webPageEmpty" } ; return t . photo && t . photo . id && ( t . photo = o . wrapForHistory ( t . photo . id , { website : "photo" != t . type && "video" != t . type } ) ) , t } function d ( e ) { var i = c ( e ) ; if ( ! i . embed _url ) return i ; var a = $ ( window ) . width ( ) - ( Config . Mobile ? 0 : 10 ) , o = $ ( n ) . height ( ) - ( Config . Mobile ? 92 : 150 ) ; ! Config . Mobile && a > 800 && ( a -= 208 ) ; var s = { width : a , height : o } ; if ( i . embed _width && i . embed _height ) { var r = calcImageInBox ( i . embed _width , i . embed _height , a , o ) ; s . width = r . w , s . height = r . h } else s . height = s . width = Math . min ( a , o ) ; var l = Config . Modes . chrome _packed ? "webview" : "iframe" , d = "iframe" != i . embed _type ? i . embed _type || "text/html" : "text/html" , u = "<" + l + ' src="' + encodeEntities ( i . embed _url ) + '" type="' + encodeEntities ( d ) + '" frameborder="0" border="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="' + s . width + '" height="' + s . height + '" style="width: ' + s . width + "px; height: " + s . height + 'px;"></' + l + ">" ; return s . html = t . trustAs ( "html" , u ) , i . full = s , i } var u = { } , p = { } ; return i . $on ( "apiUpdate" , function ( e , t ) { switch ( t . _ ) { case "updateWebPage" : r ( t . webpage ) } } ) , { saveWebPage : r , openEmbed : l , wrapForFull : d , wrapForHistory : c } } ] ) . service ( "AppVideoManager" , [ "$sce" , "$rootScope" , "$modal" , "$window" , "MtpApiFileManager" , "AppUsersManager" , "FileManager" , "qSync" , function ( e , t , n , i , a , o , s , r ) { function l ( e , t ) { t && angular . extend ( e , t ) , g [ e . id ] = e , e . thumb && "photoCachedSize" == e . thumb . _ && ( a . saveSmallFile ( e . thumb . location , e . thumb . bytes ) , e . thumb . size = e . thumb . bytes . length , delete e . thumb . bytes , e . thumb . _ = "photoSize" ) } function c ( e ) { if ( void 0 !== f [ e ] ) return f [ e ] ; var t = angular . copy ( g [ e ] ) , n = Math . min ( _ - 80 , Config . Mobile ? 210 : 150 ) , i = Math . min ( v - 100 , Config . Mobile ? 210 : 150 ) , a = t . thumb , o = { placeholder : "img/placeholders/VideoThumbConversation.gif" , width : n , height : i } ; return a && "photoSizeEmpty" != a . _ && ( a . w / a . h > n / i ? o . height = parseInt ( a . h * n / a . w ) : ( o . width = parseInt ( a . w * i / a . h ) , o . width > n && ( o . height = parseInt ( o . height * n / o . width ) , o . width = n ) ) , o . location = a . location , o . size = a . size ) , t . thumb = o , f [ e ] = t } function d ( e ) { var t = c ( e ) , n = Math . min ( $ ( window ) . width ( ) - ( Config . Mobile ? 0 : 60 ) , 542 ) , a = $ ( i ) . height ( ) - ( Config . Mobile ? 92 : 150 ) , o = { placeholder : "img/placeholders/VideoThumbModal.gif" , width : n , height : a } ; if ( t . w && t . h ) { var s = calcImageInBox ( t . w , t . h , n , a ) ; o . width = s . w , o . height = s . h } else o . height = o . width = Math . min ( n , a ) ; return t . full = o , t . fullThumb = angular . copy ( t . thumb ) , t . fullThumb . width = o . width , t . fullThumb . height = o . height , t } function u ( e , i ) { var a = t . $new ( ! 0 ) ; return a . videoID = e , a . messageID = i , n . open ( { templateUrl : templateUrl ( "video_modal" ) , windowTemplateUrl : templateUrl ( "media_modal_layout" ) , controller : "VideoModalController" , scope : a , windowClass : "video_modal_window" } ) } function p ( e ) { var t = g [ e ] , n = f [ e ] || t || { } , i = { _ : "inputVideoFileLocation" , id : e , access _hash : t . access _hash } ; void 0 === n . downloaded && a . getDownloadedFile ( i , t . size ) . then ( function ( ) { n . downloaded = ! 0 } , function ( ) { n . downloaded = ! 1 } ) } function m ( n , i ) { var o = g [ n ] , l = f [ n ] || o || { } , c = o . mime _type || "video/ogg" , d = { _ : "inputVideoFileLocation" , id : n , access _hash : o . access _hash } ; if ( l . downloaded && ! i ) { var u = a . getCachedFile ( d ) ; if ( u ) return r . when ( u ) } l . progress = { enabled : ! l . downloaded , percent : 1 , total : o . size } ; var p = a . downloadFile ( o . dc _id , d , o . size , { mime : c , toFileEntry : i } ) ; return p . then ( function ( t ) { s . getFileCorrectUrl ( t , c ) . then ( function ( t ) { l . url = e . trustAsResourceUrl ( t ) } ) , delete l . progress , l . downloaded = ! 0 , console . log ( "video save done" ) } , function ( e ) { console . log ( "video download failed" , e ) , l . progress . enabled = ! 1 } , function ( e ) { console . log ( "dl progress" , e ) , l . progress . enabled = ! 0 , l . progress . done = e . done , l . progress . percent = Math . max ( 1 , Math . floor ( 100 * e . done / e . total ) ) , t . $broadcast ( "history_update" ) } ) , l . progress . cancel = p . cancel , p } function h ( e ) { { var t = g [ e ] , n = t . mime _type || "video/mp4" , i = n . split ( "." ) [ 1 ] || "mp4" , a = "t_video" + e + "." + i ; f [ e ] || t || { } } s . chooseSave ( a , i , n ) . then ( function ( t ) { t && m ( e , t ) } , function ( ) { m ( e ) . then ( function ( e ) { s .
n . getUserID ( ) . then ( function ( e ) { return e ? void t . url ( "/im" ) : "http:" != location . protocol || Config . Modes . http || - 1 == Config . App . domains . indexOf ( location . hostname ) ? void t . url ( "/login" ) : void ( location . href = location . href . replace ( /^http:/ , "https:" ) ) } ) , a . checkUpdate ( ) , o . start ( ) } ] ) . controller ( "AppLoginController" , [ "$scope" , "$rootScope" , "$location" , "$timeout" , "$modal" , "$modalStack" , "MtpApiManager" , "ErrorService" , "NotificationsManager" , "PasswordManager" , "ChangelogNotifyService" , "IdleManager" , "LayoutSwitchService" , "TelegramMeWebService" , "_" , function ( e , t , n , i , a , o , s , r , l , c , d , u , p , m , h ) { function g ( ) { var t = ( navigator . language || "" ) . toLowerCase ( ) , n = Config . LangCountries [ t ] , i = ! Config . Navigator . mobile ; if ( f ( - 1 == [ "en" , "en-us" , "en-uk" ] . indexOf ( t ) ? void 0 !== n ? n : t . indexOf ( "-" ) > 0 ? t . split ( "-" ) [ 1 ] . toUpperCase ( ) : "US" : "US" ) , i ) { var a = e . credentials . phone _country ; s . invokeApi ( "help.getNearestDc" , { } , { dcID : 2 , createNetworker : ! 0 } ) . then ( function ( t ) { a == e . credentials . phone _country && f ( t . country ) , t . nearest _dc != t . this _dc && s . getNetworker ( t . nearest _dc , { createNetworker : ! 0 } ) } ) } } function f ( e ) { if ( e ) { var t , n ; for ( t = 0 ; t < Config . CountryCodes . length ; t ++ ) if ( n = Config . CountryCodes [ t ] , n [ 0 ] == e ) return _ ( { name : h ( n [ 1 ] + "_raw" ) , code : n [ 2 ] } ) } return _ ( { name : h ( "country_select_modal_country_us_raw" ) , code : "+1" } ) } function _ ( t ) { $ = t , e . credentials . phone _country != t . code ? e . credentials . phone _country = t . code : v ( ) , e . $broadcast ( "country_selected" ) , e . $broadcast ( "value_updated" ) } function v ( ) { var t , n , i , a = ( ( e . credentials . phone _country || "" ) + ( e . credentials . phone _number || "" ) ) . replace ( /\D+/g , "" ) , o = 0 , s = ! 1 ; if ( a . length ) if ( $ && ! a . indexOf ( $ . code . replace ( /\D+/g , "" ) ) ) s = $ . name ; else for ( t = 0 ; t < Config . CountryCodes . length ; t ++ ) for ( n = 2 ; n < Config . CountryCodes [ t ] . length ; n ++ ) i = Config . CountryCodes [ t ] [ n ] . replace ( /\D+/g , "" ) , i . length > o && ! a . indexOf ( i ) && ( o = i . length , s = h ( Config . CountryCodes [ t ] [ 1 ] + "_raw" ) ) ; e . credentials . phone _full = a , e . credentials . phone _country _name = s || h ( "login_controller_unknown_country_raw" ) } function y ( e ) { s . setUserAuth ( k . dcID , { id : e . user . id } ) , i . cancel ( S ) , n . url ( "/im" ) } function b ( ) { i . cancel ( S ) , e . credentials . viaApp || ( -- e . callPending . remaining ? S = i ( b , 1e3 ) : ( e . callPending . success = ! 1 , s . invokeApi ( "auth.sendCall" , { phone _number : e . credentials . phone _full , phone _code _hash : e . credentials . phone _code _hash } , k ) . then ( function ( ) { e . callPending . success = ! 0 } ) ) ) } function w ( ) { return c . getState ( k ) . then ( function ( t ) { return e . password = t } ) } o . dismissAll ( ) , u . start ( ) , s . getUserID ( ) . then ( function ( e ) { return e ? void n . url ( "/im" ) : "http:" != location . protocol || Config . Modes . http || - 1 == Config . App . domains . indexOf ( location . hostname ) ? void m . setAuthorized ( ! 1 ) : void ( location . href = location . href . replace ( /^http:/ , "https:" ) ) } ) ; var k = { dcID : 2 , createNetworker : ! 0 } , $ = ! 1 ; e . credentials = { phone _country : "" , phone _country _name : "" , phone _number : "" , phone _full : "" } , e . progress = { } , e . callPending = { } , e . about = { } , e . chooseCountry = function ( ) { var e = a . open ( { templateUrl : templateUrl ( "country_select_modal" ) , controller : "CountrySelectModalController" , windowClass : "countries_modal_window mobile_modal" , backdrop : "single" } ) ; e . result . then ( _ ) } , e . $watch ( "credentials.phone_country" , v ) , e . $watch ( "credentials.phone_number" , v ) , g ( ) ; var S ; e . sendCode = function ( ) { i . cancel ( S ) , r . confirm ( { type : "LOGIN_PHONE_CORRECT" , country _code : e . credentials . phone _country , phone _number : e . credentials . phone _number } ) . then ( function ( ) { e . progress . enabled = ! 0 , onContentLoaded ( function ( ) { e . $broadcast ( "ui_height" ) } ) ; var n = tsNow ( ) ; s . invokeApi ( "auth.sendCode" , { phone _number : e . credentials . phone _full , api _id : Config . App . id , api _hash : Config . App . hash , lang _code : navigator . language || "en" } , k ) . then ( function ( t ) { e . progress . enabled = ! 1 , e . credentials . phone _code _hash = t . phone _code _hash , e . credentials . phone _occupied = t . phone _registered , e . credentials . viaApp = "auth.sentAppCode" == t . _ , e . callPending . remaining = t . send _call _timeout || 60 , e . error = { } , e . about = { } , b ( ) , onContentLoaded ( function ( ) { e . $broadcast ( "ui_height" ) } ) } , function ( t ) { switch ( e . progress . enabled = ! 1 , console . log ( "sendCode error" , t ) , t . type ) { case "PHONE_NUMBER_INVALID" : e . error = { field : "phone" } , t . handled = ! 0 } } ) [ "finally" ] ( function ( ) { ( t . idle . isIDLE || tsNow ( ) - n > 6e4 ) && l . notify ( { title : "Telegram" , message : " Your authorization key was successfully generated ! Open
var n = { } ; n [ "draft" + e . curDialog . peerID ] = t , i . set ( n ) } else i . remove ( "draft" + e . curDialog . peerID ) } function $ ( ) { return "inputPeerChannel" == e . curDialog . inputPeer . _ ? ! 1 : void n . invokeApi ( "messages.setTyping" , { peer : e . curDialog . inputPeer , action : { _ : "sendMessageTypingAction" } } ) } function S ( t ) { if ( angular . isArray ( t ) && t . length ) { var n = { replyToMsgID : e . draftMessage . replyToMessage && e . draftMessage . replyToMessage . mid , isMedia : e . draftMessage . isMedia } ; delete e . draftMessage . replyToMessage , t [ 0 ] . lastModified && t . sort ( function ( e , t ) { return e . lastModified - t . lastModified } ) ; for ( var i = 0 ; i < t . length ; i ++ ) c . sendFile ( e . curDialog . peerID , t [ i ] , n ) , e . $broadcast ( "ui_message_send" ) } } function C ( t ) { if ( t ) { var n = l . getDoc ( t ) ; if ( n . id && n . access _hash ) { var i = { _ : "inputMediaDocument" , id : { _ : "inputDocument" , id : n . id , access _hash : n . access _hash } } , a = { replyToMsgID : e . draftMessage . replyToMessage && e . draftMessage . replyToMessage . mid } ; c . sendOther ( e . curDialog . peerID , i , a ) , e . $broadcast ( "ui_message_send" ) } delete e . draftMessage . sticker , g ( ) } } function x ( t ) { t && ( c . sendText ( e . curDialog . peerID , t ) , g ( ) , delete e . draftMessage . sticker , delete e . draftMessage . text , delete e . draftMessage . command , e . $broadcast ( "ui_message_send" ) , e . $broadcast ( "ui_peer_draft" ) ) } e . $watch ( "curDialog.peer" , g ) , e . $on ( "user_update" , angular . noop ) , e . $on ( "peer_share" , f ) , e . $on ( "reply_selected" , function ( e , t ) { _ ( t ) } ) , e . $on ( "ui_typing" , $ ) , e . draftMessage = { text : "" , send : p , replyClear : v } , e . mentions = { } , e . commands = { } , e . $watch ( "draftMessage.text" , k ) , e . $watch ( "draftMessage.files" , S ) , e . $watch ( "draftMessage.sticker" , C ) , e . $watch ( "draftMessage.command" , x ) , e . $on ( "history_reply_markup" , function ( t , n ) { n . peerID == e . curDialog . peerID && b ( ) } ) , e . replyKeyboardToggle = w , e . toggleSlash = y ; var M = ! 1 } ] ) . controller ( "AppLangSelectController" , [ "$scope" , "_" , "Storage" , "ErrorService" , "AppRuntimeManager" , function ( e , t , n , i , a ) { e . supportedLocales = Config . I18n . supported , e . langNames = Config . I18n . languages , e . curLocale = Config . I18n . locale , e . form = { locale : Config . I18n . locale } , e . localeSelect = function ( t ) { t = t || e . form . locale , e . curLocale !== t && i . confirm ( { type : "APPLY_LANG_WITH_RELOAD" } ) . then ( function ( ) { n . set ( { i18n _locale : t } ) . then ( function ( ) { a . reload ( ) } ) } , function ( ) { e . form . locale = e . curLocale } ) } } ] ) . controller ( "AppFooterController" , [ "$scope" , "LayoutSwitchService" , function ( e , t ) { e . switchLayout = function ( e ) { t . switchLayout ( e ) } } ] ) . controller ( "PhotoModalController" , [ "$q" , "$scope" , "$rootScope" , "$modalInstance" , "AppPhotosManager" , "AppMessagesManager" , "AppPeersManager" , "AppWebPagesManager" , "PeersSelectService" , "ErrorService" , function ( e , t , n , i , a , o , s , r , l , c ) { function d ( e ) { var n = 0 > e ? [ - 1 , - 2 ] : [ 1 , 2 ] , i = v . indexOf ( t . messageID ) ; angular . forEach ( n , function ( e ) { var t = v [ i + e ] ; if ( void 0 !== t && void 0 === y [ t ] ) { y [ t ] = ! 0 ; var n = o . getMessage ( t ) , s = n . media . photo . id ; a . preloadPhoto ( s ) } } ) } function u ( e ) { var n = v . indexOf ( t . messageID ) ; w ? e && ( t . count = Math . max ( e , v . length ) ) : t . count = v . length , t . pos = t . count - n , t . nav . hasNext = n > 0 , t . nav . hasPrev = w || n < v . length - 1 , t . canForward = t . canDelete = t . messageID > 0 } function p ( n ) { var i = v . indexOf ( t . messageID ) , s = i >= 0 ? i + n : 0 , r = ++ k , l = s >= v . length ? m ( ) : e . when ( ) ; l . then ( function ( ) { if ( r == k ) { var e = v [ s ] , i = o . getMessage ( e ) , l = i && i . media && ( i . media . photo && i . media . photo . id || i . media . webpage && i . media . webpage . photo && i . media . webpage . photo . id ) ; if ( ! l ) return void console . error ( "Invalid photo message" , s , v , e , i ) ; t . messageID = e , t . photoID = l , t . photo = a . wrapForFull ( t . photoID ) , y [ t . messageID ] = ! 0 , u ( ) , n > 0 && w && v . indexOf ( e ) + 1 >= v . length ? m ( ) : d ( n ) } } ) } function m ( ) { return $ ? $ : $ = o . getSearch ( g , f , _ , b ) . then ( function ( t ) { return t . history . length ? ( b = t . history [ t . history . length - 1 ] , v = v . concat ( t . history ) , w = v . length < t . count ) : w = ! 1 , u ( t . count ) , $ = ! 1 , t . history . length ? e . reject ( ) : void d ( 1 ) } ) } if ( t . photo = a . wrapForFull ( t . photoID ) , t . nav = { } , t . download = function ( ) { a . downloadPhoto ( t . photoID ) } , t . messageID ) { t . forward = function ( ) { var e = t . messageID ; l . selectPeers ( { confirm _type : "FORWARD_PEER" } ) . then ( function ( t ) { angular . forEach ( t , function ( i ) { var a = s . getPeerID ( i ) ; o . forwardMessages ( a , [ e ] ) . then ( function ( ) { 1 == t . length && n . $broadcast ( "history_focus" , { peerString : i } ) } ) } ) } ) } , t . goToMessage = function ( ) { var e = t . messageID , a = o . getMessagePeer ( o . getMessage ( e ) ) , r = s . getPeerString ( a ) ; i . dismiss ( ) , n . $broadcast ( "history_focus" , { peerString :
if ( e . selectedCount > 0 ) { var n = [ ] ; return angular . forEach ( e . selectedPeers , function ( e , t ) { n . push ( i . getPeerString ( t ) ) } ) , t . close ( n ) } } , e . toggleSearch = function ( ) { e . $broadcast ( "dialogs_search_toggle" ) } } ] ) . controller ( "ChatCreateModalController" , [ "$scope" , "$modalInstance" , "$rootScope" , "MtpApiManager" , "AppUsersManager" , "AppChatsManager" , "ApiUpdatesManager" , function ( e , t , n , i , a , o , s ) { e . group = { name : "" } , e . createGroup = function ( ) { if ( e . group . name ) { e . group . creating = ! 0 ; var r = [ ] ; return angular . forEach ( e . userIDs , function ( e ) { r . push ( a . getUserInput ( e ) ) } ) , i . invokeApi ( "messages.createChat" , { title : e . group . name , users : r } ) . then ( function ( e ) { if ( s . processUpdateMessage ( e ) , e . updates && e . updates . length ) { for ( var i , a = 0 , r = e . updates . length ; r > a ; a ++ ) if ( i = e . updates [ a ] , "updateNewMessage" == i . _ ) { n . $broadcast ( "history_focus" , { peerString : o . getChatString ( i . message . to _id . chat _id ) } ) ; break } t . close ( ) } } ) [ "finally" ] ( function ( ) { delete e . group . creating } ) } } } ] ) . controller ( "ChatEditModalController" , [ "$scope" , "$modalInstance" , "$rootScope" , "MtpApiManager" , "AppUsersManager" , "AppChatsManager" , "ApiUpdatesManager" , function ( e , t , n , i , a , o , s ) { var r = o . getChat ( e . chatID ) ; e . group = { name : r . title } , e . updateGroup = function ( ) { if ( e . group . name ) { if ( e . group . name == r . title ) return t . close ( ) ; e . group . updating = ! 0 ; var a ; return a = o . isChannel ( e . chatID ) ? i . invokeApi ( "channels.editTitle" , { channel : o . getChannelInput ( e . chatID ) , title : e . group . name } ) : i . invokeApi ( "messages.editChatTitle" , { chat _id : o . getChatInput ( e . chatID ) , title : e . group . name } ) , a . then ( function ( t ) { s . processUpdateMessage ( t ) ; var i = o . getChatString ( e . chatID ) ; n . $broadcast ( "history_focus" , { peerString : i } ) } ) [ "finally" ] ( function ( ) { delete e . group . updating } ) } } } ] ) . controller ( "ChannelEditModalController" , [ "$q" , "$scope" , "$modalInstance" , "$rootScope" , "MtpApiManager" , "AppUsersManager" , "AppChatsManager" , "AppProfileManager" , "ApiUpdatesManager" , function ( e , t , n , i , a , o , s , r , l ) { function c ( ) { return a . invokeApi ( "channels.editTitle" , { channel : s . getChannelInput ( t . chatID ) , title : t . channel . title } ) . then ( function ( e ) { l . processUpdateMessage ( e ) } ) } function d ( ) { return a . invokeApi ( "channels.editAbout" , { channel : s . getChannelInput ( t . chatID ) , about : t . channel . about } ) } var u = s . getChat ( t . chatID ) , p = { title : u . title } ; t . channel = { title : u . title } , r . getChannelFull ( t . chatID ) . then ( function ( e ) { p . about = e . about , t . channel . about = e . about } ) , t . updateChannel = function ( ) { if ( t . channel . title . length ) { var n = [ ] ; return t . channel . title != p . title && n . push ( c ( ) ) , t . channel . about != p . about && n . push ( d ( ) ) , e . all ( n ) . then ( function ( ) { var e = s . getChatString ( t . chatID ) ; i . $broadcast ( "history_focus" , { peerString : e } ) } ) [ "finally" ] ( function ( ) { delete t . channel . updating } ) } } } ] ) . controller ( "ChatInviteLinkModalController" , [ "_" , "$scope" , "$timeout" , "$modalInstance" , "AppChatsManager" , "AppProfileManager" , "ErrorService" , function ( e , t , n , i , a , o , s ) { function r ( ) { n ( function ( ) { t . $broadcast ( "ui_invite_select" ) } , 100 ) } function l ( e ) { var n = a . getChat ( t . chatID ) ; return n . username ? ( t . exportedInvite = { link : "https://telegram.me/" + n . username , "short" : ! 0 } , void r ( ) ) : ( e && ( t . exportedInvite . revoking = ! 0 ) , void o . getChatInviteLink ( t . chatID , e ) . then ( function ( e ) { t . exportedInvite = { link : e , canRevoke : ! 0 } , r ( ) } ) [ "finally" ] ( function ( ) { delete t . exportedInvite . revoking } ) ) } t . exportedInvite = { link : e ( "group_invite_link_loading_raw" ) } ; var c = a . isChannel ( t . chatID ) ; t . revokeLink = function ( ) { s . confirm ( { type : c ? "REVOKE_CHANNEL_INVITE_LINK" : "REVOKE_GROUP_INVITE_LINK" } ) . then ( function ( ) { l ( ! 0 ) } ) } , l ( ) } ] ) . controller ( "ImportContactModalController" , [ "$scope" , "$modalInstance" , "$rootScope" , "AppUsersManager" , "ErrorService" , "PhonebookContactsService" , function ( e , t , n , i , a , o ) { void 0 === e . importContact && ( e . importContact = { } ) , e . phonebookAvailable = o . isAvailable ( ) , e . doImport = function ( ) { e . importContact && e . importContact . phone && ( e . progress = { enabled : ! 0 } , i . importContact ( e . importContact . phone , e . importContact . first _name || "" , e . importContact . last _name || "" ) . then ( function ( e ) { e || a . show ( { error : { code : 404 , type : "USER_NOT_USING_TELEGRAM" } } ) , t . close ( e ) } ) [ "finally" ] ( function ( ) { delete e . progress . enabled } ) ) } , e . importPhonebook = function ( ) { o . openPhonebookImport ( ) . result . then ( function ( e ) { e ? t . close ( e [ 0 ] ) : t . dismiss ( ) } ) } } ] ) . controller ( "CountrySelectModalController" , [ "$scope" , " $moda
case "messageActionChatEditTitle" : case "messageActionChannelCreate" : case "messageActionChannelEditTitle" : t . action . rTitle = v . wrapRichText ( t . action . title , { noLinks : ! 0 , noLinebreaks : ! 0 } ) || M ( "chat_title_deleted" ) ; break ; case "messageActionBotIntro" : t . action . rDescription = v . wrapRichText ( t . action . description , { noCommands : ! a , fromBot : i } ) } var l = t . reply _to _mid ; return l && ( ye [ l ] ? t . reply _to _msg = re ( l ) : ( t . reply _to _msg = { mid : l , loading : ! 0 } , - 1 == De . indexOf ( l ) && ( De . push ( l ) , Ne === ! 1 && ( Ne = setTimeout ( de , 100 ) ) ) ) ) , be [ e ] = t } function ce ( e ) { if ( ! e || "replyKeyboardHide" == e . _ ) return ! 1 ; if ( e . wrapped ) return e ; var t = e . rows && e . rows . length || 0 ; return t > 0 && 4 >= t && ! e . pFlags . resize && ( e . splitCount = t ) , e . wrapped = ! 0 , angular . forEach ( e . rows , function ( e ) { angular . forEach ( e . buttons , function ( e ) { e . rText = v . wrapRichText ( e . text , { noLinks : ! 0 , noLinebreaks : ! 0 } ) } ) } ) , nextRandomInt ( 1 ) && ( e . rows = e . rows . slice ( 0 , 2 ) ) , e } function de ( ) { if ( Ne !== ! 1 && ( clearTimeout ( Ne ) , Ne = ! 1 ) , De . length ) { var e = De . slice ( ) ; De = [ ] ; var n , i , a , o , s = { } , c = { } ; for ( n = 0 ; n < e . length ; n ++ ) i = e [ n ] , a = U ( i ) , o = a [ 1 ] , void 0 === s [ o ] && ( s [ o ] = [ ] , c [ o ] = [ ] ) , s [ o ] . push ( a [ 0 ] ) , c [ o ] . push ( i ) ; angular . forEach ( s , function ( e , n ) { var i ; i = n > 0 ? f . invokeApi ( "channels.getMessages" , { channel : l . getChannelInput ( n ) , id : e } ) : f . invokeApi ( "messages.getMessages" , { id : e } ) , i . then ( function ( e ) { r . saveApiUsers ( e . users ) , l . saveApiChats ( e . chats ) , X ( e . messages ) , t . $broadcast ( "messages_downloaded" , c [ n ] ) } ) } ) } } function ue ( e , t ) { if ( ! e || ! e . length ) return ! 1 ; var n , i , a , o , s , r , l , c = 0 , d = e . length , u = d , p = ! 1 , m = ! Config . Mobile ; for ( t > 0 ? u = Math . min ( t , d ) : 0 > t && ( c = Math . max ( 0 , u + t ) ) , n = c ; u > n ; n ++ ) { if ( o = e [ n ] , i = Math . floor ( ( o . date + ve ) / 86400 ) , l = s && s . grouped , r = o . grouped , i === a ? o . needDate && ( delete o . needDate , p = ! 0 ) : ( ! n || s ) && ( o . needDate || ( o . needDate = ! 0 , p = ! 0 ) ) , o . fwdFromID && o . media && o . media . document && ( o . media . document . sticker || o . media . document . audioTitle ) && ( o . fromID != ( s || { } ) . fromID || ! ( s || { } ) . fwdFromID ) && ( delete o . fwdFromID , o . _ = "message" ) , s && o . fromID == s . fromID && ! s . fwdFromID == ! o . fwdFromID && ! s . action && ! o . action && o . date < s . date + 900 ) { var h = o . message && o . message . length < 70 && - 1 == o . message . indexOf ( "\n" ) && ! o . reply _to _mid ; o . grouped = m && o . fwdFromID && o . fwdFromID == s . fwdFromID ? h ? "im_grouped_fwd_short" : "im_grouped_fwd" : ! o . fwdFromID && h ? "im_grouped_short" : "im_grouped" , m && o . fwdFromID && ( s . grouped || ( s . grouped = "im_grouped_fwd_start" ) , o . grouped && n == d - 1 && ( o . grouped += " im_grouped_fwd_end" ) ) } else ( s || ! n ) && ( delete o . grouped , m && s && s . grouped && s . fwdFromID && ( s . grouped += " im_grouped_fwd_end" ) ) ; p || l == ( s && s . grouped ) || ( p = ! 0 ) , s = o , a = i } return p || r == ( s && s . grouped ) || ( p = ! 0 ) , p } function pe ( e ) { Le !== ! 1 && e && e > Le && w . set ( { max _seen _msg : e } ) } function me ( e , n ) { n = n || { } ; var i , a , o = se ( e ) , s = { } , c = ! 1 , d = y . getNotifySettings ( ) ; if ( e . fwdFromID && n . fwd _count ) c = je ( n . fwd _count ) ; else if ( e . message ) c = d . nopreview ? M ( "conversation_message_sent" ) : v . wrapPlainText ( e . message ) ; else if ( e . media ) switch ( e . media . _ ) { case "messageMediaPhoto" : c = M ( "conversation_media_photo_raw" ) ; break ; case "messageMediaVideo" : c = M ( "conversation_media_video_raw" ) ; break ; case "messageMediaDocument" : if ( e . media . document . sticker ) { c = M ( "conversation_media_sticker" ) ; var u = e . media . document . stickerEmojiRaw ; void 0 !== u && ( c = v . wrapPlainText ( u ) + " (" + c + ")" ) } else c = e . media . document . file _name || M ( "conversation_media_document_raw" ) ; break ; case "messageMediaAudio" : c = M ( "conversation_media_audio_raw" ) ; break ; case "messageMediaGeo" : case "messageMediaVenue" : c = M ( "conversation_media_location_raw" ) ; break ; case "messageMediaContact" : c = M ( "conversation_media_contact_raw" ) ; break ; default : c = M ( "conversation_media_attachment_raw" ) } else if ( "messageService" == e . _ ) switch ( e . action . _ ) { case "messageActionChatCreate" : c = M ( "conversation_group_created_raw" ) ; break ; case "messageActionChatEditTitle" : c = M ( "conversation_group_renamed_raw" ) ; break ; case "messageActionChatEditPhoto" : c = M ( "conversation_group_photo_updated_raw" ) ; break ; case "messageActionChatDeletePhoto" : c = M ( "conversation_group_photo_removed_raw" ) ; break ; case "messageActionChatAddUser" : c = M ( e . action . user _id == e . from _id ? "conversation_returned_to_group" : "conversation_invited_user_message_raw" ) ; break ; case "messageActionChatDeleteUser" : c = M ( e . action . user _id == e . from _id ? "conversation_left_group" : "conversation_kicked_user_message_raw" ) ; break ; case " messageActionChatJoined
e . put ( "partials/desktop/chat_create_modal.html" , '<div class="md_simple_modal_wrap" my-modal-position>\n\n <div class="md_simple_modal_body">\n\n <form class="modal_simple_form" ng-submit="updateGroup()">\n\n <h4 my-i18n="group_create_modal_title"></h4>\n\n <div class="md-input-group" my-labeled-input>\n <label class="md-input-label" my-i18n="group_create_name"></label>\n <input class="md-input" my-focused type="text" ng-model="group.name" />\n </div>\n\n </form>\n\n </div>\n\n <div class="md_simple_modal_footer">\n <button class="btn btn-md" ng-click="$dismiss()" my-i18n="modal_cancel"></button>\n <button class="btn btn-md btn-md-primary" ng-class="{disabled: group.creating}" ng-click="createGroup()" ng-bind="group.creating ? \'group_create_submit_active\' : \'group_create_submit\' | i18n" ng-disabled="group.creating"></button>\n </div>\n\n</div>' ) , e . put ( "partials/desktop/chat_edit_modal.html" , '<div class="md_simple_modal_wrap" my-modal-position>\n\n <div class="md_simple_modal_body">\n\n <form class="modal_simple_form" ng-submit="updateGroup()">\n\n <h4 my-i18n="group_edit_modal_title"></h4>\n\n <div class="md-input-group" my-labeled-input>\n <label class="md-input-label" my-i18n="group_edit_name"></label>\n <input class="md-input" my-focused type="text" ng-model="group.name" />\n </div>\n\n </form>\n\n </div>\n\n <div class="md_simple_modal_footer">\n <button class="btn btn-md" ng-click="$dismiss()" my-i18n="modal_cancel"></button>\n <button class="btn btn-md btn-md-primary" ng-class="{disabled: group.updating}" ng-click="updateGroup()" ng-bind="group.updating ? \'group_edit_submit_active\' : \'group_edit_submit\' | i18n" ng-disabled="group.updating"></button>\n </div>\n\n</div>' ) , e . put ( "partials/desktop/chat_invite_link_modal.html" , '<div class="md_simple_modal_wrap" my-modal-position>\n\n <div class="md_simple_modal_body">\n\n <div class="modal_simple_form">\n\n <h4 my-i18n="group_invite_link_modal_title"></h4>\n\n <div ng-switch="exportedInvite.canRevoke">\n <div ng-switch-when="true">\n <div class="md-input-group md-textarea-group" my-labeled-input>\n <label class="md-input-label" my-i18n="group_invite_link_link_label"></label>\n <textarea class="md-input" ng-model="exportedInvite.link" rows="2" my-copy-field="\'ui_invite_select\'"></textarea>\n </div>\n </div>\n\n <div ng-switch-default>\n <div class="md-input-group" my-labeled-input>\n <label class="md-input-label" my-i18n="group_invite_link_link_label"></label>\n <input class="md-input" type="text" ng-model="exportedInvite.link" my-copy-field="\'ui_invite_select\'" />\n </div>\n </div>\n\n </div>\n\n </div>\n\n </div>\n\n <div class="md_simple_modal_footer" ng-switch="exportedInvite.canRevoke">\n <div ng-switch-when="true">\n <button class="btn btn-md" ng-click="$dismiss()" my-i18n="modal_cancel"></button>\n <button class="btn btn-md btn-md-primary" ng-class="{disabled: exportedInvite.revoking}" ng-click="revokeLink()" ng-bind="exportedInvite.revoking ? \'group_invite_revoke_active\' : \'group_invite_revoke\' | i18n" ng-disabled="exportedInvite.revoking"></button>\n </div>\n </div>\n\n</div>' ) , e . put ( "partials/desktop/chat_modal.html" , '<div class="chat_modal_wrap md_modal_wrap" my-modal-position>\n\n <div class="md_modal_head">\n <div class="md_modal_title_wrap">\n <div class="md_modal_actions_wrap clearfix">\n <a class="md_modal_action md_modal_action_close" ng-click="$close()" my-i18n="modal_close"></a>\n <a class="md_modal_action" ng-if="chatFull.chat._ != \'chatForbidden\' & amp ; & amp ; ! chatFull . chat . pFlags . left " ng-click=" editTitle ( ) " my-i18n=" modal _edit "></a>\n </div>\n <div class=" md _modal _title " my-i18n=" group _modal _info "></div>\n </div>\n\n <div class=" peer _modal _profile _wrap clearfix ">\n <div class=" peer _modal _photo _wrap pull - left " ng-switch=" photo . updating " > \ n < div ng - s
e . put ( "partials/desktop/error_modal.html" , ' < div class = "error_modal_wrap md_simple_modal_wrap" my - modal - position > \ n \ n < div class = "md_simple_modal_body" > \ n \ n < h4 ng - if = "error" class = "md_simple_header" ng - switch = "error.type" > \ n < span ng - switch - when = "MEDIA_TYPE_NOT_SUPPORTED" my - i18n = "error_modal_media_not_supported_title" > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R N A M E _ N O T _ O C C U P I E D " m y - i 1 8 n = " e r r o r _ m o d a l _ n o t _ f o u n d _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P A S S W O R D _ R E C O V E R Y _ N A " m y - i 1 8 n = " e r r o r _ m o d a l _ r e c o v e r y _ n a _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - d e f a u l t n g - s w i t c h = " e r r o r . c o d e " > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 0 " m y - i 1 8 n = " e r r o r _ m o d a l _ b a d _ r e q u e s t _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 1 " m y - i 1 8 n = " e r r o r _ m o d a l _ u n a u t h o r i z e d _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 3 " m y - i 1 8 n = " e r r o r _ m o d a l _ f o r b i d d e n _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 4 " m y - i 1 8 n = " e r r o r _ m o d a l _ n o t _ f o u n d _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 6 " m y - i 1 8 n = " e r r o r _ m o d a l _ n e t w o r k _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " 4 2 0 " m y - i 1 8 n = " e r r o r _ m o d a l _ f l o o d _ t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - d e f a u l t m y - i 1 8 n = " e r r o r _ m o d a l _ i n t e r n a l _ t i t l e " > < / s p a n > \ n < / s p a n > \ n < / h 4 > \ n < h 4 n g - i f = " ! e r r o r " c l a s s = " m d _ s i m p l e _ h e a d e r " n g - s w i t c h = " t i t l e . l e n g t h > 0 " > \ n < s p a n n g - s w i t c h - w h e n = " t r u e " n g - b i n d = " t i t l e " > < / s p a n > \ n < s p a n n g - s w i t c h - d e f a u l t m y - i 1 8 n = " e r r o r _ m o d a l _ a l e r t " > < / s p a n > \ n < / h 4 > \ n \ n < d i v n g - i f = " e r r o r " c l a s s = " e r r o r _ m o d a l _ d e s c r i p t i o n " n g - s w i t c h = " e r r o r . t y p e " > \ n < s p a n n g - s w i t c h - w h e n = " N E T W O R K _ B A D _ R E Q U E S T " m y - i 1 8 n = " e r r o r _ m o d a l _ n e t w o r k _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " N E T W O R K _ B A D _ R E S P O N S E " m y - i 1 8 n = " e r r o r _ m o d a l _ n e t w o r k _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " F I R S T N A M E _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ f i r s t n a m e _ i n v a l i _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " L A S T N A M E _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ l a s t n a m e _ i n v a l i d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P H O N E _ N U M B E R _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ p h o n e _ i n v a l i d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R S _ T O O _ M U C H " m y - i 1 8 n = " e r r o r _ m o d a l _ u s e r s _ t o o _ m u c h _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P H O T O _ I N V A L I D _ D I M E N S I O N S " m y - i 1 8 n = " e r r o r _ m o d a l _ p h o t o _ d i m e n s i o n s _ i n v a l i d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " V I D E O _ E X T _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ v i d e o _ f i l e _ i n v a l i d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P H O T O _ C R O P _ S I Z E _ S M A L L " m y - i 1 8 n = " e r r o r _ m o d a l _ p h o t o _ t o o _ s m a l l _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R _ N O T _ U S I N G _ T E L E G R A M " m y - i 1 8 n = " e r r o r _ m o d a l _ n o _ p h o n e _ u s e r _ d e s c r i p t i o n _ m d " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R S _ N O T _ U S I N G _ T E L E G R A M " m y - i 1 8 n = " e r r o r _ m o d a l _ n o _ p h o n e _ u s e r s _ d e s c r i p t i o n _ m d " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P H O N E B O O K _ G E T _ C O N T A C T S _ F A I L E D " m y - i 1 8 n = " e r r o r _ m o d a l _ p h o n e b o o k _ r e q u i r e d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R N A M E _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ u s e r n a m e _ i n v a l i d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R N A M E _ O C C U P I E D " m y - i 1 8 n = " e r r o r _ m o d a l _ u s e r n a m e _ o c c u p i e d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " M E D I A _ T Y P E _ N O T _ S U P P O R T E D " m y - i 1 8 n = " e r r o r _ m o d a l _ m e d i a _ n o t _ s u p p o r t e d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R N A M E _ N O T _ O C C U P I E D " m y - i 1 8 n = " e r r o r _ m o d a l _ u s e r n a m e _ n o t _ f o u n d _ d e s c r i p t i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " U S E R _ N O T _ M U T U A L _ C O N T A C T " m y - i 1 8 n = " e r r o r _ m o d a l _ u s e r _ n o t _ m u t u a l _ c o n t a c t " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " I N V I T E _ H A S H _ I N V A L I D " m y - i 1 8 n = " e r r o r _ m o d a l _ i n v i t e _ l i n k _ i n v a l i d " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " I N V I T E _ H A S H _ E X P I R E D " m y - i 1 8 n = " e r r o r _ m o d a l _ i n v i t e _ l i n k _ i n v a l i d " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " I N V I T E _ H A S H _ E M P T Y " m y - i 1 8 n = " e r r o r _ m o d a l _ i n v i t e _ l i n k _ i n v a l i d " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " C H A N N E L _ P R I V A T E " m y - i 1 8 n = " e r r o r _ m o d a l _ c h a n n e l _ n o t _ a c c e s s i b l e " > < / s p a n > \ n < s p a n n g - s w i t c h - w h e n = " P E E R _ F L O O D " m y - i 1 8 n = " e r r o r _ m o d a l _ n o t _ c o n t a c t _ f l o o d " > \ n < m y - i 1 8 n - p a r a m n a m e = " m o r e - i n f o - l i n k " > < a h r e f = " h t t p s : / / t e l e g r a m . o r g / f a q # c a n - 3 9 t - s e n d - m e s s a g e s - t o - n o n - c o n t a c t s " t a r g e t = " _ b l a n k " > { 0 } < / a > < / m y - i 1 8 n - p a r a m > \ n < / s p a n > \ n \ n \ n < d i v n g - s w i t c h - d e f a u l t n g - s w i t c h = " e r r o r . c o d e " > \ n < s p a n n g - s w i t c h - w h e n = " 4 0 0 "
e . put ( "partials/desktop/media_modal_layout.html" , '<div tabindex="-1" role="dialog" class="modal" ng-style="{\'z-index\': 1050 + index*10}" ng-click="close($event)" modal-transclude></div>' ) , e . put ( "partials/desktop/message.html" , '<div class="im_message_outer_wrap" ng-click="toggleMessage(historyMessage.mid, $event)">\n\n\n <div class="im_message_wrap clearfix" ng-switch="::historyMessage._ == \'messageService\'">\n\n <div class="im_service_message_wrap" ng-switch-when="true" ng-switch="historyMessage.action._ == \'messageActionBotIntro\'">\n <div ng-switch-when="true" class="im_bot_intro_message_wrap">\n <div class="im_bot_intro_message_header" my-i18n="message_service_bot_intro_header"></div>\n <div class="im_bot_intro_message" ng-bind-html="::historyMessage.action.rDescription"></div>\n </div>\n <div ng-switch-default class="im_service_message">\n <a class="im_message_author" ng-if="::historyMessage.fromID > 0" my-peer-link="historyMessage.fromID" short="historyMessage.toID > 0" color="historyMessage.toID < 0" no-watch="true"></a>\n <span class="im_message_service" my-service-message></span>\n </div>\n\n <a ng-if="::historyMessage.action._ == \'messageActionChatEditPhoto\' || historyMessage.action._ == \'messageActionChannelEditPhoto\'" class="im_service_message_photo_thumb" href="" ng-click="openPhoto(historyMessage.action.photo.id)">\n <img\n class="im_service_message_photo_thumb"\n my-load-thumb\n thumb="historyMessage.action.photo.thumb"\n />\n </a>\n\n </div>\n\n <div ng-switch-default class="im_content_message_wrap" ng-class="::[historyMessage.out ? \'im_message_out\' : \'im_message_in\', historyMessage.fwdFromID ? \'im_message_fwd\' : \'\']">\n <i class="icon icon-select-tick"></i>\n\n <a class="im_message_error_btn" ng-if="::historyMessage.pending || historyMessage.error || false" ng-click="historyMessage.send()">\n <i class="icon-message-status" tooltip="Try again"></i>\n </a>\n\n <i ng-if="::historyMessage.unread && historyMessage.out || historyMessage.pending || false" class="icon-message-status" ng-class="{\'icon-message-status-unread\': historyMessage.unread, \'icon-message-status-pending\': historyMessage.pending}" ng-show="!historyMessage.error"></i>\n\n <a class="im_message_from_photo pull-left" my-peer-photolink="::historyMessage.fromID" img-class="im_message_from_photo"></a>\n\n <div class="im_message_meta pull-right text-right">\n <i class="icon-message-status-tick"></i>\n <span class="im_message_date" ng-bind="::historyMessage.date | time"></span>\n </div>\n\n <div class="im_message_body" ng-class="::{im_message_body_media: historyMessage._ == \'message\' & amp ; & amp ; historyMessage . media ? true : false } ">\n\n <a class=" im _message _author " my-peer-link=" historyMessage . fromID " short=" historyMessage . toID > 0 " color=" historyMessage . toID < 0 " no-watch=" true "></a>\n\n <a class=" im _message _reply _wrap " my-reply-message=" historyMessage . reply _to _msg " ng-if=" : : historyMessage . reply _to _mid "></a>\n\n <div ng-if=" : : historyMessage . fwdFromID || false " class=" im _message _fwd _from ">\n <a class=" im _message _fwd _photo pull - left " my-peer-photolink=" : : historyMessage . fwdFromID " img-class=" im _message _fwd _photo "></a>\n <div class=" im _message _fwd _author _wrap ">\n <a class=" im _message _fwd _author " my-peer-link=" historyMessage . fwdFromID "></a><span class=" im _message _fwd _date " ng-bind=" : : historyMessage . fwd _date | dateOrTime "></span>\n </div>\n </div>\n\n <div class=" im _message _text " ng-if=" : : historyMessage . message . length || false " my-message-text=" : : historyMessage " dir=" auto "></div>\n\n <div ng-if=" : : historyMessage . media || historyMessage . mid < 0 ? true : false " class=" im _message _media " ng-switch=" historyMessage . media . _ ">\n\n <div ng-switch-when=" messageMediaPhoto " my-message-photo=" historyMessage . media " message-id=" historyMessage . mid " > < / d i v > \ n < d i v n g - s w i t c h -
e . put ( "partials/desktop/reply_message.html" , '<div class="im_message_reply clearfix" ng-class="{im_message_reply_thumbed: thumb != null}" ng-switch="replyMessage.loading">\n <div class="im_message_reply_border"></div>\n <div class="im_message_reply_loading" ng-switch-when="true" my-i18n="im_reply_loading">\n <my-i18n-param name="dots"><span my-loading-dots></span></my-i18n-param>\n </div>\n <div class="im_message_reply_thumb_wrap pull-left" ng-if="thumb != null">\n <img\n class="im_message_reply_thumb"\n my-load-thumb\n thumb="thumb"\n watch="true"\n />\n </div>\n <div class="im_message_reply_author" ng-switch-default>\n <span my-peer-link="replyMessage.fromID" peer-watch="true"></span>\n </div>\n <div class="im_message_reply_body" ng-switch-default>\n <span class="im_reply_message_media" ng-if="replyMessage.media" ng-switch="replyMessage.media._">\n <span ng-switch-when="messageMediaPhoto" my-i18n="conversation_media_photo"></span>\n <span ng-switch-when="messageMediaVideo" my-i18n="conversation_media_video"></span>\n <span ng-switch-when="messageMediaDocument" ng-switch="::replyMessage.media.document.sticker || false">\n <span ng-switch-when="1" my-i18n="conversation_media_sticker"></span>\n <span ng-switch-when="2">\n <span ng-bind-html="replyMessage.media.document.stickerEmoji"></span>\n (<my-i18n msgid="conversation_media_sticker"></my-i18n>)\n </span>\n <span ng-switch-default ng-bind="replyMessage.media.document.file_name"></span>\n </span>\n <span ng-switch-when="messageMediaAudio" my-i18n="conversation_media_audio"></span>\n <span ng-switch-when="messageMediaGeo" my-i18n="conversation_media_location"></span>\n <span ng-switch-when="messageMediaVenue" my-i18n="conversation_media_location"></span>\n <span ng-switch-when="messageMediaContact" my-i18n="conversation_media_contact"></span>\n </span>\n\n <span class="im_reply_message_service" ng-if="replyMessage._ == \'messageService\'" my-service-short-message="replyMessage"></span>\n\n <span class="im_reply_message_text" ng-if="replyMessage.message.length" ng-bind-html="replyMessage.richMessage"></span>\n </div>\n</div>' ) , e . put ( "partials/desktop/sessions_list_modal.html" , ' < div class = "sessions_modal_wrap md_modal_wrap" my - modal - position > \ n \ n < div class = "md_modal_head md_modal_head_simple" > \ n < div class = "md_modal_title_wrap" > \ n < div class = "md_modal_actions_wrap clearfix" > \ n < a class = "md_modal_action md_modal_action_close" ng - click = "$dismiss()" my - i18n = "modal_close" > < / a > \ n < / d i v > \ n < / d i v > \ n < d i v c l a s s = " m d _ m o d a l _ t i t l e " m y - i 1 8 n = " s e s s i o n s _ m o d a l _ t i t l e " > < / d i v > \ n < / d i v > \ n \ n < d i v c l a s s = " m d _ m o d a l _ b o d y " > \ n \ n < d i v m y - s e s s i o n s - l i s t c l a s s = " s e s s i o n s _ m o d a l _ c o l " > \ n \ n < d i v c l a s s = " s e s s i o n s _ w r a p n a n o " m y - i n f i n i t e - s c r o l l e r > \ n < d i v c l a s s = " s e s s i o n s _ s c r o l l a b l e _ w r a p n a n o - c o n t e n t " n g - s w i t c h = " ! s e s s i o n s L o a d e d " > \ n \ n < d i v n g - s w i t c h - w h e n = " t r u e " c l a s s = " s e s s i o n s _ m o d a l _ l o a d i n g " m y - v e r t i c a l - p o s i t i o n = " 0 . 2 " p a d d i n g = " t r u e " m y - i 1 8 n = " s e s s i o n s _ m o d a l _ l o a d i n g " > \ n < m y - i 1 8 n - p a r a m n a m e = " d o t s " > \ n < s p a n m y - l o a d i n g - d o t s > < / s p a n > \ n < / m y - i 1 8 n - p a r a m > \ n < / d i v > \ n \ n < u l n g - s w i t c h - d e f a u l t c l a s s = " s e s s i o n s _ m o d a l _ s e s s i o n s _ l i s t n a v n a v - p i l l s n a v - s t a c k e d " > \ n \ n < l i c l a s s = " s e s s i o n s _ m o d a l _ s e s s i o n _ w r a p c l e a r f i x " n g - r e p e a t = " a u t h o r i z a t i o n i n a u t h o r i z a t i o n s | l i m i t T o : s l i c e . l i m i t t r a c k b y a u t h o r i z a t i o n . h a s h " > \ n < d i v c l a s s = " s e s s i o n s _ m o d a l _ s e s s i o n " > \ n < d i v c l a s s = " s e s s i o n _ m e t a _ w r a p p u l l - r i g h t " > \ n < d i v c l a s s = " s e s s i o n _ a c t i v e _ d a t e " n g - s w i t c h = " a u t h o r i z a t i o n . c u r r e n t " > \ n < s p a n n g - s w i t c h - w h e n = " t r u e " c l a s s = " s e s s i o n _ a c t i v e _ d a t e _ o n l i n e " m y - i 1 8 n = " s e s s i o n s _ m o d a l _ c u r r e n t _ s e s s i o n " > < / s p a n > \ n < s p a n n g - s w i t c h - d e f a u l t n g - b i n d = " a u t h o r i z a t i o n . d a t e _ a c t i v e | d a t e O r T i m e " > < / s p a n > \ n < / d i v > \ n \ n < a n g - i f = " ! a u t h o r i z a t i o n . c u r r e n t " c l a s s = " s e s s i o n _ t e r m i n a t e _ b t n " n g - c l i c k = " t e r m i n a t e S e s s i o n ( a u t h o r i z a t i o n .
e . put ( "partials/mobile/channel_modal.html" , '<div class="chat_modal_wrap">\n\n <div class="tg_page_head tg_modal_head">\n <div class="navbar navbar-static-top navbar-inverse">\n <div class="container">\n\n <div class="navbar-toggle-wrap dropdown" dropdown ng-if="chatFull.chat.pFlags.creator || !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked">\n <a class="dropdown-toggle navbar-toggle" dropdown-toggle>\n <span class="icon-bar"></span>\n <span class="icon-bar"></span>\n <span class="icon-bar"></span>\n </a>\n <ul class="dropdown-menu">\n <li ng-if="chatFull.chat.pFlags.creator">\n <a ng-click="deletePhoto()" my-i18n="group_modal_menu_delete_photo"></a>\n </li>\n <li ng-if="chatFull.chat.pFlags.creator">\n <a ng-click="editChannel()" my-i18n="modal_edit"></a>\n </li>\n <li ng-if="chatFull.chat.pFlags.creator">\n <a ng-click="deleteChannel()" my-i18n="channel_modal_delete_channel"></a>\n </li>\n <li ng-if="!chatFull.chat.pFlags.creator && !chatFull.chat.pFlags.left && !chatFull.chat.pFlags.kicked">\n <a ng-click="leaveChannel()" my-i18n="channel_modal_leave_channel"></a>\n </li>\n </ul>\n </div>\n\n <div class="navbar-header">\n\n <ul class="nav navbar-nav navbar-quick-nav">\n <li>\n <a ng-click="$close()" class="navbar-quick-media-back">\n <i class="icon icon-back"></i>\n <div class="navbar-quick-back-title">\n <h4 my-i18n="channel_modal_info"></h4>\n </div>\n </a>\n </li>\n </ul>\n\n </div>\n\n </div>\n </div>\n </div>\n\n <div class="modal-body mobile_modal_body">\n\n <div class="mobile_user_modal_photo_profile_wrap">\n\n <a ng-click="openPhoto(chatFull.chat_photo.id, {p: -chatFull.chat.id})" class="mobile_user_modal_image_wrap pull-left" my-peer-photolink="::-chatFull.chat.id" img-class="mobile_user_modal_image mobile_chat_modal_image" no-open="true" watch="true" ng-class="{disabled: !chatFull.chat.photo.photo_small}" ng-disabled="!chatFull.chat.photo.photo_small"></a>\n\n <div class="mobile_user_modal_info_wrap clearfix">\n <h4 class="mobile_user_modal_header" my-peer-link="-chatFull.chat.id" verified="true"></h4>\n <p class="mobile_user_modal_status" ng-if="chatFull.participants_count > 0">\n <ng-pluralize count="chatFull.participants_count"\n when="group_modal_pluralize_participants">\n </ng-pluralize>\n </p>\n </div>\n\n </div>\n\n <div class="mobile_modal_section" ng-if="chatFull.rAbout">\n <h4 class="mobile_modal_section_header" my-i18n="channel_modal_description"></h4>\n <div class="mobile_modal_section_value" ng-bind-html="chatFull.rAbout"></div>\n </div>\n\n <div class="mobile_modal_section" ng-if="chatFull.chat.username || chatFull.chat.pFlags.creator">\n <h4 class="mobile_modal_section_header" my-i18n="channel_modal_share_link"></h4>\n <div class="mobile_modal_section_value" ng-switch="chatFull.chat.username.length > 0">\n <a ng-switch-when="true" class="settings_modal_username_link" ng-click="shareLink($event)" ng-bind="\'https://telegram.me/\' + chatFull . chat . username " ng-href=" https : //telegram.me/{{chatFull.chat.username}}" target="_blank"></a>\n <a ng-switch-default ng-click="shareLink($event)" ng-bind="chatFull.exported_invite.link" ng-href="{{chatFull.exported_invite.link}}" target="_blank"></a>\n </div>\n </div>\n\n <div class="mobile_modal_action_wrap" ng-if="chatFull.chat.pFlags.creator">\n <a class="mobile_modal_action" ng-click="inviteToChannel()" my-i18n="channel_modal_add_member"></a>\n </div>\n\n <div class="mobile_modal_action_wrap" ng-if="chatFull.chat.pFlags.left">\n <a class="mobile_modal_action" ng-click="joinChannel()" my-i18n="channel_modal_join"
e . put ( "partials/mobile/im.html" , '<div my-head></div>\n\n<div class="im_page_wrap" ng-class="{im_page_peer_not_selected: !curDialog.peer}">\n\n <div class="im_page_split clearfix">\n\n <div ng-controller="AppImDialogsController" my-dialogs has-tabs="{{search.query.length > 0}}" class="im_dialogs_col_wrap" ng-class="search.query.length > 0 ? \'im_dialogs_col_search\' : \'\'">\n <div class="im_dialogs_panel">\n <div class="im_dialogs_search">\n <input class="form-control im_dialogs_search_field no_outline" type="search" placeholder="{{\'modal_search\' | i18n}}" ng-model="search.query"/>\n <a class="im_dialogs_search_clear tg_search_clear" ng-click="searchClear()" ng-show="search.query.length">\n <i class="icon icon-search-clear"></i>\n </a>\n </div>\n </div>\n\n <div my-dialogs-list-mobile class="im_dialogs_col im_dialogs_scrollable_wrap mobile_scrollable_wrap">\n\n <div class="im_dialogs_empty_wrap" ng-if="isEmpty.contacts" my-vertical-position="0.4">\n <h3 class="im_dialogs_empty_header" my-i18n="im_no_contacts"></h3>\n <p class="im_dialogs_empty_lead" my-i18n="im_get_started_long"></p>\n <button type="button" class="btn btn-primary btn-block im_dialogs_add_contact" ng-click="importContact()" my-i18n="im_add_contact"></button>\n <button ng-if="phonebookAvailable" type="button" class="btn btn-primary btn-block im_dialogs_import_phonebook" ng-click="importPhonebook()" my-i18n="im_import_phonebook"></button>\n </div>\n\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" my-dialog dialog-message="dialogMessage" ng-repeat="dialogMessage in dialogs track by dialogMessage.peerID" ng-class="{active: curDialog.peerID == dialogMessage.peerID}"></li>\n </ul>\n\n <div class="im_dialogs_contacts_wrap" ng-show="contacts.length > 0">\n <h5 my-i18n="im_contacts_title"></h5>\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" ng-repeat="contact in contacts | orderBy:\'user.sortName\' track by contact.userID" ng-class="{active: curDialog.peerID == contact.userID}">\n <a class="im_dialog" ng-mousedown="dialogSelect(contact.peerString)">\n <div class="im_dialog_photo pull-left" my-peer-photolink="contact.userID" img-class="im_dialog_photo" watch="true"></div>\n <div class="im_dialog_message_wrap">\n <div class="im_dialog_peer">\n <span class="im_dialog_user" my-peer-link="contact.userID"></span>\n </div>\n <div class="im_dialog_message">\n <span class="im_dialog_message_text" my-user-status="::contact.userID"></span>\n </div>\n </div>\n </a>\n </li>\n </ul>\n </div>\n\n <div class="im_dialogs_contacts_wrap" ng-show="foundPeers.length > 0">\n <h5 my-i18n="im_found_title"></h5>\n <ul class="nav nav-pills nav-stacked">\n <li class="im_dialog_wrap" ng-repeat="foundPeer in foundPeers track by foundPeer.id" ng-class="{active: curDialog.peerID == foundPeer.id}">\n <a class="im_dialog" ng-mousedown="dialogSelect(foundPeer.peerString)">\n <div class="im_dialog_photo pull-left" my-peer-photolink="foundPeer.id" img-class="im_dialog_photo" watch="true"></div>\n <div class="im_dialog_message_wrap">\n <div class="im_dialog_peer">\n <span class="im_dialog_user" my-peer-link="foundPeer.id"></span>\n </div>\n <div class="im_dialog_message">\n <span class="im_dialog_message_text" ng-bind="::\'@\' + foundPeer . username "></span>\n </div>\n </div>\n </a>\n </li>\n </ul>\n </div>\n\n <div class=" im _dialogs _messages _wrap " ng-show=" foundMessages . length > 0 ">\n <h5 my-i18n=" im _messages " > < / h 5 > \ n
e . put ( "partials/mobile/message_attach_pending.html" , '<div class="im_message_document im_message_upload_file" ng-class="::\'im_message_upload_\' + historyMessage.media.type">\n <i class="icon" ng-class="::\'icon-\' + historyMessage.media.type"></i>\n <div class="im_message_document_info">\n <div class="im_message_document_name_wrap">\n <span class="im_message_document_name" ng-bind="::historyMessage.media.file_name"></span>\n <span class="im_message_document_size" ng-if="historyMessage.media.progress" ng-bind="historyMessage.media.progress | formatSizeProgress"></span>\n </div>\n <div class="clearfix im_message_cancelable_progress_wrap">\n <a class="im_message_media_progress_cancel pull-right" ng-click="historyMessage.media.progress.cancel()" my-i18n="modal_cancel"></a>\n <div class="im_message_download_progress_wrap">\n <div class="progress tg_down_progress">\n <div class="progress-bar progress-bar-success" role="progressbar" ng-style="{width: historyMessage.media.progress.percent + \'%\'}"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n' ) , e . put ( "partials/mobile/message_attach_photo.html" , '<a class="im_message_photo_thumb" ng-click="openPhoto(media.photo.id, {m: messageId})" ng-style="::{width: media.photo.thumb.width + \'px\'}" ng-mouseover="preloadPhoto(media.photo.id)">\n <img\n class="im_message_photo_thumb"\n my-load-thumb\n thumb="media.photo.thumb"\n />\n</a>\n<div ng-if="::media.rCaption" class="im_message_photo_caption" ng-bind-html="::media.rCaption"></div>' ) , e . put ( "partials/mobile/message_attach_venue.html" , '<div class="im_message_venue clearfix">\n\n <a ng-href="{{::venue.mapUrl}}" target="_blank" class="im_message_venue_geopoint_wrap">\n <i class="icon icon-geo-point"></i>\n <img\n class="im_message_venue_geopoint_image"\n my-geo-point-map="venue.geo"\n width="100"\n height="100"\n />\n </a>\n\n <div class="im_message_venue_info">\n <div class="im_message_venue_title_wrap">\n <a ng-href="{{::venue.mapUrl}}" target="_blank" class="im_message_document_name" ng-bind="::venue.title"></a>\n </div>\n <div class="im_message_venue_address" ng-bind="::venue.address"></div>\n </div>\n\n</div>\n' ) , e . put ( "partials/mobile/message_attach_video.html" , '<div class="im_message_video im_message_document_thumbed">\n <a class="im_message_video_thumb" href="" ng-click="videoOpen()" ng-style="::{width: media.video.thumb.width + \'px\'}">\n <span class="im_message_video_duration" ng-bind="::media.video.duration | duration"></span>\n <i class="icon icon-videoplay"></i>\n <img\n class="im_message_video_thumb im_message_video_thumb_blurred"\n my-load-thumb\n thumb="media.video.thumb"\n />\n </a>\n</div>\n<div ng-if="::media.rCaption" class="im_message_video_caption" ng-bind-html="::media.rCaption"></div>' ) , e . put ( "partials/mobile/message_attach_webpage.html" , '<div ng-show="webpage._ == \'webPage\'" class="im_message_webpage_wrap clearfix" ng-switch="webpage.type">\n <div ng-switch-when="photo" class="im_message_webpage_photo">\n <div class="im_message_webpage_site" ng-bind="webpage.site_name || webpage.display_url"></div>\n <div class="im_message_webpage_title">\n <a href="{{webpage.url}}" target="_blank" ng-bind-html="webpage.rTitle"></a>\n </div>\n <div ng-if="webpage.description.length" class="im_message_webpage_description" ng-bind-html="webpage.rDescription"></div>\n <a class="im_message_photo_thumb" ng-click="openPhoto(webpage.photo.id, {w: webpage.id, m: messageId})" ng-style="::{width: webpage.photo.thumb.width + \'px\' } " ng-mouseover=" preloadPhoto ( webpage . photo . id ) ">\n <img\n class=" im _message _photo _thumb "\n my-load-thumb\n thumb=" webpage . photo . thumb "\n />\n </a>\n </div>\n <div ng-switch-when=" video " class=" im _message _webpage _video ">\n <div class=" im _message _webpage _site " ng-bind=" webpage . site _name || webpage . display _url "></div>\n <div class=" im _message _webpage _title ">\n <a ng-click=" openEmbed ( $event ) " hre
e . put ( "partials/mobile/stickerset_modal.html" , '<div class="stickerset_modal_wrap">\n\n <div class="tg_page_head tg_modal_head">\n <div class="navbar navbar-static-top navbar-inverse">\n <div class="container">\n\n <div class="navbar-header">\n\n <ul class="nav navbar-nav navbar-quick-nav">\n <li class="navbar-quick-right" ng-if="stickersetLoaded" ng-switch="stickersetInstalled">\n <a ng-switch-when="true" my-i18n="stickerset_modal_uninstall" ng-click="toggleInstalled(false)"></a>\n <a ng-switch-when="false" my-i18n="stickerset_modal_install" ng-click="toggleInstalled(true)"></a>\n </li>\n <li>\n <a ng-click="$dismiss()" class="navbar-quick-media-back">\n <i class="icon icon-back"></i>\n <div class="navbar-quick-back-title">\n <h4 ng-switch="!stickersetLoaded">\n <span ng-switch-when="true" my-i18n="stickerset_modal_title_loading"></span>\n <span ng-switch-default ng-bind="stickerset.title"></span>\n </h4>\n </div>\n </a>\n </li>\n </ul>\n\n </div>\n\n </div>\n </div>\n </div>\n\n <div class="modal-body">\n\n <div my-stickers-list class="stickerset_modal_col">\n\n <div class="stickerset_wrap nano" my-infinite-scroller>\n <div class="stickerset_scrollable_wrap nano-content" ng-switch="!stickersetLoaded">\n\n <div ng-switch-when="true" class="stickerset_modal_loading" my-vertical-position="0.2" padding="true" my-i18n="stickerset_modal_loading">\n <my-i18n-param name="dots">\n <span my-loading-dots></span>\n </my-i18n-param>\n </div>\n\n <div ng-switch-default class="stickerset_modal_stickers_list clearfix">\n <div class="stickerset_modal_sticker_wrap" ng-repeat="sticker in documents | limitTo: slice.limit">\n <div class="stickerset_modal_sticker" my-load-sticker document="sticker" thumb="true"></div>\n <div class="stickerset_modal_sticker_alt" ng-bind-html="sticker.stickerEmoji"></div>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div>' ) , e . put ( "partials/mobile/user_modal.html" , ' < div class = "mobile_user_modal_wrap" > \ n \ n < div class = "tg_page_head tg_modal_head" > \ n < div class = "navbar navbar-static-top navbar-inverse" > \ n < div class = "container" > \ n \ n < div class = "navbar-toggle-wrap dropdown" dropdown > \ n < a class = "dropdown-toggle navbar-toggle" dropdown - toggle > \ n < span class = "icon-bar" > < / s p a n > \ n < s p a n c l a s s = " i c o n - b a r " > < / s p a n > \ n < s p a n c l a s s = " i c o n - b a r " > < / s p a n > \ n < / a > \ n < u l c l a s s = " d r o p d o w n - m e n u " > \ n < l i n g - i f = " u s e r . p F l a g s . c o n t a c t " > \ n < a n g - c l i c k = " i m p o r t C o n t a c t ( t r u e ) " m y - i 1 8 n = " u s e r _ m o d a l _ e d i t _ c o n t a c t " > < / a > \ n < / l i > \ n < l i n g - i f = " u s e r . p F l a g s . c o n t a c t " > \ n < a n g - c l i c k = " d e l e t e C o n t a c t ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ d e l e t e _ c o n t a c t " > < / a > \ n < / l i > \ n < l i n g - i f = " u s e r . p h o n e . l e n g t h > 0 & a m p ; & a m p ; ! u s e r . p F l a g s . c o n t a c t & a m p ; & a m p ; ! u s e r . p F l a g s . s e l f " > \ n < a n g - c l i c k = " i m p o r t C o n t a c t ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ a d d _ c o n t a c t " > < / a > \ n < / l i > \ n < l i > \ n < a n g - c l i c k = " f l u s h H i s t o r y ( ) " m y - i 1 8 n = " u s e r _ m o d a l _ d e l e t e _ c h a t " > < / a > \ n < / l i > \ n < / u l > \ n < / d i v > \ n \ n < d i v c l a s s = " n a v b a r - h e a d e r " > \ n \ n < u l c l a s s = " n a v n a v b a r - n a v n a v b a r - q u i c k - n a v " > \ n < l i > \ n < a n g - c l i c k = " $ c l o s e ( ) " c l a s s = " n a v b a r - q u i c k - m e d i a - b a c k " > \ n < i c l a s s = " i c o n i c o n - b a c k " > < / i > \ n < d i v c l a s s = " n a v b a r - q u i c k - b a c k - t i t l e " > \ n < h 4 m y - i 1 8 n = " u s e r _ m o d a l _ c o n t a c t _ i n f o " > < / h 4 > \ n < / d i v > \ n < / a > \ n < / l i > \ n < / u l > \ n \ n < / d i v > \ n \ n < / d i v > \ n < / d i v > \ n < / d i v > \ n \ n < d i v c l a s s = " m o d a l - b o d y m o b i l e _ m o d a l _ b o d y " > \ n \ n < d i v c l a s s = " m o b i l e _ u s e r _ m o d a l _ p h o t o _ p r o f i l e _ w r a p " > \ n \ n
this . textareaEl . val ( getRichValue ( this . richTextareaEl [ 0 ] ) ) . trigger ( "change" ) ) } , MessageComposer . prototype . getEmojiHtml = function ( e , t ) { t = t || EmojiHelper . emojis [ e ] ; var n = 20 , i = EmojiHelper . spritesheetPositions [ e ] , a = i [ 0 ] , o = ( i [ 1 ] , n * i [ 3 ] ) , s = n * i [ 2 ] ; return '<img src="img/blank.gif" alt=":' + encodeEntities ( t [ 1 ] ) + ':" data-code="' + encodeEntities ( e ) + '" class="emoji emoji-w20 emoji-spritesheet-' + a + '" style="background-position: -' + o + "px -" + s + 'px;" onresizestart="return false" />' } , MessageComposer . prototype . setValue = function ( e ) { this . richTextareaEl ? ( this . richTextareaEl . html ( this . getRichHtml ( e ) ) , this . lastLength = e . length , this . wasEmpty = ! e . length , this . onKeyEvent ( { type : "keyup" } ) ) : this . textareaEl . val ( e ) } , MessageComposer . prototype . setFocusedValue = function ( e ) { var t = e [ 0 ] , n = e [ 1 ] , i = e [ 2 ] ; if ( this . richTextareaEl ) { this . selId = ( this . selId || 0 ) + 1 ; var a = this . getRichHtml ( t ) + '<span id="composer_sel' + this . selId + '">' + this . getRichHtml ( n ) + "</span>" + this . getRichHtml ( i ) ; this . richTextareaEl . html ( a ) , setRichFocus ( this . richTextareaEl [ 0 ] , $ ( "#composer_sel" + this . selId ) [ 0 ] , ! 0 ) } else this . textareaEl . val ( t + n + i ) , setFieldSelection ( this . textareaEl [ 0 ] , t . length , t . length + n . length ) } , MessageComposer . prototype . getRichHtml = function ( e ) { return $ ( "<div>" ) . text ( e ) . html ( ) . replace ( /\n/g , "<br/>" ) . replace ( /:([A-Za-z0-9\-\+\*_]+?):/gi , function ( e , t ) { var n = EmojiHelper . shortcuts [ t ] ; return void 0 !== n ? this . getEmojiHtml ( n ) : e } . bind ( this ) ) } , MessageComposer . prototype . focus = function ( ) { this . richTextareaEl ? setZeroTimeout ( function ( ) { setRichFocus ( this . richTextareaEl [ 0 ] ) } . bind ( this ) ) : setFieldSelection ( this . textareaEl [ 0 ] ) } , MessageComposer . prototype . blur = function ( ) { this . richTextareaEl ? this . richTextareaEl [ 0 ] . blur ( ) : this . textareaEl [ 0 ] . blur ( ) } , MessageComposer . prototype . renderSuggestions = function ( e ) { this . autoCompleteEl . html ( e . join ( "" ) ) , this . autoCompleteWrapEl . show ( ) , this . scroller . reinit ( ) , this . updatePosition ( ) , this . autocompleteShown = ! 0 } , MessageComposer . prototype . showEmojiSuggestions = function ( e ) { var t , n , i , a , o , s , r , l , c = [ ] , d = Config . Mobile ? 26 : 20 , u = Math . min ( 5 , e . length ) ; for ( s = 0 ; u > s ; s ++ ) t = e [ s ] , t . code && ( t = t . code ) , ( n = Config . Emoji [ t ] ) && ( i = EmojiHelper . spritesheetPositions [ t ] , o = i [ 0 ] , a = i [ 1 ] , r = d * i [ 3 ] , l = d * i [ 2 ] , c . push ( '<li><a class="composer_emoji_option" data-code="' + encodeEntities ( t ) + '"><i class="emoji emoji-w' , d , " emoji-spritesheet-" + o + '" style="background-position: -' + r + "px -" + l + 'px;"></i><span class="composer_emoji_shortcut">:' + encodeEntities ( n [ 1 ] [ 0 ] ) + ":</span></a></li>" ) ) ; this . renderSuggestions ( c ) } , MessageComposer . prototype . showMentionSuggestions = function ( e ) { var t , n , i = [ ] , a = e . length ; for ( n = 0 ; a > n ; n ++ ) t = e [ n ] , i . push ( '<li><a class="composer_mention_option" data-mention="' + t . username + '"><span class="composer_user_photo" data-user-id="' + t . id + '"></span><span class="composer_user_name">' + t . rFullName + '</span><span class="composer_user_mention">@' + t . username + "</span></a></li>" ) ; this . renderSuggestions ( i ) ; var o = this ; this . autoCompleteEl . find ( ".composer_user_photo" ) . each ( function ( e , t ) { o . getPeerImage ( $ ( t ) , t . getAttribute ( "data-user-id" ) ) } ) } , MessageComposer . prototype . showCommandsSuggestions = function ( e ) { var t , n , i = [ ] , a = Math . min ( 200 , e . length ) ; for ( n = 0 ; a > n ; n ++ ) t = e [ n ] , i . push ( '<li><a class="composer_command_option" data-command="' + encodeEntities ( t . value ) + '"><span class="composer_user_photo" data-user-id="' + t . botID + '"></span><span class="composer_command_value">' + encodeEntities ( t . value ) + '</span><span class="composer_command_desc">' + t . rDescription + "</span></a></li>" ) ; this . renderSuggestions ( i ) ; var o = this , s = { } ; this . autoCompleteEl . find ( ".composer_user_photo" ) . each ( function ( e , t ) { var n = ! 0 , i = t . getAttribute ( "data-user-id" ) ; s [ i ] || ( s [ i ] = ! 0 , n = ! 1 ) , o . getPeerImage ( $ ( t ) , i , n ) } ) } , MessageComposer . prototype . updatePosition = function ( ) { var e = ( this . richTextareaEl || this . textareaEl ) . offset ( ) , t = this . scroller . updateHeight ( ) , n = $ ( ( this . richTextareaEl || this . textareaEl ) [ 0 ] . parentNode ) . outerWidth ( ) ; this . autoCompleteWrapEl . css ( { top : e . top - t , left : Config . Mobile ? 0 : e . left , width : Config . Mobile ? "100%" : n - 2 } ) , this . scroller . update ( ) } , MessageComposer . prototype . hideSuggestions = function ( ) { this . autoCompleteWrapEl . hide ( ) , delete this . autocompleteShown } , MessageComposer . prototype . resetTyping = function ( ) { this
if ( ! a || a . empty ) return i . attr ( "src" , n . thumb && n . thumb . placeholder || "img/blank.gif" ) , void l ( ) ; var r = e . getCachedFile ( a ) ; return r ? ( i . attr ( "src" , t . getUrl ( r , "image/jpeg" ) ) , void l ( ) ) : ( i . attr ( "src" ) || i . attr ( "src" , n . thumb . placeholder || "img/blank.gif" ) , void e . downloadSmallFile ( n . thumb . location ) . then ( function ( e ) { s == o && ( i . attr ( "src" , t . getUrl ( e , "image/jpeg" ) ) , l ( ) ) } , function ( e ) { console . log ( "Download image failed" , e , n . thumb . location , i [ 0 ] ) , s == o && ( i . attr ( "src" , n . thumb . placeholder || "img/blank.gif" ) , l ( ) ) } ) ) } ) , l = a . watch ? angular . noop : function ( ) { setTimeout ( function ( ) { n . $destroy ( ) , r ( ) } , 0 ) } } return { link : n , scope : { thumb : "=" } } } ] ) . directive ( "myLoadFullPhoto" , [ "MtpApiFileManager" , "FileManager" , "_" , function ( e , t , n ) { function i ( i , a , o ) { var s = $ ( "img" , a ) [ 0 ] , r = $ ( ".img_fullsize_with_progress_wrap" , a ) . add ( ".img_fullsize_progress_wrap" , a ) . add ( $ ( s ) ) , l = function ( ) { r . css ( { width : i . fullPhoto . width , height : i . fullPhoto . height } ) , i . $emit ( "ui_height" , ! 0 ) } , c = 0 ; i . $watchCollection ( "fullPhoto.location" , function ( ) { var a = e . getCachedFile ( i . thumbLocation ) , o = ++ c ; if ( a ? ( s . src = t . getUrl ( a , "image/jpeg" ) , l ( ) ) : s . src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" , i . fullPhoto . location ) { var r ; if ( i . fullPhoto . size ) { var d = { _ : "inputFileLocation" , volume _id : i . fullPhoto . location . volume _id , local _id : i . fullPhoto . location . local _id , secret : i . fullPhoto . location . secret } ; r = e . downloadFile ( i . fullPhoto . location . dc _id , d , i . fullPhoto . size ) } else r = e . downloadSmallFile ( i . fullPhoto . location ) ; i . progress = { enabled : ! 0 , percent : 0 } , r . then ( function ( e ) { o == c && ( i . progress . enabled = ! 1 , s . src = t . getUrl ( e , "image/jpeg" ) , l ( ) ) } , function ( e ) { console . log ( "Download image failed" , e , i . fullPhoto . location ) , i . progress . enabled = ! 1 , i . error = e && "FS_BROWSER_UNSUPPORTED" == e . type ? { html : n ( "error_browser_no_local_file_system_image_md" , { "moz-link" : '<a href="{0}" target="_blank">{1}</a>' , "chrome-link" : '<a href="{0}" target="_blank">{1}</a>' , "telegram-link" : '<a href="{0}" target="_blank">{1}</a>' } ) } : { text : n ( "error_image_download_failed" ) , error : e } } , function ( e ) { i . progress . percent = Math . max ( 1 , Math . floor ( 100 * e . done / e . total ) ) } ) } } ) , l ( ) } return { link : i , transclude : ! 0 , templateUrl : templateUrl ( "full_photo" ) , scope : { fullPhoto : "=" , thumbLocation : "=" } } } ] ) . directive ( "myLoadVideo" , [ "$sce" , "AppVideoManager" , "ErrorService" , "_" , function ( e , t , n , i ) { function a ( e , a , o ) { var s = t . downloadVideo ( e . video . id ) ; s . then ( function ( ) { e . $emit ( "ui_height" ) , onContentLoaded ( function ( ) { var e = $ ( "video" , a ) [ 0 ] ; if ( e ) { var t = ! 1 , i = function ( e ) { t || e . target && e . target . error && e . target . error . code != e . target . error . MEDIA _ERR _DECODE && e . target . error . code != e . target . error . MEDIA _ERR _SRC _NOT _SUPPORTED || ( t = ! 0 , n . show ( { error : { type : "MEDIA_TYPE_NOT_SUPPORTED" , originalError : e . target && e . target . error } } ) ) } ; e . addEventListener ( "error" , i , ! 0 ) , $ ( e ) . on ( "$destroy" , function ( ) { t = ! 0 , e . removeEventListener ( "error" , i ) } ) } } ) } , function ( t ) { console . log ( "Download video failed" , t , e . video ) , e . error = t && "FS_BROWSER_UNSUPPORTED" == t . type ? { html : i ( "error_browser_no_local_file_system_video_md" , { "moz-link" : '<a href="{0}" target="_blank">{1}</a>' , "chrome-link" : '<a href="{0}" target="_blank">{1}</a>' , "telegram-link" : '<a href="{0}" target="_blank">{1}</a>' } ) } : { text : i ( "error_video_download_failed" ) , error : t } } ) , e . $emit ( "ui_height" ) , e . $on ( "$destroy" , function ( ) { s . cancel ( ) } ) } return { link : a , transclude : ! 0 , templateUrl : templateUrl ( "full_video" ) , scope : { video : "=" } } } ] ) . directive ( "myLoadGif" , [ "AppDocsManager" , function ( e ) { function t ( t , n , i ) { var a = ! 1 ; t . isActive = ! 1 , t . toggle = function ( n ) { return checkClick ( n , ! 0 ) ? ( e . saveDocFile ( t . document . id ) , ! 1 ) : t . document . url ? void onContentLoaded ( function ( ) { t . isActive = ! t . isActive , t . $emit ( "ui_height" ) } ) : a ? ( a . cancel ( ) , void ( a = ! 1 ) ) : ( a = e . downloadDoc ( t . document . id ) , void a . then ( function ( ) { t . isActive = ! 0 , t . $emit ( "ui_height" ) } ) ) } } return { link : t , templateUrl : templateUrl ( "full_gif" ) , scope : { document : "=" } } } ] ) . directive ( "myLoadSticker" , [ "MtpApiFileManager" , "FileManager" , "AppStickersManager" , function ( e , t , n ) { function i ( i , o , s ) { var r = $ ( "<img />" ) . addClass ( s . imgClass ) , l = ! 1 ; s . open && i . document . stickerSetInput && o . addClass ( "clickable" ) . on ( "click" , function ( ) { n . openStickerset ( i . document . stickerSetInput ) } ) ; var c = function ( e ) { r . attr ( "src" , t . getUrl ( e ) ) , l